diff --git a/src/modules/butterflies/CMakeLists.txt b/src/modules/butterflies/CMakeLists.txt
index 1da70b3a9b656fe6cdfa876683a0a2ef8de8cc00..b74426a554c7935df7c46671dbcc7f4ee05a5107 100644
--- a/src/modules/butterflies/CMakeLists.txt
+++ b/src/modules/butterflies/CMakeLists.txt
@@ -1,4 +1,4 @@
-add_library(cats-butterflies SHARED "" butterflies_actions.c butterflies_actions.h butterflies_vital_rates.c butterflies_vital_rates.h module.h butterflies_dispersal.c butterflies_dispersal.h butterflies_populations.c butterflies_populations.h butterflies_inline.h butterflies_generations.c butterflies_generations.h)
+add_library(cats-butterflies SHARED "" butterflies_actions.c butterflies_actions.h butterflies_vital_rates.c butterflies_vital_rates.h module.h butterflies_dispersal.c butterflies_dispersal.h butterflies_populations.c butterflies_populations.h butterflies_inline.h butterflies_generations.c butterflies_generations.h butterflies_stats.c)
 
 target_include_directories(cats-butterflies PUBLIC ".")
 
diff --git a/src/modules/butterflies/butterflies_actions.c b/src/modules/butterflies/butterflies_actions.c
index 4f62f6c2af0717ae84c6b3db91e70f3f6d2f26ac..882a9593b611499e814a300de07610f60e3efe21 100644
--- a/src/modules/butterflies/butterflies_actions.c
+++ b/src/modules/butterflies/butterflies_actions.c
@@ -18,6 +18,17 @@
 #include "butterflies_generations.h"
 
 
+inline void increase_custom_stat(struct statistics stats, int64_t stat_id, int64_t by)
+{
+
+}
+
+
+inline void ensure_valid_stat_id(struct statistics stats, int64_t stat_id)
+{
+
+}
+
 enum action_status action_butterfly_stats_reset(struct cats_grid *grid, struct cats_configuration *conf)
 {
         return ACTION_RUN;
@@ -44,6 +55,7 @@ void grid_butterflies_maturation(struct cats_grid *grid, struct cats_thread_info
                         }
                         butterflies_cell_maturation(grid, ts, row, col, false);
 
+
                 }
         }
 
@@ -168,6 +180,22 @@ enum action_status action_butterflies_output(struct cats_grid *grid, struct cats
 
 enum action_status action_butterfly_stats_gather(struct cats_grid *grid, struct cats_configuration *conf)
 {
+        struct conf_data_butterflies *module_conf = CATS_MODULE_DATA;
+        int64_t excluded_id = module_conf->stat_ids[BF_STAT_EXCLUDED];
+
+        const cats_dt_coord rows = grid->dimension.rows;
+        const cats_dt_coord cols = grid->dimension.cols;
+        for (cats_dt_coord row = 0; row < rows; row++) {
+                for (cats_dt_coord col = 0; col < cols; col++) {
+                        if (cell_excluded_by_overlay(conf, row, col)) {
+                                increase_custom_stat(grid->stats, excluded_id, 1);
+                                continue;
+                        }
+
+
+
+                }
+        }
         return ACTION_RUN;
 }
 
@@ -313,25 +341,30 @@ void add_actions(struct cats_configuration *conf)
         register_action_function(conf, action_butterflies_dispersal, "butterfly_action_dispersal", "egg dispersal");
         register_action_function(conf, action_butterflies_kill_adults, "butterfly_kill_adults", "kill adults");
         register_action_function(conf, action_butterflies_save_grid, "action_butterflies_save_grid", "output");
-
+        register_action_function(conf, action_butterfly_stats_gather, "action_butterfly_stats_gather", "gather stats");
+        register_action_function(conf, action_butterfly_stats_reset, "action_butterfly_stats_reset", "reset stats");
+        register_action_function(conf, action_butterfly_stats_write, "action_butterfly_stats_write", "write stats");
         list_actions_full(conf);
 
 
         append_action(conf, action_butterfly_stats_reset, ALL_STAGES, "resetting butterfly statistics", module_name);
-        append_action(conf, action_butterflies_update_overlays, ALL_STAGES, "updating resource layer", module_name);
         append_action_by_name(conf, "action_load_environments", ALL_STAGES, "environment update", module_name);
         append_action_by_name(conf, "action_overlay_update", ALL_STAGES, "overlay update", module_name);
+        append_action(conf, action_butterflies_update_overlays, ALL_STAGES, "updating resource layer", module_name);
         append_action(conf, action_butterfly_update_generations, ALL_STAGES, "update generations", module_name);
 
         for (int32_t generation = data->generations_max; generation > 0; generation--) {
 
+                add_butterfly_generation_action(conf, action_butterfly_stats_reset, "reset stats", generation);
                 add_butterfly_generation_action(conf, action_start_generation, "start generation", generation);
                 add_butterfly_generation_action(conf, action_butterflies_maturation, "transition eggs to adults",
                                                 generation);
+                add_butterfly_generation_action(conf, action_butterfly_stats_gather, "gather stats", generation);
                 add_butterfly_generation_action(conf, action_butterflies_dispersal, "dispersal", generation);
                 add_butterfly_generation_action(conf, action_butterflies_save_grid, "output", generation);
                 add_butterfly_generation_action(conf, action_butterflies_kill_adults, "kill adults", generation);
                 add_butterfly_generation_action(conf, action_finish_generation, "finish generation", generation);
+                add_butterfly_generation_action(conf, action_butterfly_stats_write, "write stats", generation);
         }
 
 }
\ No newline at end of file
diff --git a/src/modules/butterflies/butterflies_generations.c b/src/modules/butterflies/butterflies_generations.c
index 8e3642ce5ddb7b7dbb645e40ffb4c045c1cc215a..db756eddf8257fda20e0450b41a6a45d1c273feb 100644
--- a/src/modules/butterflies/butterflies_generations.c
+++ b/src/modules/butterflies/butterflies_generations.c
@@ -1,5 +1,51 @@
-//
-// Created by gattringera on 01/03/23.
-//
 
+#include "butterflies_populations.h"
+#include "inline_overlays.h"
+#include "butterflies_main.h"
+#include "modules/module_header.h"
+#include "actions/cats_actions.h"
 #include "butterflies_generations.h"
+#include "inline.h"
+
+void grid_update_generations(struct cats_grid *grid, struct cats_thread_info *ts)
+{
+        struct cats_configuration *conf = ts->conf;
+
+
+        struct conf_data_butterflies *module_conf = CATS_MODULE_DATA;
+        int module_id = CATS_MODULE_ID;
+        struct grid_data_butterflies *data = grid->grid_modules[module_id].module_data;
+        struct cats_vital_rate *rate = &module_conf->butterfly_generations;
+
+        //const bool sim_mode = conf->
+
+        const cats_dt_coord start_row = ts->area.start_row;
+        const cats_dt_coord end_row = ts->area.end_row;
+
+        const cats_dt_coord start_col = ts->area.start_col;
+        const cats_dt_coord end_col = ts->area.end_col;
+        for (cats_dt_coord row = start_row; row < end_row; row++) {
+                for (cats_dt_coord col = start_col; col < end_col; col++) {
+
+                        if (cell_excluded_by_overlay(conf, row, col)) {
+                                data->generations[row][col] = 0.0f;
+                                continue;
+                        }
+
+                        cats_dt_rates gen = calculate_rate(rate, 0, conf->param, grid, row, col, NULL);
+
+
+
+                        cats_dt_environment suitability = get_suitability(grid, row, col);
+                        if (suitability < grid->param.ZT) {
+                                gen = 0.0;
+                        } else if (suitability > grid->param.OT) {
+                                gen = min_rates(1.0, gen);
+                        }
+
+                        data->generations[row][col] = (float) gen;
+
+                        //printf("GENERATIONS::thread %03d:: %d %d %f\n", ts->id ,row, col, (float) gen);
+                }
+        }
+}
\ No newline at end of file
diff --git a/src/modules/butterflies/butterflies_generations.h b/src/modules/butterflies/butterflies_generations.h
index d21b298b381ddd5e9b59d907f8a49c43fd6ecd5a..312421c84ab865c457804d4570c5d7f3f7152e51 100644
--- a/src/modules/butterflies/butterflies_generations.h
+++ b/src/modules/butterflies/butterflies_generations.h
@@ -1,8 +1,6 @@
-//
-// Created by gattringera on 01/03/23.
-//
-
 #ifndef CATS_BUTTERFLIES_GENERATIONS_H
 #define CATS_BUTTERFLIES_GENERATIONS_H
-
+#include "data/cats_grid.h"
+#include "threading/threading.h"
+void grid_update_generations(struct cats_grid *grid, struct cats_thread_info *ts);
 #endif //CATS_BUTTERFLIES_GENERATIONS_H
diff --git a/src/modules/butterflies/butterflies_main.c b/src/modules/butterflies/butterflies_main.c
index 8737f997b366157c165b64ec0f7592d12cf0a4bc..3da5d2ab4fc92620588c47be84f40b308fe514bb 100644
--- a/src/modules/butterflies/butterflies_main.c
+++ b/src/modules/butterflies/butterflies_main.c
@@ -26,6 +26,11 @@ void *butterfly_grid_init(struct cats_configuration *conf, struct cats_grid *gri
         //struct conf_data_butterflies *conf_data = CATS_MODULE_DATA;
         data->eggs = new_raw_2d_array_from_dimension(grid->dimension, sizeof(float));
 
+        if (grid->param.parametrization != PARAM_HYBRID) {
+                log_message(LOG_ERROR, "%s only works with hybrid parametrisation mode", module_name);
+                exit_cats(EXIT_FAILURE);
+
+        }
 
         return data;
 }
@@ -88,5 +93,12 @@ void cats_module_init(struct cats_configuration *conf)
         add_vital_rates(conf, data);
         log_message(LOG_INFO, "Hello from %s (id: %d)\n", module_name, id);
 
+
+        for (enum butterfly_stats which = BF_STAT_MIN; which < BF_STAT_MAX; which++) {
+                data->stat_ids[which] = add_custom_stat(&conf->stats_registry, get_butterfly_stats_name(which));
+        }
+
+
+
 }
 
diff --git a/src/modules/butterflies/butterflies_main.h b/src/modules/butterflies/butterflies_main.h
index 3f3d940515a72f1c899e7645d2ccc2fb3d4f2637..2a6b1c0415371cca1ac2c6e4909925fb947168fb 100644
--- a/src/modules/butterflies/butterflies_main.h
+++ b/src/modules/butterflies/butterflies_main.h
@@ -1,22 +1,25 @@
 #ifndef CATS_BUTTERFLIES_MAIN_H
 #define CATS_BUTTERFLIES_MAIN_H
+
 #include "cats_global.h"
 #include <stdint.h>
 #include "data/cats_datatypes.h"
 #include "vital_rates/vital_rates.h"
+#include "butterflies_stats.h"
+
 
 struct grid_data_butterflies {
-        float **generations;
-        int32_t generation_current;
-        float **eggs;
-        int32_t **info_layer;
+    float **generations;
+    int32_t generation_current;
+    float **eggs;
+    int32_t **info_layer;
 
 
 };
 
 enum butterfly_cell_info {
     BF_CELL_CLEAR = 0,
-    BF_CELL_EXCLUDED = 1  << 0,
+    BF_CELL_EXCLUDED = 1 << 0,
     BF_CELL_HABITAT_OK = 1 << 1,
     BF_CELL_RESOURCE_AVAILABLE = 1 << 2
 
@@ -27,16 +30,18 @@ enum butterfly_cell_info {
 
 struct conf_data_butterflies {
 
-        // fixme -> move to grid data;
-        int32_t generations_max;
-        int32_t current_generation;
-        int32_t animal_dispersal_max_radius; ///< maximal flight/dispersal distance
-        cats_dt_rates egg_to_adult_survival_rate_maximum;
-        cats_dt_rates egg_per_female_maximum;
-        bool actions_added;
-        struct cats_vital_rate eggs_per_female;
-        struct cats_vital_rate butterfly_egg_to_adult_survival;
-        struct cats_vital_rate butterfly_generations;
+    // fixme -> move to grid data;
+    int32_t generations_max;
+    int32_t current_generation;
+    int32_t animal_dispersal_max_radius; ///< maximal flight/dispersal distance
+    cats_dt_rates egg_to_adult_survival_rate_maximum;
+    cats_dt_rates egg_per_female_maximum;
+    bool actions_added;
+    struct cats_vital_rate eggs_per_female;
+    struct cats_vital_rate butterfly_egg_to_adult_survival;
+    struct cats_vital_rate butterfly_generations;
+    int64_t stat_ids[BF_STAT_MAX];
+
 };
 
 #endif //CATS_BUTTERFLIES_MAIN_H
diff --git a/src/modules/butterflies/butterflies_populations.c b/src/modules/butterflies/butterflies_populations.c
index c42baf4377db4a6a2982bec537ff612c8627f841..cf8999044cbc98ad0e2c7f2c26b5c322bbda654b 100644
--- a/src/modules/butterflies/butterflies_populations.c
+++ b/src/modules/butterflies/butterflies_populations.c
@@ -13,6 +13,7 @@
 #include "butterflies_inline.h"
 
 
+
 void butterflies_cell_maturation(struct cats_grid *grid, struct cats_thread_info *ts, cats_dt_coord row, cats_dt_coord col, bool check_exclusion)
 {
         const struct cats_configuration *conf = ts->conf;
diff --git a/src/modules/butterflies/butterflies_stats.c b/src/modules/butterflies/butterflies_stats.c
new file mode 100644
index 0000000000000000000000000000000000000000..9a08c6752600b9cf95c0f123653be56cc000ee3f
--- /dev/null
+++ b/src/modules/butterflies/butterflies_stats.c
@@ -0,0 +1,28 @@
+//
+// Created by gattringera on 16/03/23.
+//
+
+#include "butterflies_stats.h"
+#include "logging.h"
+#include "cats_global.h"
+
+const char *get_butterfly_stats_name(enum butterfly_stats which)
+{
+        switch (which) {
+                case BF_STAT_POPULATED_FIT:
+                        return "populated_fit";
+                case BF_STAT_POPULATED_UNFIT:
+                        return "populated_unfit";
+                case BF_STAT_UNPOPULATED_FIT:
+                        return "unpopulated_fit";
+                case BF_STAT_UNPOPULATED_UNFIT:
+                        return "unpopulated_unfit";
+                case BF_STAT_EXCLUDED:
+                        return "excluded";
+                case BF_STAT_MAX:
+                        break;
+        }
+
+        log_message(LOG_ERROR, "unknown butterfly stats name with id %d", which);
+        exit_cats(EXIT_FAILURE);
+}
diff --git a/src/modules/butterflies/butterflies_stats.h b/src/modules/butterflies/butterflies_stats.h
new file mode 100644
index 0000000000000000000000000000000000000000..a3bb6a1fda2499a893044a65ebf8f4848ddeb503
--- /dev/null
+++ b/src/modules/butterflies/butterflies_stats.h
@@ -0,0 +1,22 @@
+//
+// Created by gattringera on 16/03/23.
+//
+
+#ifndef CATS_BUTTERFLIES_STATS_H
+#define CATS_BUTTERFLIES_STATS_H
+
+enum butterfly_stats {
+    BF_STAT_MIN = 0,
+    BF_STAT_POPULATED_FIT = 0,
+    BF_STAT_POPULATED_UNFIT,
+    BF_STAT_UNPOPULATED_FIT,
+    BF_STAT_UNPOPULATED_UNFIT,
+    BF_STAT_EXCLUDED,
+    BF_STAT_MAX
+};
+
+const char *get_butterfly_stats_name(enum butterfly_stats which);
+
+
+
+#endif //CATS_BUTTERFLIES_STATS_H