diff --git a/src/libaevol/biochemistry/GeneticUnit.cpp b/src/libaevol/biochemistry/GeneticUnit.cpp
index cba2080ee43c6b089e085d942e7fe2d402d5d7d5..9122e92acf3b0ecc7da447a0cfe73c7abf16460a 100644
--- a/src/libaevol/biochemistry/GeneticUnit.cpp
+++ b/src/libaevol/biochemistry/GeneticUnit.cpp
@@ -828,9 +828,19 @@ void GeneticUnit::do_transcription() {
       rna->set_transcript_length(-1);
 
       int32_t i;
+      #ifdef __EUKARYOTE
+      for (i = (strand_id == Strand::LEADING ? transcript_start : 0) ;
+           i < (strand_id == Strand::LEADING ? genome_length : transcript_start);
+           ++i) {
+      #else
       for (i = 0; i < genome_length; ++i) {
+      #endif
         if (is_terminator(strand_id,
-                          transcript_start + (strand_id == Strand::LEADING ? i : -i))) {
+          #ifdef __EUKARYOTE
+            (strand_id == Strand::LEADING ? i : transcript_start-i))) {
+          #else
+            transcript_start + (strand_id == Strand::LEADING ? i : -i))) {
+          #endif
 
           // Found terminator => set transcript's length
           rna->set_transcript_length(i + 
@@ -1330,6 +1340,11 @@ bool GeneticUnit::is_promoter(Strand strand, int32_t pos, int8_t& dist) const {
 
   int8_t prom_dist[PROM_SIZE];
   if(strand == Strand::LEADING) {
+    #ifdef __EUKARYOTE
+      if (pos >= len - PROM_SIZE){
+        return false; // Too close to the border
+      }
+    #endif
 // #pragma omp parallel for
 // #pragma omp simd
       // if (indiv_->id() == 0)printf("Search for Promoter %d : ",pos);
@@ -1346,6 +1361,11 @@ bool GeneticUnit::is_promoter(Strand strand, int32_t pos, int8_t& dist) const {
       // if (indiv_->id() == 0)printf("\n");
   }
   else { // LAGGING
+    #ifdef __EUKARYOTE
+      if (pos < 0 + PROM_SIZE) {
+        return false; // Too close to the border
+      }
+    #endif
 // #pragma omp parallel for
 // #pragma omp simd
       for (int8_t i = 0; i < PROM_SIZE; i++) {
@@ -1374,6 +1394,11 @@ bool GeneticUnit::is_terminator(Strand strand, int32_t pos) const {
   const char* genome = dna_->data();
   int32_t len = dna_->length();
   if (strand == Strand::LEADING) {
+    #ifdef __EUKARYOTE
+      if (pos + TERM_SIZE >= len) {
+        return false;
+      }
+    #endif
     for (int8_t i = 0; i < TERM_STEM_SIZE; i++) {
       #ifdef BASE_2
       if (genome[Utils::mod(pos + i, len)] ==
@@ -1404,6 +1429,11 @@ bool GeneticUnit::is_terminator(Strand strand, int32_t pos) const {
   }
   else // (strand == LAGGING)
   {
+    #ifdef __EUKARYOTE
+      if (pos - TERM_SIZE < 0) {
+        return false;
+      }
+    #endif
     for (int8_t i = 0; i < TERM_STEM_SIZE; i++) {
       #ifdef BASE_2
       if (genome[Utils::mod(pos - i, len)] ==