diff --git a/src/cats/threading/threading-helpers.c b/src/cats/threading/threading-helpers.c
index 1a8ff5d82ed210f7203b70324d1d29cca067b946..d8009004dc0cb11c55d18682252372d393429b9d 100644
--- a/src/cats/threading/threading-helpers.c
+++ b/src/cats/threading/threading-helpers.c
@@ -50,10 +50,21 @@ initialize_thread(struct cats_thread_info *thread, struct cats_grid *grid, struc
                 zero_statistics_stats(&thread->stats[i]);
         }
 
+        thread->temp = 0;
+        thread->temp1 = 0;
+        thread->temp2 = 0;
+        thread->seed = get_random_seed(false);
 
+        for (int i = 0; i < 4; i++) {
+                thread->seed4[i] = get_random_seed64(false);
+        }
         thread->id = id;
         thread->grid = grid;
         thread->conf = conf;
+        thread->rng_buf_size = 32;
+        thread->rng_state_buffer = calloc_or_die(1, thread->rng_buf_size);
+        thread->rng_state = calloc_or_die(1, sizeof(struct random_data));
+        initstate_r(get_random_seed(false), thread->rng_state_buffer, thread->rng_buf_size, thread->rng_state);
 }
 
 
@@ -65,8 +76,12 @@ int32_t get_dispersal_radius(const struct cats_configuration *conf, int32_t id)
 
 void cleanup_threads(struct cats_thread_info *threads, int32_t num_threads)
 {
+
         for (int32_t i = 0; i < num_threads; i++) {
+
                 gsl_rng_free(threads[i].rng);
+                free(threads[i].rng_state);
+                free(threads[i].rng_state_buffer);
         }
 
         for (int32_t i = 0; i < num_threads; i++) {
@@ -75,6 +90,8 @@ void cleanup_threads(struct cats_thread_info *threads, int32_t num_threads)
                 }
         }
         free(threads);
+
+
 }
 
 
diff --git a/src/cats/threading/threading.c b/src/cats/threading/threading.c
index e593f2c302f4f403039f6595adefea93bad99d37..539fd2b938190e14846a3264f422c9fcae8cd052 100644
--- a/src/cats/threading/threading.c
+++ b/src/cats/threading/threading.c
@@ -94,6 +94,8 @@ setup_threads(struct cats_configuration *conf, struct cats_grid *grid, int32_t m
         }
 
 
+
+
         switch (t->strategy) {
                 case TS_UNKNOWN:
                         log_message(LOG_ERROR, "undefined threading strategy");
diff --git a/src/cats/threading/threading.h b/src/cats/threading/threading.h
index 3fe950ff6c863453b151c108661cfac119dd6a79..c025c7898cd7740de0c9c67d9d7ce3774b2b6d10 100644
--- a/src/cats/threading/threading.h
+++ b/src/cats/threading/threading.h
@@ -53,6 +53,11 @@ struct cats_thread_info {
         int64_t temp;
         int64_t temp1;
         int64_t temp2;
+        char *rng_state_buffer;
+        int32_t rng_buf_size;
+        struct random_data *rng_state;
+        unsigned int seed;
+        uint64_t seed4[4];
 
 };