diff --git a/benchmarks/model_checking/Rust/CAN_BUS_tlc.rs b/benchmarks/model_checking/Rust/CAN_BUS_tlc.rs
index bde161e534454493e2a6eb2ddf850dc58b25919c..564a59a407c5fd65054d7ca75591e56daacab8ee 100644
--- a/benchmarks/model_checking/Rust/CAN_BUS_tlc.rs
+++ b/benchmarks/model_checking/Rust/CAN_BUS_tlc.rs
@@ -1,16 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::bboolean::BBoolean;
 use btypes::binteger::BInteger;
 use btypes::brelation::BRelation;
@@ -24,9 +25,9 @@ pub enum MC_TYPE { BFS, DFS, MIXED }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum T1state {
-    T1_EN,
-    T1_CALC,
-    T1_SEND,
+    T1_EN, 
+    T1_CALC, 
+    T1_SEND, 
     T1_WAIT
 }
 impl T1state {
@@ -39,19 +40,19 @@ impl Default for T1state {
 }
 impl fmt::Display for T1state {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            T1state::T1_EN => write!(f, "T1_EN"),
-            T1state::T1_CALC => write!(f, "T1_CALC"),
-            T1state::T1_SEND => write!(f, "T1_SEND"),
-            T1state::T1_WAIT => write!(f, "T1_WAIT"),
-        }
+       match *self {
+           T1state::T1_EN => write!(f, "T1_EN"),
+           T1state::T1_CALC => write!(f, "T1_CALC"),
+           T1state::T1_SEND => write!(f, "T1_SEND"),
+           T1state::T1_WAIT => write!(f, "T1_WAIT"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum T2mode {
-    T2MODE_SENSE,
-    T2MODE_TRANSMIT,
+    T2MODE_SENSE, 
+    T2MODE_TRANSMIT, 
     T2MODE_RELEASE
 }
 impl T2mode {
@@ -64,22 +65,22 @@ impl Default for T2mode {
 }
 impl fmt::Display for T2mode {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            T2mode::T2MODE_SENSE => write!(f, "T2MODE_SENSE"),
-            T2mode::T2MODE_TRANSMIT => write!(f, "T2MODE_TRANSMIT"),
-            T2mode::T2MODE_RELEASE => write!(f, "T2MODE_RELEASE"),
-        }
+       match *self {
+           T2mode::T2MODE_SENSE => write!(f, "T2MODE_SENSE"),
+           T2mode::T2MODE_TRANSMIT => write!(f, "T2MODE_TRANSMIT"),
+           T2mode::T2MODE_RELEASE => write!(f, "T2MODE_RELEASE"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum T2state {
-    T2_EN,
-    T2_RCV,
-    T2_PROC,
-    T2_CALC,
-    T2_SEND,
-    T2_WAIT,
+    T2_EN, 
+    T2_RCV, 
+    T2_PROC, 
+    T2_CALC, 
+    T2_SEND, 
+    T2_WAIT, 
     T2_RELEASE
 }
 impl T2state {
@@ -92,25 +93,25 @@ impl Default for T2state {
 }
 impl fmt::Display for T2state {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            T2state::T2_EN => write!(f, "T2_EN"),
-            T2state::T2_RCV => write!(f, "T2_RCV"),
-            T2state::T2_PROC => write!(f, "T2_PROC"),
-            T2state::T2_CALC => write!(f, "T2_CALC"),
-            T2state::T2_SEND => write!(f, "T2_SEND"),
-            T2state::T2_WAIT => write!(f, "T2_WAIT"),
-            T2state::T2_RELEASE => write!(f, "T2_RELEASE"),
-        }
+       match *self {
+           T2state::T2_EN => write!(f, "T2_EN"),
+           T2state::T2_RCV => write!(f, "T2_RCV"),
+           T2state::T2_PROC => write!(f, "T2_PROC"),
+           T2state::T2_CALC => write!(f, "T2_CALC"),
+           T2state::T2_SEND => write!(f, "T2_SEND"),
+           T2state::T2_WAIT => write!(f, "T2_WAIT"),
+           T2state::T2_RELEASE => write!(f, "T2_RELEASE"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum T3state {
-    T3_READY,
-    T3_WRITE,
-    T3_RELEASE,
-    T3_READ,
-    T3_PROC,
+    T3_READY, 
+    T3_WRITE, 
+    T3_RELEASE, 
+    T3_READ, 
+    T3_PROC, 
     T3_WAIT
 }
 impl T3state {
@@ -123,14 +124,14 @@ impl Default for T3state {
 }
 impl fmt::Display for T3state {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            T3state::T3_READY => write!(f, "T3_READY"),
-            T3state::T3_WRITE => write!(f, "T3_WRITE"),
-            T3state::T3_RELEASE => write!(f, "T3_RELEASE"),
-            T3state::T3_READ => write!(f, "T3_READ"),
-            T3state::T3_PROC => write!(f, "T3_PROC"),
-            T3state::T3_WAIT => write!(f, "T3_WAIT"),
-        }
+       match *self {
+           T3state::T3_READY => write!(f, "T3_READY"),
+           T3state::T3_WRITE => write!(f, "T3_WRITE"),
+           T3state::T3_RELEASE => write!(f, "T3_RELEASE"),
+           T3state::T3_READ => write!(f, "T3_READ"),
+           T3state::T3_PROC => write!(f, "T3_PROC"),
+           T3state::T3_WAIT => write!(f, "T3_WAIT"),
+       }
     }
 }
 
@@ -203,6 +204,32 @@ pub struct CAN_BUS_tlc {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_Update: Option<BSet<BInteger>>,}
 
+impl fmt::Display for CAN_BUS_tlc {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "CAN_BUS_tlc: (".to_owned();
+        result += &format!("_get_BUSpriority: {}, ", self._get_BUSpriority());
+        result += &format!("_get_BUSvalue: {}, ", self._get_BUSvalue());
+        result += &format!("_get_BUSwrite: {}, ", self._get_BUSwrite());
+        result += &format!("_get_T1_state: {}, ", self._get_T1_state());
+        result += &format!("_get_T1_timer: {}, ", self._get_T1_timer());
+        result += &format!("_get_T1_writevalue: {}, ", self._get_T1_writevalue());
+        result += &format!("_get_T2_mode: {}, ", self._get_T2_mode());
+        result += &format!("_get_T2_readpriority: {}, ", self._get_T2_readpriority());
+        result += &format!("_get_T2_readvalue: {}, ", self._get_T2_readvalue());
+        result += &format!("_get_T2_state: {}, ", self._get_T2_state());
+        result += &format!("_get_T2_timer: {}, ", self._get_T2_timer());
+        result += &format!("_get_T2_writevalue: {}, ", self._get_T2_writevalue());
+        result += &format!("_get_T2v: {}, ", self._get_T2v());
+        result += &format!("_get_T3_enabled: {}, ", self._get_T3_enabled());
+        result += &format!("_get_T3_evaluated: {}, ", self._get_T3_evaluated());
+        result += &format!("_get_T3_readpriority: {}, ", self._get_T3_readpriority());
+        result += &format!("_get_T3_readvalue: {}, ", self._get_T3_readvalue());
+        result += &format!("_get_T3_state: {}, ", self._get_T3_state());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl CAN_BUS_tlc {
 
     pub fn new() -> CAN_BUS_tlc {
@@ -212,11 +239,11 @@ impl CAN_BUS_tlc {
         return m;
     }
     fn init(&mut self) {
-        self.NATSET = BSet::<BInteger>::interval(&BInteger::new(0), &BInteger::new(5));
         self._T1state = BSet::new(vec![T1state::T1_EN, T1state::T1_CALC, T1state::T1_SEND, T1state::T1_WAIT]);
         self._T2mode = BSet::new(vec![T2mode::T2MODE_SENSE, T2mode::T2MODE_TRANSMIT, T2mode::T2MODE_RELEASE]);
         self._T2state = BSet::new(vec![T2state::T2_EN, T2state::T2_RCV, T2state::T2_PROC, T2state::T2_CALC, T2state::T2_SEND, T2state::T2_WAIT, T2state::T2_RELEASE]);
         self._T3state = BSet::new(vec![T3state::T3_READY, T3state::T3_WRITE, T3state::T3_RELEASE, T3state::T3_READ, T3state::T3_PROC, T3state::T3_WAIT]);
+        self.NATSET = BSet::<BInteger>::interval(&BInteger::new(0), &BInteger::new(5));
         self.T2v = BInteger::new(0);
         self.T3_evaluated = BBoolean::new(true);
         self.T3_enabled = BBoolean::new(true);
@@ -237,95 +264,95 @@ impl CAN_BUS_tlc {
         self.T2_mode = T2mode::T2MODE_SENSE;
     }
 
-    pub fn get_NATSET(&self) -> BSet<BInteger> {
+    pub fn _get_NATSET(&self) -> BSet<BInteger> {
         return self.NATSET.clone();
     }
 
-    pub fn get_BUSpriority(&self) -> BInteger {
+    pub fn _get_BUSpriority(&self) -> BInteger {
         return self.BUSpriority.clone();
     }
 
-    pub fn get_BUSvalue(&self) -> BInteger {
+    pub fn _get_BUSvalue(&self) -> BInteger {
         return self.BUSvalue.clone();
     }
 
-    pub fn get_BUSwrite(&self) -> BRelation<BInteger, BInteger> {
+    pub fn _get_BUSwrite(&self) -> BRelation<BInteger, BInteger> {
         return self.BUSwrite.clone();
     }
 
-    pub fn get_T1_state(&self) -> T1state {
+    pub fn _get_T1_state(&self) -> T1state {
         return self.T1_state.clone();
     }
 
-    pub fn get_T1_timer(&self) -> BInteger {
+    pub fn _get_T1_timer(&self) -> BInteger {
         return self.T1_timer.clone();
     }
 
-    pub fn get_T1_writevalue(&self) -> BInteger {
+    pub fn _get_T1_writevalue(&self) -> BInteger {
         return self.T1_writevalue.clone();
     }
 
-    pub fn get_T2_mode(&self) -> T2mode {
+    pub fn _get_T2_mode(&self) -> T2mode {
         return self.T2_mode.clone();
     }
 
-    pub fn get_T2_readpriority(&self) -> BInteger {
+    pub fn _get_T2_readpriority(&self) -> BInteger {
         return self.T2_readpriority.clone();
     }
 
-    pub fn get_T2_readvalue(&self) -> BInteger {
+    pub fn _get_T2_readvalue(&self) -> BInteger {
         return self.T2_readvalue.clone();
     }
 
-    pub fn get_T2_state(&self) -> T2state {
+    pub fn _get_T2_state(&self) -> T2state {
         return self.T2_state.clone();
     }
 
-    pub fn get_T2_timer(&self) -> BInteger {
+    pub fn _get_T2_timer(&self) -> BInteger {
         return self.T2_timer.clone();
     }
 
-    pub fn get_T2_writevalue(&self) -> BInteger {
+    pub fn _get_T2_writevalue(&self) -> BInteger {
         return self.T2_writevalue.clone();
     }
 
-    pub fn get_T2v(&self) -> BInteger {
+    pub fn _get_T2v(&self) -> BInteger {
         return self.T2v.clone();
     }
 
-    pub fn get_T3_enabled(&self) -> BBoolean {
+    pub fn _get_T3_enabled(&self) -> BBoolean {
         return self.T3_enabled.clone();
     }
 
-    pub fn get_T3_evaluated(&self) -> BBoolean {
+    pub fn _get_T3_evaluated(&self) -> BBoolean {
         return self.T3_evaluated.clone();
     }
 
-    pub fn get_T3_readpriority(&self) -> BInteger {
+    pub fn _get_T3_readpriority(&self) -> BInteger {
         return self.T3_readpriority.clone();
     }
 
-    pub fn get_T3_readvalue(&self) -> BInteger {
+    pub fn _get_T3_readvalue(&self) -> BInteger {
         return self.T3_readvalue.clone();
     }
 
-    pub fn get_T3_state(&self) -> T3state {
+    pub fn _get_T3_state(&self) -> T3state {
         return self.T3_state.clone();
     }
 
-    pub fn get__T1state(&self) -> BSet<T1state> {
+    pub fn _get__T1state(&self) -> BSet<T1state> {
         return self._T1state.clone();
     }
 
-    pub fn get__T2mode(&self) -> BSet<T2mode> {
+    pub fn _get__T2mode(&self) -> BSet<T2mode> {
         return self._T2mode.clone();
     }
 
-    pub fn get__T2state(&self) -> BSet<T2state> {
+    pub fn _get__T2state(&self) -> BSet<T2state> {
         return self._T2state.clone();
     }
 
-    pub fn get__T3state(&self) -> BSet<T3state> {
+    pub fn _get__T3state(&self) -> BSet<T3state> {
         return self._T3state.clone();
     }
 
@@ -493,7 +520,7 @@ impl CAN_BUS_tlc {
     pub fn _tr_T1Evaluate(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_T1Evaluate.is_none() {
-            let mut __tmp__val__ = self.T1_timer.equal(&BInteger::new(0)).and(&self.T1_state.equal(&T1state::T1_EN)).booleanValue();
+            let mut __tmp__val__ = (self.T1_timer.equal(&BInteger::new(0)) && self.T1_state.equal(&T1state::T1_EN)).booleanValue();
             self._tr_cache_T1Evaluate = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -505,6 +532,7 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T1Calculate.is_none() {
             let mut _ic_set_1: BSet<BInteger> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_p_1 in BSet::<BInteger>::interval(&BInteger::new(1).negative(), &BInteger::new(3)).clone().iter().cloned() {
                 if (self.T1_state.equal(&T1state::T1_CALC)).booleanValue() {
                     _ic_set_1 = _ic_set_1._union(&BSet::new(vec![_ic_p_1]));
@@ -522,6 +550,7 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T1SendResult.is_none() {
             let mut _ic_set_2: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_ppriority_1 = BInteger::new(3);
                 {
@@ -543,6 +572,7 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T1Wait.is_none() {
             let mut _ic_set_3: BSet<BInteger> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_pt_1 = BInteger::new(2);
                 if (self.T1_state.equal(&T1state::T1_WAIT)).booleanValue() {
@@ -560,7 +590,7 @@ impl CAN_BUS_tlc {
     pub fn _tr_T2Evaluate(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_T2Evaluate.is_none() {
-            let mut __tmp__val__ = self.T2_timer.equal(&BInteger::new(0)).and(&self.T2_state.equal(&T2state::T2_EN)).booleanValue();
+            let mut __tmp__val__ = (self.T2_timer.equal(&BInteger::new(0)) && self.T2_state.equal(&T2state::T2_EN)).booleanValue();
             self._tr_cache_T2Evaluate = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -572,6 +602,7 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T2ReadBus.is_none() {
             let mut _ic_set_5: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_ppriority_1 = self.BUSpriority;
                 {
@@ -592,7 +623,7 @@ impl CAN_BUS_tlc {
     pub fn _tr_T2Reset(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_T2Reset.is_none() {
-            let mut __tmp__val__ = self.T2_readpriority.equal(&BInteger::new(4)).and(&self.T2_state.equal(&T2state::T2_PROC)).booleanValue();
+            let mut __tmp__val__ = (self.T2_readpriority.equal(&BInteger::new(4)) && self.T2_state.equal(&T2state::T2_PROC)).booleanValue();
             self._tr_cache_T2Reset = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -603,7 +634,7 @@ impl CAN_BUS_tlc {
     pub fn _tr_T2Complete(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_T2Complete.is_none() {
-            let mut __tmp__val__ = self.T2_state.equal(&T2state::T2_PROC).and(&self.T2_readpriority.equal(&BInteger::new(5))).and(&self.T2_mode.equal(&T2mode::T2MODE_TRANSMIT)).booleanValue();
+            let mut __tmp__val__ = ((self.T2_state.equal(&T2state::T2_PROC) && self.T2_readpriority.equal(&BInteger::new(5))) && self.T2_mode.equal(&T2mode::T2MODE_TRANSMIT)).booleanValue();
             self._tr_cache_T2Complete = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -615,9 +646,10 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T2ReleaseBus.is_none() {
             let mut _ic_set_8: BSet<BInteger> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_ppriority_1 = self.T2_readpriority;
-                if (self.BUSwrite.domain().elementOf(&_ic_ppriority_1).and(&self.T2_state.equal(&T2state::T2_RELEASE))).booleanValue() {
+                if ((self.BUSwrite.domain().elementOf(&_ic_ppriority_1) && self.T2_state.equal(&T2state::T2_RELEASE))).booleanValue() {
                     _ic_set_8 = _ic_set_8._union(&BSet::new(vec![_ic_ppriority_1]));
                 }
 
@@ -632,7 +664,7 @@ impl CAN_BUS_tlc {
     pub fn _tr_T2Calculate(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_T2Calculate.is_none() {
-            let mut __tmp__val__ = self.T2_readpriority.equal(&BInteger::new(3)).and(&self.T2_state.equal(&T2state::T2_PROC)).booleanValue();
+            let mut __tmp__val__ = (self.T2_readpriority.equal(&BInteger::new(3)) && self.T2_state.equal(&T2state::T2_PROC)).booleanValue();
             self._tr_cache_T2Calculate = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -644,6 +676,7 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T2WriteBus.is_none() {
             let mut _ic_set_10: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_ppriority_1 = BInteger::new(5);
                 {
@@ -665,6 +698,7 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T2Wait.is_none() {
             let mut _ic_set_11: BSet<BInteger> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_pt_1 = BInteger::new(3);
                 if (self.T2_state.equal(&T2state::T2_WAIT)).booleanValue() {
@@ -682,7 +716,7 @@ impl CAN_BUS_tlc {
     pub fn _tr_T3Initiate(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_T3Initiate.is_none() {
-            let mut __tmp__val__ = self.T3_state.equal(&T3state::T3_READY).and(&self.T3_evaluated.equal(&BBoolean::new(false))).and(&self.T3_enabled.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = ((self.T3_state.equal(&T3state::T3_READY) && self.T3_evaluated.equal(&BBoolean::new(false))) && self.T3_enabled.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_T3Initiate = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -693,7 +727,7 @@ impl CAN_BUS_tlc {
     pub fn _tr_T3Evaluate(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_T3Evaluate.is_none() {
-            let mut __tmp__val__ = self.T3_state.equal(&T3state::T3_READY).and(&self.T3_evaluated.equal(&BBoolean::new(false))).and(&self.T3_enabled.equal(&BBoolean::new(false))).booleanValue();
+            let mut __tmp__val__ = ((self.T3_state.equal(&T3state::T3_READY) && self.T3_evaluated.equal(&BBoolean::new(false))) && self.T3_enabled.equal(&BBoolean::new(false))).booleanValue();
             self._tr_cache_T3Evaluate = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -705,6 +739,7 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T3writebus.is_none() {
             let mut _ic_set_14: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_ppriority_1 = BInteger::new(4);
                 {
@@ -726,6 +761,7 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T3Read.is_none() {
             let mut _ic_set_15: BSet<BTuple<BInteger, BInteger>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_ppriority_1 = self.BUSpriority;
                 {
@@ -746,7 +782,7 @@ impl CAN_BUS_tlc {
     pub fn _tr_T3Poll(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_T3Poll.is_none() {
-            let mut __tmp__val__ = self.T3_readpriority.less(&BInteger::new(5)).and(&self.T3_state.equal(&T3state::T3_PROC)).booleanValue();
+            let mut __tmp__val__ = (self.T3_readpriority.less(&BInteger::new(5)) && self.T3_state.equal(&T3state::T3_PROC)).booleanValue();
             self._tr_cache_T3Poll = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -758,9 +794,10 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_T3ReleaseBus.is_none() {
             let mut _ic_set_17: BSet<BInteger> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_ppriority_1 = BInteger::new(4);
-                if (self.T3_readpriority.equal(&BInteger::new(5)).and(&self.T3_state.equal(&T3state::T3_PROC))).booleanValue() {
+                if ((self.T3_readpriority.equal(&BInteger::new(5)) && self.T3_state.equal(&T3state::T3_PROC))).booleanValue() {
                     _ic_set_17 = _ic_set_17._union(&BSet::new(vec![_ic_ppriority_1]));
                 }
 
@@ -798,9 +835,10 @@ impl CAN_BUS_tlc {
         //transition
         if !is_caching || self._tr_cache_Update.is_none() {
             let mut _ic_set_20: BSet<BInteger> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             {
                 let mut _ic_pmax_1 = self.BUSwrite.domain()._max();
-                if (self.T1_timer.greater(&BInteger::new(0)).and(&self.T2_timer.greater(&BInteger::new(0))).and(&self.T3_enabled.equal(&BBoolean::new(true)).or(&self.T3_evaluated.equal(&BBoolean::new(true))))).booleanValue() {
+                if (((self.T1_timer.greater(&BInteger::new(0)) && self.T2_timer.greater(&BInteger::new(0))) && (self.T3_enabled.equal(&BBoolean::new(true)) || self.T3_evaluated.equal(&BBoolean::new(true))))).booleanValue() {
                     _ic_set_20 = _ic_set_20._union(&BSet::new(vec![_ic_pmax_1]));
                 }
 
@@ -912,11 +950,10 @@ impl CAN_BUS_tlc {
         return self.BUSwrite.domain().elementOf(&BInteger::new(0)).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_T1Evaluate" => {self._tr_T1Evaluate(false);},
                 "_tr_T1Calculate" => {self._tr_T1Calculate(false);},
                 "_tr_T1SendResult" => {self._tr_T1SendResult(false);},
@@ -946,962 +983,401 @@ impl CAN_BUS_tlc {
     //model_check_next_states
     fn generateNextStates(state: &mut CAN_BUS_tlc,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<CAN_BUS_tlc, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_guard_m: Arc<Mutex<HashMap<CAN_BUS_tlc, HashSet<&str>>>>,
-                          guardCache: Arc<Mutex<HashMap<CAN_BUS_tlc, PersistentHashMap<&str, bool>>>>,
-                          parents_m: Arc<Mutex<HashMap<CAN_BUS_tlc, CAN_BUS_tlc>>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<CAN_BUS_tlc> {
-        let mut result = HashSet::<CAN_BUS_tlc>::new();
-        if isCaching {
-            let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned());
-            let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() };
-            //model_check_transition
-            let mut _trid_1 = state._tr_T1Evaluate(isCaching);
-            if _trid_1 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T1Evaluate();
-                match guard_dependency.get("T1Evaluate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T1Evaluate").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T1Evaluate").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_T1Calculate(isCaching);
-            for param in _trid_2.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T1Calculate(_tmp_1);
-                match guard_dependency.get("T1Calculate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T1Calculate").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T1Calculate").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_T1SendResult(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T1SendResult(_tmp_2, _tmp_1);
-                match guard_dependency.get("T1SendResult") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T1SendResult").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T1SendResult").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_T1Wait(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T1Wait(_tmp_1);
-                match guard_dependency.get("T1Wait") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T1Wait").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T1Wait").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_5 = state._tr_T2Evaluate(isCaching);
-            if _trid_5 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T2Evaluate();
-                match guard_dependency.get("T2Evaluate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T2Evaluate").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Evaluate").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_T2ReadBus(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T2ReadBus(_tmp_2, _tmp_1);
-                match guard_dependency.get("T2ReadBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T2ReadBus").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2ReadBus").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_7 = state._tr_T2Reset(isCaching);
-            if _trid_7 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T2Reset();
-                match guard_dependency.get("T2Reset") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T2Reset").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Reset").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_8 = state._tr_T2Complete(isCaching);
-            if _trid_8 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T2Complete();
-                match guard_dependency.get("T2Complete") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T2Complete").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Complete").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_9 = state._tr_T2ReleaseBus(isCaching);
-            for param in _trid_9.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T2ReleaseBus(_tmp_1);
-                match guard_dependency.get("T2ReleaseBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T2ReleaseBus").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2ReleaseBus").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_10 = state._tr_T2Calculate(isCaching);
-            if _trid_10 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T2Calculate();
-                match guard_dependency.get("T2Calculate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T2Calculate").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Calculate").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_11 = state._tr_T2WriteBus(isCaching);
-            for param in _trid_11.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T2WriteBus(_tmp_2, _tmp_1);
-                match guard_dependency.get("T2WriteBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T2WriteBus").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2WriteBus").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_12 = state._tr_T2Wait(isCaching);
-            for param in _trid_12.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T2Wait(_tmp_1);
-                match guard_dependency.get("T2Wait") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T2Wait").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T2Wait").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_13 = state._tr_T3Initiate(isCaching);
-            if _trid_13 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3Initiate();
-                match guard_dependency.get("T3Initiate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T3Initiate").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Initiate").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_14 = state._tr_T3Evaluate(isCaching);
-            if _trid_14 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3Evaluate();
-                match guard_dependency.get("T3Evaluate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T3Evaluate").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Evaluate").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_15 = state._tr_T3writebus(isCaching);
-            for param in _trid_15.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T3writebus(_tmp_2, _tmp_1);
-                match guard_dependency.get("T3writebus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T3writebus").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3writebus").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_16 = state._tr_T3Read(isCaching);
-            for param in _trid_16.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T3Read(_tmp_2, _tmp_1);
-                match guard_dependency.get("T3Read") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T3Read").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Read").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_17 = state._tr_T3Poll(isCaching);
-            if _trid_17 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3Poll();
-                match guard_dependency.get("T3Poll") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T3Poll").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Poll").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_18 = state._tr_T3ReleaseBus(isCaching);
-            for param in _trid_18.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T3ReleaseBus(_tmp_1);
-                match guard_dependency.get("T3ReleaseBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T3ReleaseBus").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3ReleaseBus").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_19 = state._tr_T3Wait(isCaching);
-            if _trid_19 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3Wait();
-                match guard_dependency.get("T3Wait") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T3Wait").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3Wait").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_20 = state._tr_T3ReEnableWait(isCaching);
-            if _trid_20 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3ReEnableWait();
-                match guard_dependency.get("T3ReEnableWait") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("T3ReEnableWait").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("T3ReEnableWait").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_21 = state._tr_Update(isCaching);
-            for param in _trid_21.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.Update(_tmp_1);
-                match guard_dependency.get("Update") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
+                          transitions: Arc<AtomicU64>) -> HashSet<(CAN_BUS_tlc, &'static str)> {
+        let mut result = HashSet::<(CAN_BUS_tlc, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        if state._tr_T1Evaluate(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T1Evaluate();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T1Evaluate")); }
+            result.insert((copiedState, "T1Evaluate"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_2 = state._tr_T1Calculate(isCaching);
+        for param in _trid_2.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.T1Calculate(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T1Calculate")); }
+            result.insert((copiedState, "T1Calculate"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_3 = state._tr_T1SendResult(isCaching);
+        for param in _trid_3.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.T1SendResult(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T1SendResult")); }
+            result.insert((copiedState, "T1SendResult"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_4 = state._tr_T1Wait(isCaching);
+        for param in _trid_4.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.T1Wait(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T1Wait")); }
+            result.insert((copiedState, "T1Wait"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_T2Evaluate(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T2Evaluate();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Evaluate")); }
+            result.insert((copiedState, "T2Evaluate"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_6 = state._tr_T2ReadBus(isCaching);
+        for param in _trid_6.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.T2ReadBus(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2ReadBus")); }
+            result.insert((copiedState, "T2ReadBus"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_T2Reset(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T2Reset();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Reset")); }
+            result.insert((copiedState, "T2Reset"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_T2Complete(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T2Complete();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Complete")); }
+            result.insert((copiedState, "T2Complete"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_9 = state._tr_T2ReleaseBus(isCaching);
+        for param in _trid_9.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.T2ReleaseBus(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2ReleaseBus")); }
+            result.insert((copiedState, "T2ReleaseBus"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_T2Calculate(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T2Calculate();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Calculate")); }
+            result.insert((copiedState, "T2Calculate"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_11 = state._tr_T2WriteBus(isCaching);
+        for param in _trid_11.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.T2WriteBus(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2WriteBus")); }
+            result.insert((copiedState, "T2WriteBus"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_12 = state._tr_T2Wait(isCaching);
+        for param in _trid_12.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.T2Wait(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T2Wait")); }
+            result.insert((copiedState, "T2Wait"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_T3Initiate(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T3Initiate();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Initiate")); }
+            result.insert((copiedState, "T3Initiate"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_T3Evaluate(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T3Evaluate();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Evaluate")); }
+            result.insert((copiedState, "T3Evaluate"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_15 = state._tr_T3writebus(isCaching);
+        for param in _trid_15.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.T3writebus(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3writebus")); }
+            result.insert((copiedState, "T3writebus"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_16 = state._tr_T3Read(isCaching);
+        for param in _trid_16.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.T3Read(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Read")); }
+            result.insert((copiedState, "T3Read"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_T3Poll(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T3Poll();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Poll")); }
+            result.insert((copiedState, "T3Poll"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_18 = state._tr_T3ReleaseBus(isCaching);
+        for param in _trid_18.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.T3ReleaseBus(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3ReleaseBus")); }
+            result.insert((copiedState, "T3ReleaseBus"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_T3Wait(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T3Wait();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3Wait")); }
+            result.insert((copiedState, "T3Wait"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_T3ReEnableWait(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.T3ReEnableWait();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("T3ReEnableWait")); }
+            result.insert((copiedState, "T3ReEnableWait"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_21 = state._tr_Update(isCaching);
+        for param in _trid_21.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.Update(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("Update")); }
+            result.insert((copiedState, "Update"));
+            evaluated_transitions += 1;
+        }
 
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("Update").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("Update").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
 
-            guardCache.lock().unwrap().insert(state.clone(), newCache);
-        } else {
-            //model_check_transition
-            if state._tr_T1Evaluate(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T1Evaluate();
-                match guard_dependency.get("T1Evaluate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_T1Calculate(isCaching);
-            for param in _trid_2.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T1Calculate(_tmp_1);
-                match guard_dependency.get("T1Calculate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_T1SendResult(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T1SendResult(_tmp_2, _tmp_1);
-                match guard_dependency.get("T1SendResult") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_T1Wait(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T1Wait(_tmp_1);
-                match guard_dependency.get("T1Wait") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_T2Evaluate(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T2Evaluate();
-                match guard_dependency.get("T2Evaluate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_T2ReadBus(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T2ReadBus(_tmp_2, _tmp_1);
-                match guard_dependency.get("T2ReadBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_T2Reset(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T2Reset();
-                match guard_dependency.get("T2Reset") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_T2Complete(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T2Complete();
-                match guard_dependency.get("T2Complete") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_9 = state._tr_T2ReleaseBus(isCaching);
-            for param in _trid_9.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T2ReleaseBus(_tmp_1);
-                match guard_dependency.get("T2ReleaseBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_T2Calculate(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T2Calculate();
-                match guard_dependency.get("T2Calculate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_11 = state._tr_T2WriteBus(isCaching);
-            for param in _trid_11.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T2WriteBus(_tmp_2, _tmp_1);
-                match guard_dependency.get("T2WriteBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_12 = state._tr_T2Wait(isCaching);
-            for param in _trid_12.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T2Wait(_tmp_1);
-                match guard_dependency.get("T2Wait") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_T3Initiate(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3Initiate();
-                match guard_dependency.get("T3Initiate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_T3Evaluate(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3Evaluate();
-                match guard_dependency.get("T3Evaluate") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_15 = state._tr_T3writebus(isCaching);
-            for param in _trid_15.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T3writebus(_tmp_2, _tmp_1);
-                match guard_dependency.get("T3writebus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_16 = state._tr_T3Read(isCaching);
-            for param in _trid_16.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.T3Read(_tmp_2, _tmp_1);
-                match guard_dependency.get("T3Read") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_T3Poll(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3Poll();
-                match guard_dependency.get("T3Poll") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_18 = state._tr_T3ReleaseBus(isCaching);
-            for param in _trid_18.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.T3ReleaseBus(_tmp_1);
-                match guard_dependency.get("T3ReleaseBus") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_T3Wait(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3Wait();
-                match guard_dependency.get("T3Wait") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_T3ReEnableWait(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.T3ReEnableWait();
-                match guard_dependency.get("T3ReEnableWait") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_21 = state._tr_Update(isCaching);
-            for param in _trid_21.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.Update(_tmp_1);
-                match guard_dependency.get("Update") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-
-        }
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &CAN_BUS_tlc,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<CAN_BUS_tlc, HashSet<&str>>>> ) -> bool {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &CAN_BUS_tlc, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_2") {
+            if dependent_invariants_of_state.contains(&"_check_inv_2") {
                 if !state._check_inv_2() {
+                    println!("_check_inv_2 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_3") {
+            if dependent_invariants_of_state.contains(&"_check_inv_3") {
                 if !state._check_inv_3() {
+                    println!("_check_inv_3 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_4") {
+            if dependent_invariants_of_state.contains(&"_check_inv_4") {
                 if !state._check_inv_4() {
+                    println!("_check_inv_4 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_5") {
+            if dependent_invariants_of_state.contains(&"_check_inv_5") {
                 if !state._check_inv_5() {
+                    println!("_check_inv_5 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_6") {
+            if dependent_invariants_of_state.contains(&"_check_inv_6") {
                 if !state._check_inv_6() {
+                    println!("_check_inv_6 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_7") {
+            if dependent_invariants_of_state.contains(&"_check_inv_7") {
                 if !state._check_inv_7() {
+                    println!("_check_inv_7 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_8") {
+            if dependent_invariants_of_state.contains(&"_check_inv_8") {
                 if !state._check_inv_8() {
+                    println!("_check_inv_8 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_9") {
+            if dependent_invariants_of_state.contains(&"_check_inv_9") {
                 if !state._check_inv_9() {
+                    println!("_check_inv_9 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_10") {
+            if dependent_invariants_of_state.contains(&"_check_inv_10") {
                 if !state._check_inv_10() {
+                    println!("_check_inv_10 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_11") {
+            if dependent_invariants_of_state.contains(&"_check_inv_11") {
                 if !state._check_inv_11() {
+                    println!("_check_inv_11 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_12") {
+            if dependent_invariants_of_state.contains(&"_check_inv_12") {
                 if !state._check_inv_12() {
+                    println!("_check_inv_12 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_13") {
+            if dependent_invariants_of_state.contains(&"_check_inv_13") {
                 if !state._check_inv_13() {
+                    println!("_check_inv_13 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_14") {
+            if dependent_invariants_of_state.contains(&"_check_inv_14") {
                 if !state._check_inv_14() {
+                    println!("_check_inv_14 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_15") {
+            if dependent_invariants_of_state.contains(&"_check_inv_15") {
                 if !state._check_inv_15() {
+                    println!("_check_inv_15 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_16") {
+            if dependent_invariants_of_state.contains(&"_check_inv_16") {
                 if !state._check_inv_16() {
+                    println!("_check_inv_16 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_17") {
+            if dependent_invariants_of_state.contains(&"_check_inv_17") {
                 if !state._check_inv_17() {
+                    println!("_check_inv_17 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_18") {
+            if dependent_invariants_of_state.contains(&"_check_inv_18") {
                 if !state._check_inv_18() {
+                    println!("_check_inv_18 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_19") {
+            if dependent_invariants_of_state.contains(&"_check_inv_19") {
                 if !state._check_inv_19() {
+                    println!("_check_inv_19 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_20") {
+            if dependent_invariants_of_state.contains(&"_check_inv_20") {
                 if !state._check_inv_20() {
+                    println!("_check_inv_20 failed!");
                     return false;
                 }
             }
@@ -1911,16 +1387,14 @@ impl CAN_BUS_tlc {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<CAN_BUS_tlc>>>, mc_type: MC_TYPE) -> CAN_BUS_tlc {
+    fn next(collection_m: Arc<Mutex<LinkedList<(CAN_BUS_tlc, &'static str)>>>, mc_type: MC_TYPE) -> (CAN_BUS_tlc, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -1929,152 +1403,140 @@ impl CAN_BUS_tlc {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = CAN_BUS_tlc::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() {
-            invariant_violated.store(true, Ordering::Release);
-        }
-
-        let mut states = HashSet::<CAN_BUS_tlc>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<CAN_BUS_tlc>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, HashSet<&str>>::new()));
-        let mut guard_cache = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, CAN_BUS_tlc>::new()));
-
-        if is_caching {
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            invariantDependency.insert("T1Wait", HashSet::from(["_check_inv_10", "_check_inv_4"]));
+            "T1Wait" => vec!["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"],
             //model_check_init_static
-            invariantDependency.insert("T1Calculate", HashSet::from(["_check_inv_7", "_check_inv_4"]));
+            "T1Calculate" => vec!["_tr_T1Evaluate", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"],
             //model_check_init_static
-            invariantDependency.insert("T1SendResult", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_4"]));
+            "T1SendResult" => vec!["_tr_T1Evaluate", "_tr_T2ReleaseBus", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"],
             //model_check_init_static
-            invariantDependency.insert("T2ReadBus", HashSet::from(["_check_inv_17", "_check_inv_5", "_check_inv_9"]));
+            "T2ReadBus" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"],
             //model_check_init_static
-            invariantDependency.insert("T2Reset", HashSet::from(["_check_inv_1", "_check_inv_5", "_check_inv_8", "_check_inv_12"]));
+            "T2Reset" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"],
             //model_check_init_static
-            invariantDependency.insert("T2Complete", HashSet::from(["_check_inv_5", "_check_inv_12"]));
+            "T2Complete" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"],
             //model_check_init_static
-            invariantDependency.insert("T2Evaluate", HashSet::from(["_check_inv_5", "_check_inv_11"]));
+            "T2Evaluate" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"],
             //model_check_init_static
-            invariantDependency.insert("T3Evaluate", HashSet::from(["_check_inv_6"]));
+            "T3Evaluate" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"],
             //model_check_init_static
-            invariantDependency.insert("T3ReleaseBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"]));
+            "T3ReleaseBus" => vec!["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"],
             //model_check_init_static
-            invariantDependency.insert("T1Evaluate", HashSet::from(["_check_inv_10", "_check_inv_4"]));
+            "T1Evaluate" => vec!["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"],
             //model_check_init_static
-            invariantDependency.insert("T3Initiate", HashSet::from(["_check_inv_3", "_check_inv_6"]));
+            "T3Initiate" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"],
             //model_check_init_static
-            invariantDependency.insert("T3ReEnableWait", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_6"]));
+            "T3ReEnableWait" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"],
             //model_check_init_static
-            invariantDependency.insert("T3writebus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"]));
+            "T3writebus" => vec!["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"],
             //model_check_init_static
-            invariantDependency.insert("Update", HashSet::from(["_check_inv_2", "_check_inv_10", "_check_inv_14", "_check_inv_13", "_check_inv_11"]));
+            "Update" => vec!["_tr_T1Evaluate", "_tr_T3Read", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T3Evaluate", "_tr_T3Initiate"],
             //model_check_init_static
-            invariantDependency.insert("T2ReleaseBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"]));
+            "T2ReleaseBus" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"],
             //model_check_init_static
-            invariantDependency.insert("T2Wait", HashSet::from(["_check_inv_5", "_check_inv_11"]));
+            "T2Wait" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"],
             //model_check_init_static
-            invariantDependency.insert("T3Poll", HashSet::from(["_check_inv_6"]));
+            "T3Poll" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"],
             //model_check_init_static
-            invariantDependency.insert("T2Calculate", HashSet::from(["_check_inv_1", "_check_inv_5"]));
+            "T2Calculate" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"],
             //model_check_init_static
-            invariantDependency.insert("T3Read", HashSet::from(["_check_inv_16", "_check_inv_15", "_check_inv_6"]));
+            "T3Read" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"],
             //model_check_init_static
-            invariantDependency.insert("T3Wait", HashSet::from(["_check_inv_2", "_check_inv_6"]));
+            "T3Wait" => vec!["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"],
             //model_check_init_static
-            invariantDependency.insert("T2WriteBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"]));
+            "T2WriteBus" => vec!["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"],
+            _ => vec![],
+        }
+    }
+
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            guardDependency.insert("T1Wait", HashSet::from(["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"]));
+            "T1Wait" => vec!["_check_inv_10", "_check_inv_4"],
             //model_check_init_static
-            guardDependency.insert("T1Calculate", HashSet::from(["_tr_T1Evaluate", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"]));
+            "T1Calculate" => vec!["_check_inv_7", "_check_inv_4"],
             //model_check_init_static
-            guardDependency.insert("T1SendResult", HashSet::from(["_tr_T1Evaluate", "_tr_T2ReleaseBus", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"]));
+            "T1SendResult" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_4"],
             //model_check_init_static
-            guardDependency.insert("T2ReadBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
+            "T2ReadBus" => vec!["_check_inv_17", "_check_inv_5", "_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("T2Reset", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
+            "T2Reset" => vec!["_check_inv_1", "_check_inv_5", "_check_inv_8", "_check_inv_12"],
             //model_check_init_static
-            guardDependency.insert("T2Complete", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
+            "T2Complete" => vec!["_check_inv_5", "_check_inv_12"],
             //model_check_init_static
-            guardDependency.insert("T2Evaluate", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
+            "T2Evaluate" => vec!["_check_inv_5", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("T3Evaluate", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
+            "T3Evaluate" => vec!["_check_inv_6"],
             //model_check_init_static
-            guardDependency.insert("T3ReleaseBus", HashSet::from(["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
+            "T3ReleaseBus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"],
             //model_check_init_static
-            guardDependency.insert("T1Evaluate", HashSet::from(["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"]));
+            "T1Evaluate" => vec!["_check_inv_10", "_check_inv_4"],
             //model_check_init_static
-            guardDependency.insert("T3Initiate", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
+            "T3Initiate" => vec!["_check_inv_3", "_check_inv_6"],
             //model_check_init_static
-            guardDependency.insert("T3ReEnableWait", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
+            "T3ReEnableWait" => vec!["_check_inv_2", "_check_inv_3", "_check_inv_6"],
             //model_check_init_static
-            guardDependency.insert("T3writebus", HashSet::from(["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
+            "T3writebus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"],
             //model_check_init_static
-            guardDependency.insert("Update", HashSet::from(["_tr_T1Evaluate", "_tr_T3Read", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T3Evaluate", "_tr_T3Initiate"]));
+            "Update" => vec!["_check_inv_2", "_check_inv_10", "_check_inv_14", "_check_inv_13", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("T2ReleaseBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
+            "T2ReleaseBus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"],
             //model_check_init_static
-            guardDependency.insert("T2Wait", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
+            "T2Wait" => vec!["_check_inv_5", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("T3Poll", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
+            "T3Poll" => vec!["_check_inv_6"],
             //model_check_init_static
-            guardDependency.insert("T2Calculate", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
+            "T2Calculate" => vec!["_check_inv_1", "_check_inv_5"],
             //model_check_init_static
-            guardDependency.insert("T3Read", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
+            "T3Read" => vec!["_check_inv_16", "_check_inv_15", "_check_inv_6"],
             //model_check_init_static
-            guardDependency.insert("T3Wait", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
+            "T3Wait" => vec!["_check_inv_2", "_check_inv_6"],
             //model_check_init_static
-            guardDependency.insert("T2WriteBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
+            "T2WriteBus" => vec!["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"],
+            _ => vec![],
         }
+    }
 
-        let transitions = Arc::new(AtomicI64::new(0));
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = CAN_BUS_tlc::new();
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        let mut all_states = HashSet::<CAN_BUS_tlc>::new();
+        all_states.insert(machine.clone());
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(CAN_BUS_tlc, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+        let num_transitions = Arc::new(AtomicU64::new(0));
+
+        let mut stop_threads = false;
+
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
 
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                       .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                       .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -2082,187 +1544,66 @@ impl CAN_BUS_tlc {
 
         let machine = CAN_BUS_tlc::new();
 
+        let all_states = Arc::new(DashSet::<CAN_BUS_tlc>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(CAN_BUS_tlc, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        let states_m = Arc::new(Mutex::new(HashSet::<CAN_BUS_tlc>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let collection_m = Arc::new(Mutex::new(LinkedList::<CAN_BUS_tlc>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, HashSet<&str>>::new()));
-        let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<CAN_BUS_tlc, CAN_BUS_tlc>::new()));
-
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("T1Wait", HashSet::from(["_check_inv_10", "_check_inv_4"]));
-            //model_check_init_static
-            invariantDependency.insert("T1Calculate", HashSet::from(["_check_inv_7", "_check_inv_4"]));
-            //model_check_init_static
-            invariantDependency.insert("T1SendResult", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_4"]));
-            //model_check_init_static
-            invariantDependency.insert("T2ReadBus", HashSet::from(["_check_inv_17", "_check_inv_5", "_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("T2Reset", HashSet::from(["_check_inv_1", "_check_inv_5", "_check_inv_8", "_check_inv_12"]));
-            //model_check_init_static
-            invariantDependency.insert("T2Complete", HashSet::from(["_check_inv_5", "_check_inv_12"]));
-            //model_check_init_static
-            invariantDependency.insert("T2Evaluate", HashSet::from(["_check_inv_5", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("T3Evaluate", HashSet::from(["_check_inv_6"]));
-            //model_check_init_static
-            invariantDependency.insert("T3ReleaseBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"]));
-            //model_check_init_static
-            invariantDependency.insert("T1Evaluate", HashSet::from(["_check_inv_10", "_check_inv_4"]));
-            //model_check_init_static
-            invariantDependency.insert("T3Initiate", HashSet::from(["_check_inv_3", "_check_inv_6"]));
-            //model_check_init_static
-            invariantDependency.insert("T3ReEnableWait", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_6"]));
-            //model_check_init_static
-            invariantDependency.insert("T3writebus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_6", "_check_inv_20"]));
-            //model_check_init_static
-            invariantDependency.insert("Update", HashSet::from(["_check_inv_2", "_check_inv_10", "_check_inv_14", "_check_inv_13", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("T2ReleaseBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"]));
-            //model_check_init_static
-            invariantDependency.insert("T2Wait", HashSet::from(["_check_inv_5", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("T3Poll", HashSet::from(["_check_inv_6"]));
-            //model_check_init_static
-            invariantDependency.insert("T2Calculate", HashSet::from(["_check_inv_1", "_check_inv_5"]));
-            //model_check_init_static
-            invariantDependency.insert("T3Read", HashSet::from(["_check_inv_16", "_check_inv_15", "_check_inv_6"]));
-            //model_check_init_static
-            invariantDependency.insert("T3Wait", HashSet::from(["_check_inv_2", "_check_inv_6"]));
-            //model_check_init_static
-            invariantDependency.insert("T2WriteBus", HashSet::from(["_check_inv_18", "_check_inv_19", "_check_inv_20", "_check_inv_5"]));
-            //model_check_init_static
-            guardDependency.insert("T1Wait", HashSet::from(["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T1Calculate", HashSet::from(["_tr_T1Evaluate", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T1SendResult", HashSet::from(["_tr_T1Evaluate", "_tr_T2ReleaseBus", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T2ReadBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T2Reset", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T2Complete", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T2Evaluate", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T3Evaluate", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
-            //model_check_init_static
-            guardDependency.insert("T3ReleaseBus", HashSet::from(["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
-            //model_check_init_static
-            guardDependency.insert("T1Evaluate", HashSet::from(["_tr_T1Evaluate", "_tr_Update", "_tr_T1SendResult", "_tr_T1Calculate", "_tr_T1Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T3Initiate", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
-            //model_check_init_static
-            guardDependency.insert("T3ReEnableWait", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
-            //model_check_init_static
-            guardDependency.insert("T3writebus", HashSet::from(["_tr_T2ReleaseBus", "_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
-            //model_check_init_static
-            guardDependency.insert("Update", HashSet::from(["_tr_T1Evaluate", "_tr_T3Read", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T3Evaluate", "_tr_T3Initiate"]));
-            //model_check_init_static
-            guardDependency.insert("T2ReleaseBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T2Wait", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T3Poll", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
-            //model_check_init_static
-            guardDependency.insert("T2Calculate", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
-            //model_check_init_static
-            guardDependency.insert("T3Read", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
-            //model_check_init_static
-            guardDependency.insert("T3Wait", HashSet::from(["_tr_T3writebus", "_tr_T3Read", "_tr_T3ReleaseBus", "_tr_T3Poll", "_tr_Update", "_tr_T3ReEnableWait", "_tr_T3Evaluate", "_tr_T3Wait", "_tr_T3Initiate"]));
-            //model_check_init_static
-            guardDependency.insert("T2WriteBus", HashSet::from(["_tr_T2Reset", "_tr_T2ReleaseBus", "_tr_T2Complete", "_tr_T2Calculate", "_tr_T2Evaluate", "_tr_Update", "_tr_T2ReadBus", "_tr_T2WriteBus", "_tr_T2Wait"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
-
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
-            let dependent_guard_m2 = Arc::clone(&dependent_guard_m);
-            let parents_m2 = Arc::clone(&parents_m);
-            let guard_cache = Arc::clone(&guard_cache_b);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
 
-                //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                //println!("Thread {:?} executing", thread::current().id());
+                next_states.into_iter()
+                           .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                           .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                            Ok(_) => finished_tasks += 1,
+                            Err(msg) => { println!("{}", msg); stop_threads = true; },
+                        },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/benchmarks/model_checking/Rust/Cruise_finite1_deterministic_MC.rs b/benchmarks/model_checking/Rust/Cruise_finite1_deterministic_MC.rs
index 7f12bc7b48af29b3387723074ea901e6d4037a45..3c75c4370810b7ebd5c4a6236b0d6f245220c94d 100644
--- a/benchmarks/model_checking/Rust/Cruise_finite1_deterministic_MC.rs
+++ b/benchmarks/model_checking/Rust/Cruise_finite1_deterministic_MC.rs
@@ -1,16 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::bboolean::BBoolean;
 use btypes::binteger::BInteger;
 use btypes::bset::BSet;
@@ -23,9 +24,9 @@ pub enum MC_TYPE { BFS, DFS, MIXED }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum RSset {
-    RSnone,
-    RSpos,
-    RSneg,
+    RSnone, 
+    RSpos, 
+    RSneg, 
     RSequal
 }
 impl RSset {
@@ -38,19 +39,19 @@ impl Default for RSset {
 }
 impl fmt::Display for RSset {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            RSset::RSnone => write!(f, "RSnone"),
-            RSset::RSpos => write!(f, "RSpos"),
-            RSset::RSneg => write!(f, "RSneg"),
-            RSset::RSequal => write!(f, "RSequal"),
-        }
+       match *self {
+           RSset::RSnone => write!(f, "RSnone"),
+           RSset::RSpos => write!(f, "RSpos"),
+           RSset::RSneg => write!(f, "RSneg"),
+           RSset::RSequal => write!(f, "RSequal"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum ODset {
-    ODnone,
-    ODclose,
+    ODnone, 
+    ODclose, 
     ODveryclose
 }
 impl ODset {
@@ -63,11 +64,11 @@ impl Default for ODset {
 }
 impl fmt::Display for ODset {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            ODset::ODnone => write!(f, "ODnone"),
-            ODset::ODclose => write!(f, "ODclose"),
-            ODset::ODveryclose => write!(f, "ODveryclose"),
-        }
+       match *self {
+           ODset::ODnone => write!(f, "ODnone"),
+           ODset::ODclose => write!(f, "ODclose"),
+           ODset::ODveryclose => write!(f, "ODveryclose"),
+       }
     }
 }
 
@@ -144,6 +145,29 @@ pub struct Cruise_finite1_deterministic_MC {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_ObstacleBecomesOld: Option<bool>,}
 
+impl fmt::Display for Cruise_finite1_deterministic_MC {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "Cruise_finite1_deterministic_MC: (".to_owned();
+        result += &format!("_get_CruiseAllowed: {}, ", self._get_CruiseAllowed());
+        result += &format!("_get_CruiseActive: {}, ", self._get_CruiseActive());
+        result += &format!("_get_VehicleAtCruiseSpeed: {}, ", self._get_VehicleAtCruiseSpeed());
+        result += &format!("_get_VehicleCanKeepSpeed: {}, ", self._get_VehicleCanKeepSpeed());
+        result += &format!("_get_VehicleTryKeepSpeed: {}, ", self._get_VehicleTryKeepSpeed());
+        result += &format!("_get_SpeedAboveMax: {}, ", self._get_SpeedAboveMax());
+        result += &format!("_get_VehicleTryKeepTimeGap: {}, ", self._get_VehicleTryKeepTimeGap());
+        result += &format!("_get_CruiseSpeedAtMax: {}, ", self._get_CruiseSpeedAtMax());
+        result += &format!("_get_ObstaclePresent: {}, ", self._get_ObstaclePresent());
+        result += &format!("_get_ObstacleDistance: {}, ", self._get_ObstacleDistance());
+        result += &format!("_get_ObstacleRelativeSpeed: {}, ", self._get_ObstacleRelativeSpeed());
+        result += &format!("_get_ObstacleStatusJustChanged: {}, ", self._get_ObstacleStatusJustChanged());
+        result += &format!("_get_CCInitialisationInProgress: {}, ", self._get_CCInitialisationInProgress());
+        result += &format!("_get_CruiseSpeedChangeInProgress: {}, ", self._get_CruiseSpeedChangeInProgress());
+        result += &format!("_get_NumberOfSetCruise: {}, ", self._get_NumberOfSetCruise());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl Cruise_finite1_deterministic_MC {
 
     pub fn new() -> Cruise_finite1_deterministic_MC {
@@ -172,71 +196,71 @@ impl Cruise_finite1_deterministic_MC {
         self.ObstacleRelativeSpeed = RSset::RSnone;
     }
 
-    pub fn get_CruiseAllowed(&self) -> BBoolean {
+    pub fn _get_CruiseAllowed(&self) -> BBoolean {
         return self.CruiseAllowed.clone();
     }
 
-    pub fn get_CruiseActive(&self) -> BBoolean {
+    pub fn _get_CruiseActive(&self) -> BBoolean {
         return self.CruiseActive.clone();
     }
 
-    pub fn get_VehicleAtCruiseSpeed(&self) -> BBoolean {
+    pub fn _get_VehicleAtCruiseSpeed(&self) -> BBoolean {
         return self.VehicleAtCruiseSpeed.clone();
     }
 
-    pub fn get_VehicleCanKeepSpeed(&self) -> BBoolean {
+    pub fn _get_VehicleCanKeepSpeed(&self) -> BBoolean {
         return self.VehicleCanKeepSpeed.clone();
     }
 
-    pub fn get_VehicleTryKeepSpeed(&self) -> BBoolean {
+    pub fn _get_VehicleTryKeepSpeed(&self) -> BBoolean {
         return self.VehicleTryKeepSpeed.clone();
     }
 
-    pub fn get_SpeedAboveMax(&self) -> BBoolean {
+    pub fn _get_SpeedAboveMax(&self) -> BBoolean {
         return self.SpeedAboveMax.clone();
     }
 
-    pub fn get_VehicleTryKeepTimeGap(&self) -> BBoolean {
+    pub fn _get_VehicleTryKeepTimeGap(&self) -> BBoolean {
         return self.VehicleTryKeepTimeGap.clone();
     }
 
-    pub fn get_CruiseSpeedAtMax(&self) -> BBoolean {
+    pub fn _get_CruiseSpeedAtMax(&self) -> BBoolean {
         return self.CruiseSpeedAtMax.clone();
     }
 
-    pub fn get_ObstaclePresent(&self) -> BBoolean {
+    pub fn _get_ObstaclePresent(&self) -> BBoolean {
         return self.ObstaclePresent.clone();
     }
 
-    pub fn get_ObstacleDistance(&self) -> ODset {
+    pub fn _get_ObstacleDistance(&self) -> ODset {
         return self.ObstacleDistance.clone();
     }
 
-    pub fn get_ObstacleRelativeSpeed(&self) -> RSset {
+    pub fn _get_ObstacleRelativeSpeed(&self) -> RSset {
         return self.ObstacleRelativeSpeed.clone();
     }
 
-    pub fn get_ObstacleStatusJustChanged(&self) -> BBoolean {
+    pub fn _get_ObstacleStatusJustChanged(&self) -> BBoolean {
         return self.ObstacleStatusJustChanged.clone();
     }
 
-    pub fn get_CCInitialisationInProgress(&self) -> BBoolean {
+    pub fn _get_CCInitialisationInProgress(&self) -> BBoolean {
         return self.CCInitialisationInProgress.clone();
     }
 
-    pub fn get_CruiseSpeedChangeInProgress(&self) -> BBoolean {
+    pub fn _get_CruiseSpeedChangeInProgress(&self) -> BBoolean {
         return self.CruiseSpeedChangeInProgress.clone();
     }
 
-    pub fn get_NumberOfSetCruise(&self) -> BInteger {
+    pub fn _get_NumberOfSetCruise(&self) -> BInteger {
         return self.NumberOfSetCruise.clone();
     }
 
-    pub fn get__RSset(&self) -> BSet<RSset> {
+    pub fn _get__RSset(&self) -> BSet<RSset> {
         return self._RSset.clone();
     }
 
-    pub fn get__ODset(&self) -> BSet<ODset> {
+    pub fn _get__ODset(&self) -> BSet<ODset> {
         return self._ODset.clone();
     }
 
@@ -287,7 +311,7 @@ impl Cruise_finite1_deterministic_MC {
         }
         if (_ld_NumberOfSetCruise.less(&BInteger::new(1))).booleanValue() {
             self.NumberOfSetCruise = _ld_NumberOfSetCruise.plus(&BInteger::new(1));
-        }
+        } 
 
     }
 
@@ -299,7 +323,7 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn CCInitialisationDelayFinished(&mut self) -> () {
-        if (self.CCInitialisationInProgress.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() {
+        if ((((((self.CCInitialisationInProgress.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() {
             self.CCInitialisationInProgress = BBoolean::new(true);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -307,7 +331,7 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn CruiseSpeedChangeFinished(&mut self, mut vtks: BBoolean, mut vtktg: BBoolean) -> () {
-        if (butils::BOOL.elementOf(&vtks).and(&butils::BOOL.elementOf(&vtktg)).and(&vtks.equal(&BBoolean::new(true)).or(&vtktg.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&vtks.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtks.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((((((((((((butils::BOOL.elementOf(&vtks) && butils::BOOL.elementOf(&vtktg)) && (((vtks.equal(&BBoolean::new(true)) || vtktg.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true)))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&vtktg.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&vtks.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&vtks.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&vtktg.equal(&BBoolean::new(false)))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).booleanValue() {
             self.VehicleTryKeepTimeGap = vtktg;
             self.VehicleTryKeepSpeed = vtks;
         } else {
@@ -316,7 +340,7 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn CruiseSpeedChangeDelayFinished(&mut self) -> () {
-        if (self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() {
+        if ((((((self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() {
             self.CruiseSpeedChangeInProgress = BBoolean::new(true);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -350,7 +374,7 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn ExternalForcesBecomesNormal(&mut self) -> () {
-        if (self.CruiseActive.equal(&BBoolean::new(true)).and(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)))).booleanValue() {
+        if ((self.CruiseActive.equal(&BBoolean::new(true)) && self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)))).booleanValue() {
             self.VehicleCanKeepSpeed = BBoolean::new(true);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -358,7 +382,7 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn VehicleLeavesCruiseSpeed(&mut self) -> () {
-        if (self.VehicleAtCruiseSpeed.equal(&BBoolean::new(true)).and(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).or(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(false)))).booleanValue() {
+        if (((self.VehicleAtCruiseSpeed.equal(&BBoolean::new(true)) && (self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)) && self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) || self.VehicleTryKeepSpeed.equal(&BBoolean::new(false)))).booleanValue() {
             self.VehicleAtCruiseSpeed = BBoolean::new(false);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -366,7 +390,7 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn VehicleReachesCruiseSpeed(&mut self) -> () {
-        if (self.CruiseActive.equal(&BBoolean::new(true)).and(&self.VehicleAtCruiseSpeed.equal(&BBoolean::new(false))).and(&self.SpeedAboveMax.equal(&BBoolean::new(false)))).booleanValue() {
+        if (((self.CruiseActive.equal(&BBoolean::new(true)) && self.VehicleAtCruiseSpeed.equal(&BBoolean::new(false))) && self.SpeedAboveMax.equal(&BBoolean::new(false)))).booleanValue() {
             self.VehicleAtCruiseSpeed = BBoolean::new(true);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -374,7 +398,7 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn VehicleExceedsMaxCruiseSpeed(&mut self) -> () {
-        if (self.SpeedAboveMax.equal(&BBoolean::new(false)).and(&self.CruiseActive.equal(&BBoolean::new(false)).or(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))))).booleanValue() {
+        if ((self.SpeedAboveMax.equal(&BBoolean::new(false)) && ((self.CruiseActive.equal(&BBoolean::new(false)) || self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))) || ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))))).booleanValue() {
             self.SpeedAboveMax = BBoolean::new(true);
             self.VehicleAtCruiseSpeed = BBoolean::new(false);
         } else {
@@ -385,16 +409,16 @@ impl Cruise_finite1_deterministic_MC {
     pub fn VehicleFallsBelowMaxCruiseSpeed(&mut self) -> () {
         if (self.SpeedAboveMax.equal(&BBoolean::new(true))).booleanValue() {
             self.SpeedAboveMax = BBoolean::new(false);
-            if (self.CruiseActive.equal(&BBoolean::new(true)).and(&self.CruiseSpeedAtMax.equal(&BBoolean::new(true)))).booleanValue() {
+            if ((self.CruiseActive.equal(&BBoolean::new(true)) && self.CruiseSpeedAtMax.equal(&BBoolean::new(true)))).booleanValue() {
                 self.VehicleAtCruiseSpeed = BBoolean::new(true);
-            }
+            } 
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
         }
     }
 
     pub fn ObstacleDistanceBecomesVeryClose(&mut self) -> () {
-        if (self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg))).booleanValue() {
+        if ((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSneg))).booleanValue() {
             self.ObstacleDistance = ODset::ODveryclose;
             self.ObstacleStatusJustChanged = BBoolean::new(true);
         } else {
@@ -403,19 +427,19 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn ObstacleDistanceBecomesClose(&mut self) -> () {
-        if (self.ObstaclePresent.equal(&BBoolean::new(true)).and(&self.CruiseActive.equal(&BBoolean::new(true))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).or(&self.ObstacleDistance.equal(&ODset::ODnone).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg))))).booleanValue() {
+        if (((self.ObstaclePresent.equal(&BBoolean::new(true)) && self.CruiseActive.equal(&BBoolean::new(true))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSpos)) || (self.ObstacleDistance.equal(&ODset::ODnone) && self.ObstacleRelativeSpeed.equal(&RSset::RSneg))))).booleanValue() {
             self.ObstacleDistance = ODset::ODclose;
             self.ObstacleStatusJustChanged = BBoolean::new(true);
             if (self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).booleanValue() {
                 self.VehicleTryKeepTimeGap = BBoolean::new(false);
-            }
+            } 
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
         }
     }
 
     pub fn ObstacleDistanceBecomesBig(&mut self) -> () {
-        if (self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos))).booleanValue() {
+        if ((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSpos))).booleanValue() {
             self.ObstacleStatusJustChanged = BBoolean::new(true);
             self.ObstacleDistance = ODset::ODnone;
             self.VehicleTryKeepTimeGap = BBoolean::new(false);
@@ -425,14 +449,14 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn ObstacleStartsTravelFaster(&mut self) -> () {
-        if (self.ObstaclePresent.equal(&BBoolean::new(true)).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal))).booleanValue() {
+        if ((self.ObstaclePresent.equal(&BBoolean::new(true)) && self.ObstacleRelativeSpeed.equal(&RSset::RSequal))).booleanValue() {
             self.ObstacleRelativeSpeed = RSset::RSpos;
             if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() {
                 self.ObstacleStatusJustChanged = BBoolean::new(true);
-            }
+            } 
             if (self.ObstacleDistance.unequal(&ODset::ODveryclose)).booleanValue() {
                 self.VehicleTryKeepTimeGap = BBoolean::new(false);
-            }
+            } 
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
         }
@@ -443,7 +467,7 @@ impl Cruise_finite1_deterministic_MC {
             self.ObstacleRelativeSpeed = RSset::RSequal;
             if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() {
                 self.ObstacleStatusJustChanged = BBoolean::new(true);
-            }
+            } 
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
         }
@@ -454,7 +478,7 @@ impl Cruise_finite1_deterministic_MC {
             self.ObstacleRelativeSpeed = RSset::RSneg;
             if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() {
                 self.ObstacleStatusJustChanged = BBoolean::new(true);
-            }
+            } 
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
         }
@@ -465,7 +489,7 @@ impl Cruise_finite1_deterministic_MC {
             self.ObstacleRelativeSpeed = RSset::RSequal;
             if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() {
                 self.ObstacleStatusJustChanged = BBoolean::new(true);
-            }
+            } 
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
         }
@@ -494,7 +518,7 @@ impl Cruise_finite1_deterministic_MC {
             self.ObstacleRelativeSpeed = RSset::RSnone;
             if (self.CruiseActive.equal(&BBoolean::new(true))).booleanValue() {
                 self.ObstacleStatusJustChanged = BBoolean::new(true);
-            }
+            } 
             self.ObstacleDistance = ODset::ODnone;
             self.VehicleTryKeepTimeGap = BBoolean::new(false);
         } else {
@@ -503,7 +527,7 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn VehicleManageObstacle(&mut self, mut vtks: BBoolean, mut vtktg: BBoolean) -> () {
-        if (butils::BOOL.elementOf(&vtks).and(&butils::BOOL.elementOf(&vtktg)).and(&vtks.equal(&BBoolean::new(true)).or(&vtktg.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&vtks.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtks.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&vtktg.equal(&BBoolean::new(false)))).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((((((((((((butils::BOOL.elementOf(&vtks) && butils::BOOL.elementOf(&vtktg)) && (((vtks.equal(&BBoolean::new(true)) || vtktg.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&vtktg.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&vtks.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtktg.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&vtks.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&vtktg.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&vtktg.equal(&BBoolean::new(false)))) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)))).booleanValue() {
             self.VehicleTryKeepTimeGap = vtktg;
             self.VehicleTryKeepSpeed = vtks;
         } else {
@@ -512,7 +536,7 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     pub fn ObstacleBecomesOld(&mut self) -> () {
-        if (self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() {
+        if ((((((self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))))).booleanValue() {
             self.ObstacleStatusJustChanged = BBoolean::new(false);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -545,6 +569,7 @@ impl Cruise_finite1_deterministic_MC {
         //transition
         if !is_caching || self._tr_cache_SetCruiseSpeed.is_none() {
             let mut _ic_set_2: BSet<BTuple<BBoolean, BBoolean>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_vcks_1 in butils::BOOL.clone().iter().cloned() {
                 for _ic_csam_1 in butils::BOOL.clone().iter().cloned() {
                     if (self.CruiseAllowed.equal(&BBoolean::new(true))).booleanValue() {
@@ -564,9 +589,10 @@ impl Cruise_finite1_deterministic_MC {
         //transition
         if !is_caching || self._tr_cache_CCInitialisationFinished.is_none() {
             let mut _ic_set_3: BSet<BTuple<BBoolean, BBoolean>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_vtks_1 in butils::BOOL.clone().iter().cloned() {
                 for _ic_vtktg_1 in butils::BOOL.clone().iter().cloned() {
-                    if (_ic_vtks_1.equal(&BBoolean::new(true)).or(&_ic_vtktg_1.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).booleanValue() {
+                    if (((((((((((((_ic_vtks_1.equal(&BBoolean::new(true)) || _ic_vtktg_1.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).booleanValue() {
                         _ic_set_3 = _ic_set_3._union(&BSet::new(vec![BTuple::from_refs(&_ic_vtks_1, &_ic_vtktg_1)]));
                     }
 
@@ -582,7 +608,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_CCInitialisationDelayFinished(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_CCInitialisationDelayFinished.is_none() {
-            let mut __tmp__val__ = self.CCInitialisationInProgress.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue();
+            let mut __tmp__val__ = (((((self.CCInitialisationInProgress.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue();
             self._tr_cache_CCInitialisationDelayFinished = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -594,9 +620,10 @@ impl Cruise_finite1_deterministic_MC {
         //transition
         if !is_caching || self._tr_cache_CruiseSpeedChangeFinished.is_none() {
             let mut _ic_set_5: BSet<BTuple<BBoolean, BBoolean>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_vtks_1 in butils::BOOL.clone().iter().cloned() {
                 for _ic_vtktg_1 in butils::BOOL.clone().iter().cloned() {
-                    if (_ic_vtks_1.equal(&BBoolean::new(true)).or(&_ic_vtktg_1.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).booleanValue() {
+                    if (((((((((((((_ic_vtks_1.equal(&BBoolean::new(true)) || _ic_vtktg_1.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).booleanValue() {
                         _ic_set_5 = _ic_set_5._union(&BSet::new(vec![BTuple::from_refs(&_ic_vtks_1, &_ic_vtktg_1)]));
                     }
 
@@ -612,7 +639,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_CruiseSpeedChangeDelayFinished(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_CruiseSpeedChangeDelayFinished.is_none() {
-            let mut __tmp__val__ = self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue();
+            let mut __tmp__val__ = (((((self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.ObstacleStatusJustChanged.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(false))) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue();
             self._tr_cache_CruiseSpeedChangeDelayFinished = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -645,7 +672,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_ExternalForcesBecomesNormal(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_ExternalForcesBecomesNormal.is_none() {
-            let mut __tmp__val__ = self.CruiseActive.equal(&BBoolean::new(true)).and(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))).booleanValue();
+            let mut __tmp__val__ = (self.CruiseActive.equal(&BBoolean::new(true)) && self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))).booleanValue();
             self._tr_cache_ExternalForcesBecomesNormal = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -656,7 +683,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_VehicleLeavesCruiseSpeed(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_VehicleLeavesCruiseSpeed.is_none() {
-            let mut __tmp__val__ = self.VehicleAtCruiseSpeed.equal(&BBoolean::new(true)).and(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).or(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(false))).booleanValue();
+            let mut __tmp__val__ = ((self.VehicleAtCruiseSpeed.equal(&BBoolean::new(true)) && (self.VehicleCanKeepSpeed.equal(&BBoolean::new(false)) && self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) || self.VehicleTryKeepSpeed.equal(&BBoolean::new(false))).booleanValue();
             self._tr_cache_VehicleLeavesCruiseSpeed = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -667,7 +694,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_VehicleReachesCruiseSpeed(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_VehicleReachesCruiseSpeed.is_none() {
-            let mut __tmp__val__ = self.CruiseActive.equal(&BBoolean::new(true)).and(&self.VehicleAtCruiseSpeed.equal(&BBoolean::new(false))).and(&self.SpeedAboveMax.equal(&BBoolean::new(false))).booleanValue();
+            let mut __tmp__val__ = ((self.CruiseActive.equal(&BBoolean::new(true)) && self.VehicleAtCruiseSpeed.equal(&BBoolean::new(false))) && self.SpeedAboveMax.equal(&BBoolean::new(false))).booleanValue();
             self._tr_cache_VehicleReachesCruiseSpeed = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -678,7 +705,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_VehicleExceedsMaxCruiseSpeed(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_VehicleExceedsMaxCruiseSpeed.is_none() {
-            let mut __tmp__val__ = self.SpeedAboveMax.equal(&BBoolean::new(false)).and(&self.CruiseActive.equal(&BBoolean::new(false)).or(&self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))))).booleanValue();
+            let mut __tmp__val__ = (self.SpeedAboveMax.equal(&BBoolean::new(false)) && ((self.CruiseActive.equal(&BBoolean::new(false)) || self.VehicleCanKeepSpeed.equal(&BBoolean::new(false))) || ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))))).booleanValue();
             self._tr_cache_VehicleExceedsMaxCruiseSpeed = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -700,7 +727,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_ObstacleDistanceBecomesVeryClose(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_ObstacleDistanceBecomesVeryClose.is_none() {
-            let mut __tmp__val__ = self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg)).booleanValue();
+            let mut __tmp__val__ = (self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSneg)).booleanValue();
             self._tr_cache_ObstacleDistanceBecomesVeryClose = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -711,7 +738,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_ObstacleDistanceBecomesClose(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_ObstacleDistanceBecomesClose.is_none() {
-            let mut __tmp__val__ = self.ObstaclePresent.equal(&BBoolean::new(true)).and(&self.CruiseActive.equal(&BBoolean::new(true))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).or(&self.ObstacleDistance.equal(&ODset::ODnone).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg)))).booleanValue();
+            let mut __tmp__val__ = ((self.ObstaclePresent.equal(&BBoolean::new(true)) && self.CruiseActive.equal(&BBoolean::new(true))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSpos)) || (self.ObstacleDistance.equal(&ODset::ODnone) && self.ObstacleRelativeSpeed.equal(&RSset::RSneg)))).booleanValue();
             self._tr_cache_ObstacleDistanceBecomesClose = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -722,7 +749,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_ObstacleDistanceBecomesBig(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_ObstacleDistanceBecomesBig.is_none() {
-            let mut __tmp__val__ = self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).booleanValue();
+            let mut __tmp__val__ = (self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.equal(&RSset::RSpos)).booleanValue();
             self._tr_cache_ObstacleDistanceBecomesBig = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -733,7 +760,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_ObstacleStartsTravelFaster(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_ObstacleStartsTravelFaster.is_none() {
-            let mut __tmp__val__ = self.ObstaclePresent.equal(&BBoolean::new(true)).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal)).booleanValue();
+            let mut __tmp__val__ = (self.ObstaclePresent.equal(&BBoolean::new(true)) && self.ObstacleRelativeSpeed.equal(&RSset::RSequal)).booleanValue();
             self._tr_cache_ObstacleStartsTravelFaster = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -778,9 +805,10 @@ impl Cruise_finite1_deterministic_MC {
         //transition
         if !is_caching || self._tr_cache_ObstacleAppearsWhenCruiseActive.is_none() {
             let mut _ic_set_21: BSet<BTuple<RSset, ODset>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_ors_1 in self._RSset.difference(&BSet::new(vec![RSset::RSnone])).clone().iter().cloned() {
                 for _ic_od_1 in self._ODset.difference(&BSet::new(vec![ODset::ODnone])).clone().iter().cloned() {
-                    if (self.ObstaclePresent.equal(&BBoolean::new(false)).and(&self.CruiseActive.equal(&BBoolean::new(true)))).booleanValue() {
+                    if ((self.ObstaclePresent.equal(&BBoolean::new(false)) && self.CruiseActive.equal(&BBoolean::new(true)))).booleanValue() {
                         _ic_set_21 = _ic_set_21._union(&BSet::new(vec![BTuple::from_refs(&_ic_ors_1, &_ic_od_1)]));
                     }
 
@@ -797,8 +825,9 @@ impl Cruise_finite1_deterministic_MC {
         //transition
         if !is_caching || self._tr_cache_ObstacleAppearsWhenCruiseInactive.is_none() {
             let mut _ic_set_22: BSet<RSset> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_ors_1 in self._RSset.difference(&BSet::new(vec![RSset::RSnone])).clone().iter().cloned() {
-                if (self.ObstaclePresent.equal(&BBoolean::new(false)).and(&self.CruiseActive.equal(&BBoolean::new(false)))).booleanValue() {
+                if ((self.ObstaclePresent.equal(&BBoolean::new(false)) && self.CruiseActive.equal(&BBoolean::new(false)))).booleanValue() {
                     _ic_set_22 = _ic_set_22._union(&BSet::new(vec![_ic_ors_1]));
                 }
 
@@ -825,9 +854,10 @@ impl Cruise_finite1_deterministic_MC {
         //transition
         if !is_caching || self._tr_cache_VehicleManageObstacle.is_none() {
             let mut _ic_set_24: BSet<BTuple<BBoolean, BBoolean>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_vtks_1 in butils::BOOL.clone().iter().cloned() {
                 for _ic_vtktg_1 in butils::BOOL.clone().iter().cloned() {
-                    if (_ic_vtks_1.equal(&BBoolean::new(true)).or(&_ic_vtktg_1.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true))).and(&self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)))).booleanValue() {
+                    if (((((((((((((_ic_vtks_1.equal(&BBoolean::new(true)) || _ic_vtktg_1.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true))) && self.ObstaclePresent.equal(&BBoolean::new(false)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtktg_1.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&_ic_vtks_1.equal(&BBoolean::new(true)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&_ic_vtktg_1.equal(&BBoolean::new(false)))) && self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)))).booleanValue() {
                         _ic_set_24 = _ic_set_24._union(&BSet::new(vec![BTuple::from_refs(&_ic_vtks_1, &_ic_vtktg_1)]));
                     }
 
@@ -843,7 +873,7 @@ impl Cruise_finite1_deterministic_MC {
     pub fn _tr_ObstacleBecomesOld(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_ObstacleBecomesOld.is_none() {
-            let mut __tmp__val__ = self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)).and(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.CCInitialisationInProgress.equal(&BBoolean::new(true))).or(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))).and(&self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue();
+            let mut __tmp__val__ = (((((self.ObstacleStatusJustChanged.equal(&BBoolean::new(true)) && (((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || self.CCInitialisationInProgress.equal(&BBoolean::new(true))) || self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(true)))) && self.ObstacleDistance.equal(&ODset::ODnone).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))) && (((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && ((self.ObstacleDistance.equal(&ODset::ODveryclose) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true)))) && (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)))).booleanValue();
             self._tr_cache_ObstacleBecomesOld = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -998,17 +1028,17 @@ impl Cruise_finite1_deterministic_MC {
 
     pub fn _check_inv_30(&self) -> bool {
         //invariant
-        return self.ObstacleRelativeSpeed.equal(&RSset::RSequal).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue();
+        return (self.ObstacleRelativeSpeed.equal(&RSset::RSequal) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue();
     }
 
     pub fn _check_inv_31(&self) -> bool {
         //invariant
-        return self.ObstacleRelativeSpeed.equal(&RSset::RSneg).and(&self.ObstacleDistance.equal(&ODset::ODnone)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue();
+        return (self.ObstacleRelativeSpeed.equal(&RSset::RSneg) && self.ObstacleDistance.equal(&ODset::ODnone)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue();
     }
 
     pub fn _check_inv_32(&self) -> bool {
         //invariant
-        return self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue();
+        return (self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(false))).booleanValue();
     }
 
     pub fn _check_inv_33(&self) -> bool {
@@ -1023,34 +1053,33 @@ impl Cruise_finite1_deterministic_MC {
 
     pub fn _check_inv_35(&self) -> bool {
         //invariant
-        return self.CruiseActive.equal(&BBoolean::new(true)).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)).or(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).or(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).not())).booleanValue();
+        return self.CruiseActive.equal(&BBoolean::new(true)).implies(&((self.VehicleTryKeepSpeed.equal(&BBoolean::new(true)) || self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))) || ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false))).not())).booleanValue();
     }
 
     pub fn _check_inv_36(&self) -> bool {
         //invariant
-        return self.ObstacleDistance.equal(&ODset::ODnone).and(&self.CruiseActive.equal(&BBoolean::new(true))).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))).booleanValue();
+        return ((self.ObstacleDistance.equal(&ODset::ODnone) && self.CruiseActive.equal(&BBoolean::new(true))) && ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))).booleanValue();
     }
 
     pub fn _check_inv_37(&self) -> bool {
         //invariant
-        return self.ObstacleDistance.equal(&ODset::ODclose).and(&self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).booleanValue();
+        return ((self.ObstacleDistance.equal(&ODset::ODclose) && self.ObstacleRelativeSpeed.unequal(&RSset::RSpos)) && ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).booleanValue();
     }
 
     pub fn _check_inv_38(&self) -> bool {
         //invariant
-        return self.ObstacleDistance.equal(&ODset::ODveryclose).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).booleanValue();
+        return (self.ObstacleDistance.equal(&ODset::ODveryclose) && ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepTimeGap.equal(&BBoolean::new(true))).booleanValue();
     }
 
     pub fn _check_inv_39(&self) -> bool {
         //invariant
-        return self.ObstacleRelativeSpeed.equal(&RSset::RSpos).and(&self.ObstacleDistance.unequal(&ODset::ODveryclose)).and(&self.CruiseActive.equal(&BBoolean::new(true))).and(&self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)).and(&self.CCInitialisationInProgress.equal(&BBoolean::new(false))).and(&self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))).booleanValue();
+        return (((self.ObstacleRelativeSpeed.equal(&RSset::RSpos) && self.ObstacleDistance.unequal(&ODset::ODveryclose)) && self.CruiseActive.equal(&BBoolean::new(true))) && ((self.ObstacleStatusJustChanged.equal(&BBoolean::new(false)) && self.CCInitialisationInProgress.equal(&BBoolean::new(false))) && self.CruiseSpeedChangeInProgress.equal(&BBoolean::new(false)))).implies(&self.VehicleTryKeepSpeed.equal(&BBoolean::new(true))).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_CruiseBecomesNotAllowed" => {self._tr_CruiseBecomesNotAllowed(false);},
                 "_tr_CruiseBecomesAllowed" => {self._tr_CruiseBecomesAllowed(false);},
                 "_tr_SetCruiseSpeed" => {self._tr_SetCruiseSpeed(false);},
@@ -1085,1211 +1114,559 @@ impl Cruise_finite1_deterministic_MC {
     //model_check_next_states
     fn generateNextStates(state: &mut Cruise_finite1_deterministic_MC,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<Cruise_finite1_deterministic_MC, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_guard_m: Arc<Mutex<HashMap<Cruise_finite1_deterministic_MC, HashSet<&str>>>>,
-                          guardCache: Arc<Mutex<HashMap<Cruise_finite1_deterministic_MC, PersistentHashMap<&str, bool>>>>,
-                          parents_m: Arc<Mutex<HashMap<Cruise_finite1_deterministic_MC, Cruise_finite1_deterministic_MC>>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<Cruise_finite1_deterministic_MC> {
-        let mut result = HashSet::<Cruise_finite1_deterministic_MC>::new();
-        if isCaching {
-            let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned());
-            let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() };
-            //model_check_transition
-            let mut _trid_1 = state._tr_CruiseBecomesNotAllowed(isCaching);
-            if _trid_1 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CruiseBecomesNotAllowed();
-                match guard_dependency.get("CruiseBecomesNotAllowed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("CruiseBecomesNotAllowed").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseBecomesNotAllowed").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_CruiseBecomesAllowed(isCaching);
-            if _trid_2 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CruiseBecomesAllowed();
-                match guard_dependency.get("CruiseBecomesAllowed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("CruiseBecomesAllowed").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseBecomesAllowed").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_SetCruiseSpeed(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.SetCruiseSpeed(_tmp_2, _tmp_1);
-                match guard_dependency.get("SetCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("SetCruiseSpeed").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("SetCruiseSpeed").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_CCInitialisationFinished(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.CCInitialisationFinished(_tmp_2, _tmp_1);
-                match guard_dependency.get("CCInitialisationFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("CCInitialisationFinished").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("CCInitialisationFinished").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_5 = state._tr_CCInitialisationDelayFinished(isCaching);
-            if _trid_5 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CCInitialisationDelayFinished();
-                match guard_dependency.get("CCInitialisationDelayFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("CCInitialisationDelayFinished").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("CCInitialisationDelayFinished").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_CruiseSpeedChangeFinished(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.CruiseSpeedChangeFinished(_tmp_2, _tmp_1);
-                match guard_dependency.get("CruiseSpeedChangeFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("CruiseSpeedChangeFinished").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseSpeedChangeFinished").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_7 = state._tr_CruiseSpeedChangeDelayFinished(isCaching);
-            if _trid_7 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CruiseSpeedChangeDelayFinished();
-                match guard_dependency.get("CruiseSpeedChangeDelayFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("CruiseSpeedChangeDelayFinished").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseSpeedChangeDelayFinished").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_8 = state._tr_CruiseOff(isCaching);
-            if _trid_8 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CruiseOff();
-                match guard_dependency.get("CruiseOff") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("CruiseOff").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("CruiseOff").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_9 = state._tr_ExternalForcesBecomesExtreme(isCaching);
-            if _trid_9 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ExternalForcesBecomesExtreme();
-                match guard_dependency.get("ExternalForcesBecomesExtreme") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ExternalForcesBecomesExtreme").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ExternalForcesBecomesExtreme").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_10 = state._tr_ExternalForcesBecomesNormal(isCaching);
-            if _trid_10 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ExternalForcesBecomesNormal();
-                match guard_dependency.get("ExternalForcesBecomesNormal") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ExternalForcesBecomesNormal").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ExternalForcesBecomesNormal").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_11 = state._tr_VehicleLeavesCruiseSpeed(isCaching);
-            if _trid_11 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.VehicleLeavesCruiseSpeed();
-                match guard_dependency.get("VehicleLeavesCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("VehicleLeavesCruiseSpeed").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleLeavesCruiseSpeed").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_12 = state._tr_VehicleReachesCruiseSpeed(isCaching);
-            if _trid_12 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.VehicleReachesCruiseSpeed();
-                match guard_dependency.get("VehicleReachesCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("VehicleReachesCruiseSpeed").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleReachesCruiseSpeed").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_13 = state._tr_VehicleExceedsMaxCruiseSpeed(isCaching);
-            if _trid_13 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.VehicleExceedsMaxCruiseSpeed();
-                match guard_dependency.get("VehicleExceedsMaxCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("VehicleExceedsMaxCruiseSpeed").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleExceedsMaxCruiseSpeed").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_14 = state._tr_VehicleFallsBelowMaxCruiseSpeed(isCaching);
-            if _trid_14 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.VehicleFallsBelowMaxCruiseSpeed();
-                match guard_dependency.get("VehicleFallsBelowMaxCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("VehicleFallsBelowMaxCruiseSpeed").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleFallsBelowMaxCruiseSpeed").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_15 = state._tr_ObstacleDistanceBecomesVeryClose(isCaching);
-            if _trid_15 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleDistanceBecomesVeryClose();
-                match guard_dependency.get("ObstacleDistanceBecomesVeryClose") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleDistanceBecomesVeryClose").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleDistanceBecomesVeryClose").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_16 = state._tr_ObstacleDistanceBecomesClose(isCaching);
-            if _trid_16 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleDistanceBecomesClose();
-                match guard_dependency.get("ObstacleDistanceBecomesClose") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleDistanceBecomesClose").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleDistanceBecomesClose").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_17 = state._tr_ObstacleDistanceBecomesBig(isCaching);
-            if _trid_17 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleDistanceBecomesBig();
-                match guard_dependency.get("ObstacleDistanceBecomesBig") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleDistanceBecomesBig").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleDistanceBecomesBig").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_18 = state._tr_ObstacleStartsTravelFaster(isCaching);
-            if _trid_18 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleStartsTravelFaster();
-                match guard_dependency.get("ObstacleStartsTravelFaster") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleStartsTravelFaster").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleStartsTravelFaster").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_19 = state._tr_ObstacleStopsTravelFaster(isCaching);
-            if _trid_19 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleStopsTravelFaster();
-                match guard_dependency.get("ObstacleStopsTravelFaster") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleStopsTravelFaster").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleStopsTravelFaster").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_20 = state._tr_ObstacleStartsTravelSlower(isCaching);
-            if _trid_20 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleStartsTravelSlower();
-                match guard_dependency.get("ObstacleStartsTravelSlower") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleStartsTravelSlower").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleStartsTravelSlower").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_21 = state._tr_ObstacleStopsTravelSlower(isCaching);
-            if _trid_21 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleStopsTravelSlower();
-                match guard_dependency.get("ObstacleStopsTravelSlower") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleStopsTravelSlower").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleStopsTravelSlower").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_22 = state._tr_ObstacleAppearsWhenCruiseActive(isCaching);
-            for param in _trid_22.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.ObstacleAppearsWhenCruiseActive(_tmp_2, _tmp_1);
-                match guard_dependency.get("ObstacleAppearsWhenCruiseActive") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleAppearsWhenCruiseActive").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleAppearsWhenCruiseActive").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_23 = state._tr_ObstacleAppearsWhenCruiseInactive(isCaching);
-            for param in _trid_23.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.ObstacleAppearsWhenCruiseInactive(_tmp_1);
-                match guard_dependency.get("ObstacleAppearsWhenCruiseInactive") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleAppearsWhenCruiseInactive").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleAppearsWhenCruiseInactive").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_24 = state._tr_ObstacleDisappears(isCaching);
-            if _trid_24 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleDisappears();
-                match guard_dependency.get("ObstacleDisappears") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleDisappears").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleDisappears").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_25 = state._tr_VehicleManageObstacle(isCaching);
-            for param in _trid_25.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.VehicleManageObstacle(_tmp_2, _tmp_1);
-                match guard_dependency.get("VehicleManageObstacle") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("VehicleManageObstacle").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("VehicleManageObstacle").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_26 = state._tr_ObstacleBecomesOld(isCaching);
-            if _trid_26 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleBecomesOld();
-                match guard_dependency.get("ObstacleBecomesOld") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("ObstacleBecomesOld").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("ObstacleBecomesOld").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
+                          transitions: Arc<AtomicU64>) -> HashSet<(Cruise_finite1_deterministic_MC, &'static str)> {
+        let mut result = HashSet::<(Cruise_finite1_deterministic_MC, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        if state._tr_CruiseBecomesNotAllowed(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.CruiseBecomesNotAllowed();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseBecomesNotAllowed")); }
+            result.insert((copiedState, "CruiseBecomesNotAllowed"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_CruiseBecomesAllowed(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.CruiseBecomesAllowed();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseBecomesAllowed")); }
+            result.insert((copiedState, "CruiseBecomesAllowed"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_3 = state._tr_SetCruiseSpeed(isCaching);
+        for param in _trid_3.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.SetCruiseSpeed(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("SetCruiseSpeed")); }
+            result.insert((copiedState, "SetCruiseSpeed"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_4 = state._tr_CCInitialisationFinished(isCaching);
+        for param in _trid_4.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.CCInitialisationFinished(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CCInitialisationFinished")); }
+            result.insert((copiedState, "CCInitialisationFinished"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_CCInitialisationDelayFinished(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.CCInitialisationDelayFinished();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CCInitialisationDelayFinished")); }
+            result.insert((copiedState, "CCInitialisationDelayFinished"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_6 = state._tr_CruiseSpeedChangeFinished(isCaching);
+        for param in _trid_6.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.CruiseSpeedChangeFinished(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseSpeedChangeFinished")); }
+            result.insert((copiedState, "CruiseSpeedChangeFinished"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_CruiseSpeedChangeDelayFinished(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.CruiseSpeedChangeDelayFinished();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseSpeedChangeDelayFinished")); }
+            result.insert((copiedState, "CruiseSpeedChangeDelayFinished"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_CruiseOff(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.CruiseOff();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("CruiseOff")); }
+            result.insert((copiedState, "CruiseOff"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ExternalForcesBecomesExtreme(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ExternalForcesBecomesExtreme();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ExternalForcesBecomesExtreme")); }
+            result.insert((copiedState, "ExternalForcesBecomesExtreme"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ExternalForcesBecomesNormal(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ExternalForcesBecomesNormal();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ExternalForcesBecomesNormal")); }
+            result.insert((copiedState, "ExternalForcesBecomesNormal"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_VehicleLeavesCruiseSpeed(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.VehicleLeavesCruiseSpeed();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleLeavesCruiseSpeed")); }
+            result.insert((copiedState, "VehicleLeavesCruiseSpeed"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_VehicleReachesCruiseSpeed(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.VehicleReachesCruiseSpeed();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleReachesCruiseSpeed")); }
+            result.insert((copiedState, "VehicleReachesCruiseSpeed"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_VehicleExceedsMaxCruiseSpeed(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.VehicleExceedsMaxCruiseSpeed();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleExceedsMaxCruiseSpeed")); }
+            result.insert((copiedState, "VehicleExceedsMaxCruiseSpeed"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_VehicleFallsBelowMaxCruiseSpeed(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.VehicleFallsBelowMaxCruiseSpeed();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleFallsBelowMaxCruiseSpeed")); }
+            result.insert((copiedState, "VehicleFallsBelowMaxCruiseSpeed"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ObstacleDistanceBecomesVeryClose(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ObstacleDistanceBecomesVeryClose();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleDistanceBecomesVeryClose")); }
+            result.insert((copiedState, "ObstacleDistanceBecomesVeryClose"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ObstacleDistanceBecomesClose(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ObstacleDistanceBecomesClose();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleDistanceBecomesClose")); }
+            result.insert((copiedState, "ObstacleDistanceBecomesClose"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ObstacleDistanceBecomesBig(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ObstacleDistanceBecomesBig();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleDistanceBecomesBig")); }
+            result.insert((copiedState, "ObstacleDistanceBecomesBig"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ObstacleStartsTravelFaster(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ObstacleStartsTravelFaster();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleStartsTravelFaster")); }
+            result.insert((copiedState, "ObstacleStartsTravelFaster"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ObstacleStopsTravelFaster(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ObstacleStopsTravelFaster();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleStopsTravelFaster")); }
+            result.insert((copiedState, "ObstacleStopsTravelFaster"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ObstacleStartsTravelSlower(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ObstacleStartsTravelSlower();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleStartsTravelSlower")); }
+            result.insert((copiedState, "ObstacleStartsTravelSlower"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ObstacleStopsTravelSlower(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ObstacleStopsTravelSlower();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleStopsTravelSlower")); }
+            result.insert((copiedState, "ObstacleStopsTravelSlower"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_22 = state._tr_ObstacleAppearsWhenCruiseActive(isCaching);
+        for param in _trid_22.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.ObstacleAppearsWhenCruiseActive(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleAppearsWhenCruiseActive")); }
+            result.insert((copiedState, "ObstacleAppearsWhenCruiseActive"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_23 = state._tr_ObstacleAppearsWhenCruiseInactive(isCaching);
+        for param in _trid_23.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.ObstacleAppearsWhenCruiseInactive(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleAppearsWhenCruiseInactive")); }
+            result.insert((copiedState, "ObstacleAppearsWhenCruiseInactive"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ObstacleDisappears(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ObstacleDisappears();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleDisappears")); }
+            result.insert((copiedState, "ObstacleDisappears"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_25 = state._tr_VehicleManageObstacle(isCaching);
+        for param in _trid_25.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.VehicleManageObstacle(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("VehicleManageObstacle")); }
+            result.insert((copiedState, "VehicleManageObstacle"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_ObstacleBecomesOld(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.ObstacleBecomesOld();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("ObstacleBecomesOld")); }
+            result.insert((copiedState, "ObstacleBecomesOld"));
+            evaluated_transitions += 1;
+        }
 
-            guardCache.lock().unwrap().insert(state.clone(), newCache);
-        } else {
-            //model_check_transition
-            if state._tr_CruiseBecomesNotAllowed(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CruiseBecomesNotAllowed();
-                match guard_dependency.get("CruiseBecomesNotAllowed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_CruiseBecomesAllowed(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CruiseBecomesAllowed();
-                match guard_dependency.get("CruiseBecomesAllowed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_SetCruiseSpeed(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.SetCruiseSpeed(_tmp_2, _tmp_1);
-                match guard_dependency.get("SetCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_CCInitialisationFinished(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.CCInitialisationFinished(_tmp_2, _tmp_1);
-                match guard_dependency.get("CCInitialisationFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_CCInitialisationDelayFinished(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CCInitialisationDelayFinished();
-                match guard_dependency.get("CCInitialisationDelayFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_CruiseSpeedChangeFinished(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.CruiseSpeedChangeFinished(_tmp_2, _tmp_1);
-                match guard_dependency.get("CruiseSpeedChangeFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_CruiseSpeedChangeDelayFinished(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CruiseSpeedChangeDelayFinished();
-                match guard_dependency.get("CruiseSpeedChangeDelayFinished") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_CruiseOff(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.CruiseOff();
-                match guard_dependency.get("CruiseOff") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ExternalForcesBecomesExtreme(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ExternalForcesBecomesExtreme();
-                match guard_dependency.get("ExternalForcesBecomesExtreme") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ExternalForcesBecomesNormal(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ExternalForcesBecomesNormal();
-                match guard_dependency.get("ExternalForcesBecomesNormal") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_VehicleLeavesCruiseSpeed(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.VehicleLeavesCruiseSpeed();
-                match guard_dependency.get("VehicleLeavesCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_VehicleReachesCruiseSpeed(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.VehicleReachesCruiseSpeed();
-                match guard_dependency.get("VehicleReachesCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_VehicleExceedsMaxCruiseSpeed(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.VehicleExceedsMaxCruiseSpeed();
-                match guard_dependency.get("VehicleExceedsMaxCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_VehicleFallsBelowMaxCruiseSpeed(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.VehicleFallsBelowMaxCruiseSpeed();
-                match guard_dependency.get("VehicleFallsBelowMaxCruiseSpeed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ObstacleDistanceBecomesVeryClose(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleDistanceBecomesVeryClose();
-                match guard_dependency.get("ObstacleDistanceBecomesVeryClose") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ObstacleDistanceBecomesClose(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleDistanceBecomesClose();
-                match guard_dependency.get("ObstacleDistanceBecomesClose") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ObstacleDistanceBecomesBig(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleDistanceBecomesBig();
-                match guard_dependency.get("ObstacleDistanceBecomesBig") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ObstacleStartsTravelFaster(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleStartsTravelFaster();
-                match guard_dependency.get("ObstacleStartsTravelFaster") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ObstacleStopsTravelFaster(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleStopsTravelFaster();
-                match guard_dependency.get("ObstacleStopsTravelFaster") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ObstacleStartsTravelSlower(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleStartsTravelSlower();
-                match guard_dependency.get("ObstacleStartsTravelSlower") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ObstacleStopsTravelSlower(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleStopsTravelSlower();
-                match guard_dependency.get("ObstacleStopsTravelSlower") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_22 = state._tr_ObstacleAppearsWhenCruiseActive(isCaching);
-            for param in _trid_22.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.ObstacleAppearsWhenCruiseActive(_tmp_2, _tmp_1);
-                match guard_dependency.get("ObstacleAppearsWhenCruiseActive") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_23 = state._tr_ObstacleAppearsWhenCruiseInactive(isCaching);
-            for param in _trid_23.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.ObstacleAppearsWhenCruiseInactive(_tmp_1);
-                match guard_dependency.get("ObstacleAppearsWhenCruiseInactive") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ObstacleDisappears(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleDisappears();
-                match guard_dependency.get("ObstacleDisappears") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_25 = state._tr_VehicleManageObstacle(isCaching);
-            for param in _trid_25.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.VehicleManageObstacle(_tmp_2, _tmp_1);
-                match guard_dependency.get("VehicleManageObstacle") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_ObstacleBecomesOld(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.ObstacleBecomesOld();
-                match guard_dependency.get("ObstacleBecomesOld") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
 
-        }
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &Cruise_finite1_deterministic_MC,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<Cruise_finite1_deterministic_MC, HashSet<&str>>>> ) -> bool {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &Cruise_finite1_deterministic_MC, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_2") {
+            if dependent_invariants_of_state.contains(&"_check_inv_2") {
                 if !state._check_inv_2() {
+                    println!("_check_inv_2 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_3") {
+            if dependent_invariants_of_state.contains(&"_check_inv_3") {
                 if !state._check_inv_3() {
+                    println!("_check_inv_3 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_4") {
+            if dependent_invariants_of_state.contains(&"_check_inv_4") {
                 if !state._check_inv_4() {
+                    println!("_check_inv_4 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_5") {
+            if dependent_invariants_of_state.contains(&"_check_inv_5") {
                 if !state._check_inv_5() {
+                    println!("_check_inv_5 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_6") {
+            if dependent_invariants_of_state.contains(&"_check_inv_6") {
                 if !state._check_inv_6() {
+                    println!("_check_inv_6 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_7") {
+            if dependent_invariants_of_state.contains(&"_check_inv_7") {
                 if !state._check_inv_7() {
+                    println!("_check_inv_7 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_8") {
+            if dependent_invariants_of_state.contains(&"_check_inv_8") {
                 if !state._check_inv_8() {
+                    println!("_check_inv_8 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_9") {
+            if dependent_invariants_of_state.contains(&"_check_inv_9") {
                 if !state._check_inv_9() {
+                    println!("_check_inv_9 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_10") {
+            if dependent_invariants_of_state.contains(&"_check_inv_10") {
                 if !state._check_inv_10() {
+                    println!("_check_inv_10 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_11") {
+            if dependent_invariants_of_state.contains(&"_check_inv_11") {
                 if !state._check_inv_11() {
+                    println!("_check_inv_11 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_12") {
+            if dependent_invariants_of_state.contains(&"_check_inv_12") {
                 if !state._check_inv_12() {
+                    println!("_check_inv_12 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_13") {
+            if dependent_invariants_of_state.contains(&"_check_inv_13") {
                 if !state._check_inv_13() {
+                    println!("_check_inv_13 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_14") {
+            if dependent_invariants_of_state.contains(&"_check_inv_14") {
                 if !state._check_inv_14() {
+                    println!("_check_inv_14 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_15") {
+            if dependent_invariants_of_state.contains(&"_check_inv_15") {
                 if !state._check_inv_15() {
+                    println!("_check_inv_15 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_16") {
+            if dependent_invariants_of_state.contains(&"_check_inv_16") {
                 if !state._check_inv_16() {
+                    println!("_check_inv_16 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_17") {
+            if dependent_invariants_of_state.contains(&"_check_inv_17") {
                 if !state._check_inv_17() {
+                    println!("_check_inv_17 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_18") {
+            if dependent_invariants_of_state.contains(&"_check_inv_18") {
                 if !state._check_inv_18() {
+                    println!("_check_inv_18 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_19") {
+            if dependent_invariants_of_state.contains(&"_check_inv_19") {
                 if !state._check_inv_19() {
+                    println!("_check_inv_19 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_20") {
+            if dependent_invariants_of_state.contains(&"_check_inv_20") {
                 if !state._check_inv_20() {
+                    println!("_check_inv_20 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_21") {
+            if dependent_invariants_of_state.contains(&"_check_inv_21") {
                 if !state._check_inv_21() {
+                    println!("_check_inv_21 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_22") {
+            if dependent_invariants_of_state.contains(&"_check_inv_22") {
                 if !state._check_inv_22() {
+                    println!("_check_inv_22 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_23") {
+            if dependent_invariants_of_state.contains(&"_check_inv_23") {
                 if !state._check_inv_23() {
+                    println!("_check_inv_23 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_24") {
+            if dependent_invariants_of_state.contains(&"_check_inv_24") {
                 if !state._check_inv_24() {
+                    println!("_check_inv_24 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_25") {
+            if dependent_invariants_of_state.contains(&"_check_inv_25") {
                 if !state._check_inv_25() {
+                    println!("_check_inv_25 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_26") {
+            if dependent_invariants_of_state.contains(&"_check_inv_26") {
                 if !state._check_inv_26() {
+                    println!("_check_inv_26 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_27") {
+            if dependent_invariants_of_state.contains(&"_check_inv_27") {
                 if !state._check_inv_27() {
+                    println!("_check_inv_27 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_28") {
+            if dependent_invariants_of_state.contains(&"_check_inv_28") {
                 if !state._check_inv_28() {
+                    println!("_check_inv_28 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_29") {
+            if dependent_invariants_of_state.contains(&"_check_inv_29") {
                 if !state._check_inv_29() {
+                    println!("_check_inv_29 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_30") {
+            if dependent_invariants_of_state.contains(&"_check_inv_30") {
                 if !state._check_inv_30() {
+                    println!("_check_inv_30 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_31") {
+            if dependent_invariants_of_state.contains(&"_check_inv_31") {
                 if !state._check_inv_31() {
+                    println!("_check_inv_31 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_32") {
+            if dependent_invariants_of_state.contains(&"_check_inv_32") {
                 if !state._check_inv_32() {
+                    println!("_check_inv_32 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_33") {
+            if dependent_invariants_of_state.contains(&"_check_inv_33") {
                 if !state._check_inv_33() {
+                    println!("_check_inv_33 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_34") {
+            if dependent_invariants_of_state.contains(&"_check_inv_34") {
                 if !state._check_inv_34() {
+                    println!("_check_inv_34 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_35") {
+            if dependent_invariants_of_state.contains(&"_check_inv_35") {
                 if !state._check_inv_35() {
+                    println!("_check_inv_35 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_36") {
+            if dependent_invariants_of_state.contains(&"_check_inv_36") {
                 if !state._check_inv_36() {
+                    println!("_check_inv_36 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_37") {
+            if dependent_invariants_of_state.contains(&"_check_inv_37") {
                 if !state._check_inv_37() {
+                    println!("_check_inv_37 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_38") {
+            if dependent_invariants_of_state.contains(&"_check_inv_38") {
                 if !state._check_inv_38() {
+                    println!("_check_inv_38 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_39") {
+            if dependent_invariants_of_state.contains(&"_check_inv_39") {
                 if !state._check_inv_39() {
+                    println!("_check_inv_39 failed!");
                     return false;
                 }
             }
@@ -2299,16 +1676,14 @@ impl Cruise_finite1_deterministic_MC {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<Cruise_finite1_deterministic_MC>>>, mc_type: MC_TYPE) -> Cruise_finite1_deterministic_MC {
+    fn next(collection_m: Arc<Mutex<LinkedList<(Cruise_finite1_deterministic_MC, &'static str)>>>, mc_type: MC_TYPE) -> (Cruise_finite1_deterministic_MC, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -2317,172 +1692,160 @@ impl Cruise_finite1_deterministic_MC {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = Cruise_finite1_deterministic_MC::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() || !machine._check_inv_21() || !machine._check_inv_22() || !machine._check_inv_23() || !machine._check_inv_24() || !machine._check_inv_25() || !machine._check_inv_26() || !machine._check_inv_27() || !machine._check_inv_28() || !machine._check_inv_29() || !machine._check_inv_30() || !machine._check_inv_31() || !machine._check_inv_32() || !machine._check_inv_33() || !machine._check_inv_34() || !machine._check_inv_35() || !machine._check_inv_36() || !machine._check_inv_37() || !machine._check_inv_38() || !machine._check_inv_39() {
-            invariant_violated.store(true, Ordering::Release);
-        }
-
-        let mut states = HashSet::<Cruise_finite1_deterministic_MC>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<Cruise_finite1_deterministic_MC>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, HashSet<&str>>::new()));
-        let mut guard_cache = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, Cruise_finite1_deterministic_MC>::new()));
-
-        if is_caching {
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            invariantDependency.insert("ObstacleStopsTravelSlower", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"]));
+            "ObstacleStopsTravelSlower" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"],
             //model_check_init_static
-            invariantDependency.insert("SetCruiseSpeed", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_34", "_check_inv_33", "_check_inv_26", "_check_inv_21", "_check_inv_20", "_check_inv_4", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"]));
+            "SetCruiseSpeed" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleAppearsWhenCruiseInactive"],
             //model_check_init_static
-            invariantDependency.insert("VehicleLeavesCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_34"]));
+            "VehicleLeavesCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"],
             //model_check_init_static
-            invariantDependency.insert("VehicleFallsBelowMaxCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"]));
+            "VehicleFallsBelowMaxCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"],
             //model_check_init_static
-            invariantDependency.insert("CCInitialisationFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"]));
+            "CCInitialisationFinished" => vec!["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"],
             //model_check_init_static
-            invariantDependency.insert("VehicleReachesCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_34"]));
+            "VehicleReachesCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleAppearsWhenCruiseActive", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"]));
+            "ObstacleAppearsWhenCruiseActive" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleStartsTravelSlower", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"]));
+            "ObstacleStartsTravelSlower" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"],
             //model_check_init_static
-            invariantDependency.insert("CruiseBecomesNotAllowed", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3", "_check_inv_1"]));
+            "CruiseBecomesNotAllowed" => vec!["_tr_SetCruiseSpeed", "_tr_VehicleManageObstacle", "_tr_CruiseBecomesAllowed", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseBecomesNotAllowed", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleAppearsWhenCruiseInactive", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_36", "_check_inv_13", "_check_inv_12", "_check_inv_23", "_check_inv_11"]));
+            "ObstacleAppearsWhenCruiseInactive" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"],
             //model_check_init_static
-            invariantDependency.insert("CCInitialisationDelayFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_36", "_check_inv_25", "_check_inv_35"]));
+            "CCInitialisationDelayFinished" => vec!["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleDistanceBecomesClose", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"]));
+            "ObstacleDistanceBecomesClose" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleStartsTravelFaster", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"]));
+            "ObstacleStartsTravelFaster" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"],
             //model_check_init_static
-            invariantDependency.insert("ExternalForcesBecomesExtreme", HashSet::from(["_check_inv_18", "_check_inv_4"]));
+            "ExternalForcesBecomesExtreme" => vec!["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"],
             //model_check_init_static
-            invariantDependency.insert("CruiseOff", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"]));
+            "CruiseOff" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"],
             //model_check_init_static
-            invariantDependency.insert("CruiseSpeedChangeDelayFinished", HashSet::from(["_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_37", "_check_inv_26", "_check_inv_36", "_check_inv_35"]));
+            "CruiseSpeedChangeDelayFinished" => vec!["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleStopsTravelFaster", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"]));
+            "ObstacleStopsTravelFaster" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleDistanceBecomesVeryClose", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"]));
+            "ObstacleDistanceBecomesVeryClose" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"],
             //model_check_init_static
-            invariantDependency.insert("VehicleManageObstacle", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"]));
+            "VehicleManageObstacle" => vec!["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"],
             //model_check_init_static
-            invariantDependency.insert("CruiseBecomesAllowed", HashSet::from(["_check_inv_1", "_check_inv_33"]));
+            "CruiseBecomesAllowed" => vec!["_tr_SetCruiseSpeed", "_tr_CruiseBecomesAllowed", "_tr_CruiseBecomesNotAllowed"],
             //model_check_init_static
-            invariantDependency.insert("VehicleExceedsMaxCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"]));
+            "VehicleExceedsMaxCruiseSpeed" => vec!["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"],
             //model_check_init_static
-            invariantDependency.insert("CruiseSpeedChangeFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"]));
+            "CruiseSpeedChangeFinished" => vec!["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleDisappears", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"]));
+            "ObstacleDisappears" => vec!["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"],
             //model_check_init_static
-            invariantDependency.insert("ExternalForcesBecomesNormal", HashSet::from(["_check_inv_18", "_check_inv_4"]));
+            "ExternalForcesBecomesNormal" => vec!["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleBecomesOld", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24"]));
+            "ObstacleBecomesOld" => vec!["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"],
             //model_check_init_static
-            invariantDependency.insert("ObstacleDistanceBecomesBig", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"]));
+            "ObstacleDistanceBecomesBig" => vec!["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"],
+            _ => vec![],
+        }
+    }
+
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            guardDependency.insert("ObstacleStopsTravelSlower", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"]));
+            "ObstacleStopsTravelSlower" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"],
             //model_check_init_static
-            guardDependency.insert("SetCruiseSpeed", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleAppearsWhenCruiseInactive"]));
+            "SetCruiseSpeed" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_34", "_check_inv_33", "_check_inv_26", "_check_inv_21", "_check_inv_20", "_check_inv_4", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"],
             //model_check_init_static
-            guardDependency.insert("VehicleLeavesCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"]));
+            "VehicleLeavesCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_34"],
             //model_check_init_static
-            guardDependency.insert("VehicleFallsBelowMaxCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"]));
+            "VehicleFallsBelowMaxCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"],
             //model_check_init_static
-            guardDependency.insert("CCInitialisationFinished", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"]));
+            "CCInitialisationFinished" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"],
             //model_check_init_static
-            guardDependency.insert("VehicleReachesCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"]));
+            "VehicleReachesCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_34"],
             //model_check_init_static
-            guardDependency.insert("ObstacleAppearsWhenCruiseActive", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
+            "ObstacleAppearsWhenCruiseActive" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("ObstacleStartsTravelSlower", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"]));
+            "ObstacleStartsTravelSlower" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"],
             //model_check_init_static
-            guardDependency.insert("CruiseBecomesNotAllowed", HashSet::from(["_tr_SetCruiseSpeed", "_tr_VehicleManageObstacle", "_tr_CruiseBecomesAllowed", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseBecomesNotAllowed", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
+            "CruiseBecomesNotAllowed" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3", "_check_inv_1"],
             //model_check_init_static
-            guardDependency.insert("ObstacleAppearsWhenCruiseInactive", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
+            "ObstacleAppearsWhenCruiseInactive" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_36", "_check_inv_13", "_check_inv_12", "_check_inv_23", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("CCInitialisationDelayFinished", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
+            "CCInitialisationDelayFinished" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_36", "_check_inv_25", "_check_inv_35"],
             //model_check_init_static
-            guardDependency.insert("ObstacleDistanceBecomesClose", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
+            "ObstacleDistanceBecomesClose" => vec!["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"],
             //model_check_init_static
-            guardDependency.insert("ObstacleStartsTravelFaster", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"]));
+            "ObstacleStartsTravelFaster" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"],
             //model_check_init_static
-            guardDependency.insert("ExternalForcesBecomesExtreme", HashSet::from(["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"]));
+            "ExternalForcesBecomesExtreme" => vec!["_check_inv_18", "_check_inv_4"],
             //model_check_init_static
-            guardDependency.insert("CruiseOff", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
+            "CruiseOff" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"],
             //model_check_init_static
-            guardDependency.insert("CruiseSpeedChangeDelayFinished", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
+            "CruiseSpeedChangeDelayFinished" => vec!["_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_37", "_check_inv_26", "_check_inv_36", "_check_inv_35"],
             //model_check_init_static
-            guardDependency.insert("ObstacleStopsTravelFaster", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"]));
+            "ObstacleStopsTravelFaster" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"],
             //model_check_init_static
-            guardDependency.insert("ObstacleDistanceBecomesVeryClose", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
+            "ObstacleDistanceBecomesVeryClose" => vec!["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"],
             //model_check_init_static
-            guardDependency.insert("VehicleManageObstacle", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"]));
+            "VehicleManageObstacle" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"],
             //model_check_init_static
-            guardDependency.insert("CruiseBecomesAllowed", HashSet::from(["_tr_SetCruiseSpeed", "_tr_CruiseBecomesAllowed", "_tr_CruiseBecomesNotAllowed"]));
+            "CruiseBecomesAllowed" => vec!["_check_inv_1", "_check_inv_33"],
             //model_check_init_static
-            guardDependency.insert("VehicleExceedsMaxCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"]));
+            "VehicleExceedsMaxCruiseSpeed" => vec!["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"],
             //model_check_init_static
-            guardDependency.insert("CruiseSpeedChangeFinished", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"]));
+            "CruiseSpeedChangeFinished" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"],
             //model_check_init_static
-            guardDependency.insert("ObstacleDisappears", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
+            "ObstacleDisappears" => vec!["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("ExternalForcesBecomesNormal", HashSet::from(["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"]));
+            "ExternalForcesBecomesNormal" => vec!["_check_inv_18", "_check_inv_4"],
             //model_check_init_static
-            guardDependency.insert("ObstacleBecomesOld", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
+            "ObstacleBecomesOld" => vec!["_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24"],
             //model_check_init_static
-            guardDependency.insert("ObstacleDistanceBecomesBig", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
+            "ObstacleDistanceBecomesBig" => vec!["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"],
+            _ => vec![],
         }
+    }
 
-        let transitions = Arc::new(AtomicI64::new(0));
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = Cruise_finite1_deterministic_MC::new();
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        let mut all_states = HashSet::<Cruise_finite1_deterministic_MC>::new();
+        all_states.insert(machine.clone());
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Cruise_finite1_deterministic_MC, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+        let num_transitions = Arc::new(AtomicU64::new(0));
+
+        let mut stop_threads = false;
+
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
 
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
+
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                       .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                       .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -2490,207 +1853,66 @@ impl Cruise_finite1_deterministic_MC {
 
         let machine = Cruise_finite1_deterministic_MC::new();
 
+        let all_states = Arc::new(DashSet::<Cruise_finite1_deterministic_MC>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() || !machine._check_inv_21() || !machine._check_inv_22() || !machine._check_inv_23() || !machine._check_inv_24() || !machine._check_inv_25() || !machine._check_inv_26() || !machine._check_inv_27() || !machine._check_inv_28() || !machine._check_inv_29() || !machine._check_inv_30() || !machine._check_inv_31() || !machine._check_inv_32() || !machine._check_inv_33() || !machine._check_inv_34() || !machine._check_inv_35() || !machine._check_inv_36() || !machine._check_inv_37() || !machine._check_inv_38() || !machine._check_inv_39() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
-
-        let states_m = Arc::new(Mutex::new(HashSet::<Cruise_finite1_deterministic_MC>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Cruise_finite1_deterministic_MC, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        let collection_m = Arc::new(Mutex::new(LinkedList::<Cruise_finite1_deterministic_MC>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, HashSet<&str>>::new()));
-        let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<Cruise_finite1_deterministic_MC, Cruise_finite1_deterministic_MC>::new()));
-
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("ObstacleStopsTravelSlower", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"]));
-            //model_check_init_static
-            invariantDependency.insert("SetCruiseSpeed", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_34", "_check_inv_33", "_check_inv_26", "_check_inv_21", "_check_inv_20", "_check_inv_4", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"]));
-            //model_check_init_static
-            invariantDependency.insert("VehicleLeavesCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_34"]));
-            //model_check_init_static
-            invariantDependency.insert("VehicleFallsBelowMaxCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"]));
-            //model_check_init_static
-            invariantDependency.insert("CCInitialisationFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"]));
-            //model_check_init_static
-            invariantDependency.insert("VehicleReachesCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_34"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleAppearsWhenCruiseActive", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleStartsTravelSlower", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"]));
-            //model_check_init_static
-            invariantDependency.insert("CruiseBecomesNotAllowed", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3", "_check_inv_1"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleAppearsWhenCruiseInactive", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_36", "_check_inv_13", "_check_inv_12", "_check_inv_23", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("CCInitialisationDelayFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_36", "_check_inv_25", "_check_inv_35"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleDistanceBecomesClose", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleStartsTravelFaster", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"]));
-            //model_check_init_static
-            invariantDependency.insert("ExternalForcesBecomesExtreme", HashSet::from(["_check_inv_18", "_check_inv_4"]));
-            //model_check_init_static
-            invariantDependency.insert("CruiseOff", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_15", "_check_inv_37", "_check_inv_19", "_check_inv_10", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_12", "_check_inv_34", "_check_inv_33", "_check_inv_28", "_check_inv_27", "_check_inv_26", "_check_inv_21", "_check_inv_7", "_check_inv_20", "_check_inv_4", "_check_inv_5", "_check_inv_25", "_check_inv_24", "_check_inv_8", "_check_inv_23", "_check_inv_9", "_check_inv_22", "_check_inv_2", "_check_inv_3"]));
-            //model_check_init_static
-            invariantDependency.insert("CruiseSpeedChangeDelayFinished", HashSet::from(["_check_inv_39", "_check_inv_16", "_check_inv_38", "_check_inv_37", "_check_inv_26", "_check_inv_36", "_check_inv_35"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleStopsTravelFaster", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleDistanceBecomesVeryClose", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_37", "_check_inv_32", "_check_inv_31", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"]));
-            //model_check_init_static
-            invariantDependency.insert("VehicleManageObstacle", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"]));
-            //model_check_init_static
-            invariantDependency.insert("CruiseBecomesAllowed", HashSet::from(["_check_inv_1", "_check_inv_33"]));
-            //model_check_init_static
-            invariantDependency.insert("VehicleExceedsMaxCruiseSpeed", HashSet::from(["_check_inv_17", "_check_inv_3", "_check_inv_6", "_check_inv_34"]));
-            //model_check_init_static
-            invariantDependency.insert("CruiseSpeedChangeFinished", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_19", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_5", "_check_inv_36", "_check_inv_35"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleDisappears", HashSet::from(["_check_inv_29", "_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_13", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("ExternalForcesBecomesNormal", HashSet::from(["_check_inv_18", "_check_inv_4"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleBecomesOld", HashSet::from(["_check_inv_39", "_check_inv_38", "_check_inv_37", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24"]));
-            //model_check_init_static
-            invariantDependency.insert("ObstacleDistanceBecomesBig", HashSet::from(["_check_inv_39", "_check_inv_28", "_check_inv_38", "_check_inv_27", "_check_inv_37", "_check_inv_32", "_check_inv_21", "_check_inv_31", "_check_inv_7", "_check_inv_30", "_check_inv_14", "_check_inv_36", "_check_inv_35", "_check_inv_24", "_check_inv_12", "_check_inv_23"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleStopsTravelSlower", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"]));
-            //model_check_init_static
-            guardDependency.insert("SetCruiseSpeed", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleAppearsWhenCruiseInactive"]));
-            //model_check_init_static
-            guardDependency.insert("VehicleLeavesCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"]));
-            //model_check_init_static
-            guardDependency.insert("VehicleFallsBelowMaxCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"]));
-            //model_check_init_static
-            guardDependency.insert("CCInitialisationFinished", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"]));
-            //model_check_init_static
-            guardDependency.insert("VehicleReachesCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleAppearsWhenCruiseActive", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleStartsTravelSlower", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"]));
-            //model_check_init_static
-            guardDependency.insert("CruiseBecomesNotAllowed", HashSet::from(["_tr_SetCruiseSpeed", "_tr_VehicleManageObstacle", "_tr_CruiseBecomesAllowed", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseBecomesNotAllowed", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleAppearsWhenCruiseInactive", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
-            //model_check_init_static
-            guardDependency.insert("CCInitialisationDelayFinished", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleDistanceBecomesClose", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleStartsTravelFaster", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"]));
-            //model_check_init_static
-            guardDependency.insert("ExternalForcesBecomesExtreme", HashSet::from(["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"]));
-            //model_check_init_static
-            guardDependency.insert("CruiseOff", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_ExternalForcesBecomesNormal", "_tr_CruiseSpeedChangeFinished", "_tr_ExternalForcesBecomesExtreme", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleReachesCruiseSpeed", "_tr_CruiseOff", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
-            //model_check_init_static
-            guardDependency.insert("CruiseSpeedChangeDelayFinished", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleStopsTravelFaster", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleDistanceBecomesVeryClose", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
-            //model_check_init_static
-            guardDependency.insert("VehicleManageObstacle", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"]));
-            //model_check_init_static
-            guardDependency.insert("CruiseBecomesAllowed", HashSet::from(["_tr_SetCruiseSpeed", "_tr_CruiseBecomesAllowed", "_tr_CruiseBecomesNotAllowed"]));
-            //model_check_init_static
-            guardDependency.insert("VehicleExceedsMaxCruiseSpeed", HashSet::from(["_tr_VehicleReachesCruiseSpeed", "_tr_VehicleFallsBelowMaxCruiseSpeed", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_VehicleLeavesCruiseSpeed"]));
-            //model_check_init_static
-            guardDependency.insert("CruiseSpeedChangeFinished", HashSet::from(["_tr_ObstacleBecomesOld", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_VehicleLeavesCruiseSpeed"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleDisappears", HashSet::from(["_tr_ObstacleStopsTravelFaster", "_tr_ObstacleStopsTravelSlower", "_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleDisappears", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished", "_tr_ObstacleStartsTravelSlower", "_tr_ObstacleStartsTravelFaster", "_tr_ObstacleAppearsWhenCruiseActive", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_ObstacleAppearsWhenCruiseInactive"]));
-            //model_check_init_static
-            guardDependency.insert("ExternalForcesBecomesNormal", HashSet::from(["_tr_ExternalForcesBecomesNormal", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_ExternalForcesBecomesExtreme", "_tr_VehicleLeavesCruiseSpeed"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleBecomesOld", HashSet::from(["_tr_VehicleManageObstacle", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
-            //model_check_init_static
-            guardDependency.insert("ObstacleDistanceBecomesBig", HashSet::from(["_tr_VehicleManageObstacle", "_tr_ObstacleDistanceBecomesBig", "_tr_ObstacleDistanceBecomesClose", "_tr_VehicleExceedsMaxCruiseSpeed", "_tr_CruiseSpeedChangeFinished", "_tr_ObstacleBecomesOld", "_tr_ObstacleDistanceBecomesVeryClose", "_tr_CCInitialisationFinished", "_tr_CCInitialisationDelayFinished", "_tr_CruiseSpeedChangeDelayFinished"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
-
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
-            let dependent_guard_m2 = Arc::clone(&dependent_guard_m);
-            let parents_m2 = Arc::clone(&parents_m);
-            let guard_cache = Arc::clone(&guard_cache_b);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
 
-                //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                //println!("Thread {:?} executing", thread::current().id());
+                next_states.into_iter()
+                           .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                           .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                            Ok(_) => finished_tasks += 1,
+                            Err(msg) => { println!("{}", msg); stop_threads = true; },
+                        },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/benchmarks/model_checking/Rust/LandingGear_R6.rs b/benchmarks/model_checking/Rust/LandingGear_R6.rs
index c5d829d6341953aedf912438f8b3bb5a84d6d831..60e94590d2447ac06c93eaa51f5268bdb9425edf 100644
--- a/benchmarks/model_checking/Rust/LandingGear_R6.rs
+++ b/benchmarks/model_checking/Rust/LandingGear_R6.rs
@@ -1,16 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::bboolean::BBoolean;
 use btypes::brelation::BRelation;
 use btypes::bset::BSet;
@@ -23,8 +24,8 @@ pub enum MC_TYPE { BFS, DFS, MIXED }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum DOOR_STATE {
-    open,
-    closed,
+    open, 
+    closed, 
     door_moving
 }
 impl DOOR_STATE {
@@ -37,18 +38,18 @@ impl Default for DOOR_STATE {
 }
 impl fmt::Display for DOOR_STATE {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            DOOR_STATE::open => write!(f, "open"),
-            DOOR_STATE::closed => write!(f, "closed"),
-            DOOR_STATE::door_moving => write!(f, "door_moving"),
-        }
+       match *self {
+           DOOR_STATE::open => write!(f, "open"),
+           DOOR_STATE::closed => write!(f, "closed"),
+           DOOR_STATE::door_moving => write!(f, "door_moving"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum GEAR_STATE {
-    retracted,
-    extended,
+    retracted, 
+    extended, 
     gear_moving
 }
 impl GEAR_STATE {
@@ -61,17 +62,17 @@ impl Default for GEAR_STATE {
 }
 impl fmt::Display for GEAR_STATE {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            GEAR_STATE::retracted => write!(f, "retracted"),
-            GEAR_STATE::extended => write!(f, "extended"),
-            GEAR_STATE::gear_moving => write!(f, "gear_moving"),
-        }
+       match *self {
+           GEAR_STATE::retracted => write!(f, "retracted"),
+           GEAR_STATE::extended => write!(f, "extended"),
+           GEAR_STATE::gear_moving => write!(f, "gear_moving"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum HANDLE_STATE {
-    up,
+    up, 
     down
 }
 impl HANDLE_STATE {
@@ -84,17 +85,17 @@ impl Default for HANDLE_STATE {
 }
 impl fmt::Display for HANDLE_STATE {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            HANDLE_STATE::up => write!(f, "up"),
-            HANDLE_STATE::down => write!(f, "down"),
-        }
+       match *self {
+           HANDLE_STATE::up => write!(f, "up"),
+           HANDLE_STATE::down => write!(f, "down"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum POSITION {
-    fr,
-    lt,
+    fr, 
+    lt, 
     rt
 }
 impl POSITION {
@@ -107,17 +108,17 @@ impl Default for POSITION {
 }
 impl fmt::Display for POSITION {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            POSITION::fr => write!(f, "fr"),
-            POSITION::lt => write!(f, "lt"),
-            POSITION::rt => write!(f, "rt"),
-        }
+       match *self {
+           POSITION::fr => write!(f, "fr"),
+           POSITION::lt => write!(f, "lt"),
+           POSITION::rt => write!(f, "rt"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum SWITCH_STATE {
-    switch_open,
+    switch_open, 
     switch_closed
 }
 impl SWITCH_STATE {
@@ -130,16 +131,16 @@ impl Default for SWITCH_STATE {
 }
 impl fmt::Display for SWITCH_STATE {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            SWITCH_STATE::switch_open => write!(f, "switch_open"),
-            SWITCH_STATE::switch_closed => write!(f, "switch_closed"),
-        }
+       match *self {
+           SWITCH_STATE::switch_open => write!(f, "switch_open"),
+           SWITCH_STATE::switch_closed => write!(f, "switch_closed"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum PLANE_STATE {
-    ground,
+    ground, 
     flight
 }
 impl PLANE_STATE {
@@ -152,16 +153,16 @@ impl Default for PLANE_STATE {
 }
 impl fmt::Display for PLANE_STATE {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            PLANE_STATE::ground => write!(f, "ground"),
-            PLANE_STATE::flight => write!(f, "flight"),
-        }
+       match *self {
+           PLANE_STATE::ground => write!(f, "ground"),
+           PLANE_STATE::flight => write!(f, "flight"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum VALVE_STATE {
-    valve_open,
+    valve_open, 
     valve_closed
 }
 impl VALVE_STATE {
@@ -174,10 +175,10 @@ impl Default for VALVE_STATE {
 }
 impl fmt::Display for VALVE_STATE {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            VALVE_STATE::valve_open => write!(f, "valve_open"),
-            VALVE_STATE::valve_closed => write!(f, "valve_closed"),
-        }
+       match *self {
+           VALVE_STATE::valve_open => write!(f, "valve_open"),
+           VALVE_STATE::valve_closed => write!(f, "valve_closed"),
+       }
     }
 }
 
@@ -286,6 +287,32 @@ pub struct LandingGear_R6 {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_env_open_analogical_switch: Option<bool>,}
 
+impl fmt::Display for LandingGear_R6 {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "LandingGear_R6: (".to_owned();
+        result += &format!("_get_analogical_switch: {}, ", self._get_analogical_switch());
+        result += &format!("_get_general_EV: {}, ", self._get_general_EV());
+        result += &format!("_get_general_valve: {}, ", self._get_general_valve());
+        result += &format!("_get_handle_move: {}, ", self._get_handle_move());
+        result += &format!("_get_close_EV: {}, ", self._get_close_EV());
+        result += &format!("_get_extend_EV: {}, ", self._get_extend_EV());
+        result += &format!("_get_open_EV: {}, ", self._get_open_EV());
+        result += &format!("_get_retract_EV: {}, ", self._get_retract_EV());
+        result += &format!("_get_shock_absorber: {}, ", self._get_shock_absorber());
+        result += &format!("_get_valve_close_door: {}, ", self._get_valve_close_door());
+        result += &format!("_get_valve_extend_gear: {}, ", self._get_valve_extend_gear());
+        result += &format!("_get_valve_open_door: {}, ", self._get_valve_open_door());
+        result += &format!("_get_valve_retract_gear: {}, ", self._get_valve_retract_gear());
+        result += &format!("_get_doors: {}, ", self._get_doors());
+        result += &format!("_get_gears: {}, ", self._get_gears());
+        result += &format!("_get_handle: {}, ", self._get_handle());
+        result += &format!("_get_door: {}, ", self._get_door());
+        result += &format!("_get_gear: {}, ", self._get_gear());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl LandingGear_R6 {
 
     pub fn new() -> LandingGear_R6 {
@@ -322,103 +349,103 @@ impl LandingGear_R6 {
         self.door = DOOR_STATE::closed;
     }
 
-    pub fn get_analogical_switch(&self) -> SWITCH_STATE {
+    pub fn _get_analogical_switch(&self) -> SWITCH_STATE {
         return self.analogical_switch.clone();
     }
 
-    pub fn get_general_EV(&self) -> BBoolean {
+    pub fn _get_general_EV(&self) -> BBoolean {
         return self.general_EV.clone();
     }
 
-    pub fn get_general_valve(&self) -> VALVE_STATE {
+    pub fn _get_general_valve(&self) -> VALVE_STATE {
         return self.general_valve.clone();
     }
 
-    pub fn get_handle_move(&self) -> BBoolean {
+    pub fn _get_handle_move(&self) -> BBoolean {
         return self.handle_move.clone();
     }
 
-    pub fn get_close_EV(&self) -> BBoolean {
+    pub fn _get_close_EV(&self) -> BBoolean {
         return self.close_EV.clone();
     }
 
-    pub fn get_extend_EV(&self) -> BBoolean {
+    pub fn _get_extend_EV(&self) -> BBoolean {
         return self.extend_EV.clone();
     }
 
-    pub fn get_open_EV(&self) -> BBoolean {
+    pub fn _get_open_EV(&self) -> BBoolean {
         return self.open_EV.clone();
     }
 
-    pub fn get_retract_EV(&self) -> BBoolean {
+    pub fn _get_retract_EV(&self) -> BBoolean {
         return self.retract_EV.clone();
     }
 
-    pub fn get_shock_absorber(&self) -> PLANE_STATE {
+    pub fn _get_shock_absorber(&self) -> PLANE_STATE {
         return self.shock_absorber.clone();
     }
 
-    pub fn get_valve_close_door(&self) -> VALVE_STATE {
+    pub fn _get_valve_close_door(&self) -> VALVE_STATE {
         return self.valve_close_door.clone();
     }
 
-    pub fn get_valve_extend_gear(&self) -> VALVE_STATE {
+    pub fn _get_valve_extend_gear(&self) -> VALVE_STATE {
         return self.valve_extend_gear.clone();
     }
 
-    pub fn get_valve_open_door(&self) -> VALVE_STATE {
+    pub fn _get_valve_open_door(&self) -> VALVE_STATE {
         return self.valve_open_door.clone();
     }
 
-    pub fn get_valve_retract_gear(&self) -> VALVE_STATE {
+    pub fn _get_valve_retract_gear(&self) -> VALVE_STATE {
         return self.valve_retract_gear.clone();
     }
 
-    pub fn get_doors(&self) -> BRelation<POSITION, DOOR_STATE> {
+    pub fn _get_doors(&self) -> BRelation<POSITION, DOOR_STATE> {
         return self.doors.clone();
     }
 
-    pub fn get_gears(&self) -> BRelation<POSITION, GEAR_STATE> {
+    pub fn _get_gears(&self) -> BRelation<POSITION, GEAR_STATE> {
         return self.gears.clone();
     }
 
-    pub fn get_handle(&self) -> HANDLE_STATE {
+    pub fn _get_handle(&self) -> HANDLE_STATE {
         return self.handle.clone();
     }
 
-    pub fn get_door(&self) -> DOOR_STATE {
+    pub fn _get_door(&self) -> DOOR_STATE {
         return self.door.clone();
     }
 
-    pub fn get_gear(&self) -> GEAR_STATE {
+    pub fn _get_gear(&self) -> GEAR_STATE {
         return self.gear.clone();
     }
 
-    pub fn get__DOOR_STATE(&self) -> BSet<DOOR_STATE> {
+    pub fn _get__DOOR_STATE(&self) -> BSet<DOOR_STATE> {
         return self._DOOR_STATE.clone();
     }
 
-    pub fn get__GEAR_STATE(&self) -> BSet<GEAR_STATE> {
+    pub fn _get__GEAR_STATE(&self) -> BSet<GEAR_STATE> {
         return self._GEAR_STATE.clone();
     }
 
-    pub fn get__HANDLE_STATE(&self) -> BSet<HANDLE_STATE> {
+    pub fn _get__HANDLE_STATE(&self) -> BSet<HANDLE_STATE> {
         return self._HANDLE_STATE.clone();
     }
 
-    pub fn get__POSITION(&self) -> BSet<POSITION> {
+    pub fn _get__POSITION(&self) -> BSet<POSITION> {
         return self._POSITION.clone();
     }
 
-    pub fn get__SWITCH_STATE(&self) -> BSet<SWITCH_STATE> {
+    pub fn _get__SWITCH_STATE(&self) -> BSet<SWITCH_STATE> {
         return self._SWITCH_STATE.clone();
     }
 
-    pub fn get__PLANE_STATE(&self) -> BSet<PLANE_STATE> {
+    pub fn _get__PLANE_STATE(&self) -> BSet<PLANE_STATE> {
         return self._PLANE_STATE.clone();
     }
 
-    pub fn get__VALVE_STATE(&self) -> BSet<VALVE_STATE> {
+    pub fn _get__VALVE_STATE(&self) -> BSet<VALVE_STATE> {
         return self._VALVE_STATE.clone();
     }
 
@@ -439,7 +466,7 @@ impl LandingGear_R6 {
     }
 
     pub fn open_valve_door_open(&mut self) -> () {
-        if (self.valve_open_door.equal(&VALVE_STATE::valve_closed).and(&self.open_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((self.valve_open_door.equal(&VALVE_STATE::valve_closed) && self.open_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.valve_open_door = VALVE_STATE::valve_open;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -447,7 +474,7 @@ impl LandingGear_R6 {
     }
 
     pub fn close_valve_door_open(&mut self) -> () {
-        if (self.valve_open_door.equal(&VALVE_STATE::valve_open).and(&self.open_EV.equal(&BBoolean::new(false)))).booleanValue() {
+        if ((self.valve_open_door.equal(&VALVE_STATE::valve_open) && self.open_EV.equal(&BBoolean::new(false)))).booleanValue() {
             self.valve_open_door = VALVE_STATE::valve_closed;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -455,7 +482,7 @@ impl LandingGear_R6 {
     }
 
     pub fn open_valve_door_close(&mut self) -> () {
-        if (self.valve_close_door.equal(&VALVE_STATE::valve_closed).and(&self.close_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((self.valve_close_door.equal(&VALVE_STATE::valve_closed) && self.close_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.valve_close_door = VALVE_STATE::valve_open;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -463,7 +490,7 @@ impl LandingGear_R6 {
     }
 
     pub fn close_valve_door_close(&mut self) -> () {
-        if (self.valve_close_door.equal(&VALVE_STATE::valve_open).and(&self.close_EV.equal(&BBoolean::new(false)))).booleanValue() {
+        if ((self.valve_close_door.equal(&VALVE_STATE::valve_open) && self.close_EV.equal(&BBoolean::new(false)))).booleanValue() {
             self.valve_close_door = VALVE_STATE::valve_closed;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -471,7 +498,7 @@ impl LandingGear_R6 {
     }
 
     pub fn open_valve_retract_gear(&mut self) -> () {
-        if (self.valve_retract_gear.equal(&VALVE_STATE::valve_closed).and(&self.retract_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((self.valve_retract_gear.equal(&VALVE_STATE::valve_closed) && self.retract_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.valve_retract_gear = VALVE_STATE::valve_open;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -479,7 +506,7 @@ impl LandingGear_R6 {
     }
 
     pub fn close_valve_retract_gear(&mut self) -> () {
-        if (self.valve_retract_gear.equal(&VALVE_STATE::valve_open).and(&self.retract_EV.equal(&BBoolean::new(false)))).booleanValue() {
+        if ((self.valve_retract_gear.equal(&VALVE_STATE::valve_open) && self.retract_EV.equal(&BBoolean::new(false)))).booleanValue() {
             self.valve_retract_gear = VALVE_STATE::valve_closed;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -487,7 +514,7 @@ impl LandingGear_R6 {
     }
 
     pub fn open_valve_extend_gear(&mut self) -> () {
-        if (self.valve_extend_gear.equal(&VALVE_STATE::valve_closed).and(&self.extend_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((self.valve_extend_gear.equal(&VALVE_STATE::valve_closed) && self.extend_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.valve_extend_gear = VALVE_STATE::valve_open;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -495,7 +522,7 @@ impl LandingGear_R6 {
     }
 
     pub fn close_valve_extend_gear(&mut self) -> () {
-        if (self.valve_extend_gear.equal(&VALVE_STATE::valve_open).and(&self.extend_EV.equal(&BBoolean::new(false)))).booleanValue() {
+        if ((self.valve_extend_gear.equal(&VALVE_STATE::valve_open) && self.extend_EV.equal(&BBoolean::new(false)))).booleanValue() {
             self.valve_extend_gear = VALVE_STATE::valve_closed;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -503,7 +530,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stimulate_open_door_valve(&mut self) -> () {
-        if (self.open_EV.equal(&BBoolean::new(false)).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.shock_absorber.equal(&PLANE_STATE::ground)).not()))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((((self.open_EV.equal(&BBoolean::new(false)) && self.close_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()) || ((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()) && (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.shock_absorber.equal(&PLANE_STATE::ground)).not()))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.open_EV = BBoolean::new(true);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -511,7 +538,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stop_stimulate_open_door_valve(&mut self) -> () {
-        if (self.open_EV.equal(&BBoolean::new(true)).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if (((((self.open_EV.equal(&BBoolean::new(true)) && self.extend_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) || ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.open_EV = BBoolean::new(false);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -519,7 +546,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stimulate_close_door_valve(&mut self) -> () {
-        if (self.close_EV.equal(&BBoolean::new(false)).and(&self.open_EV.equal(&BBoolean::new(false))).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed])).not()).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if (((((((self.close_EV.equal(&BBoolean::new(false)) && self.open_EV.equal(&BBoolean::new(false))) && self.extend_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) || (self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed])).not()) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.close_EV = BBoolean::new(true);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -527,7 +554,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stop_stimulate_close_door_valve(&mut self) -> () {
-        if (self.close_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if (((self.close_EV.equal(&BBoolean::new(true)) && (((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) || ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.close_EV = BBoolean::new(false);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -535,7 +562,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stimulate_retract_gear_valve(&mut self) -> () {
-        if (self.retract_EV.equal(&BBoolean::new(false)).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.open_EV.equal(&BBoolean::new(true))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()).and(&self.shock_absorber.equal(&PLANE_STATE::flight)).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((((((((self.retract_EV.equal(&BBoolean::new(false)) && self.extend_EV.equal(&BBoolean::new(false))) && self.open_EV.equal(&BBoolean::new(true))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()) && self.shock_absorber.equal(&PLANE_STATE::flight)) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.retract_EV = BBoolean::new(true);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -543,7 +570,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stop_stimulate_retract_gear_valve(&mut self) -> () {
-        if (self.retract_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::down).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if (((self.retract_EV.equal(&BBoolean::new(true)) && (self.handle.equal(&HANDLE_STATE::down) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.retract_EV = BBoolean::new(false);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -551,7 +578,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stimulate_extend_gear_valve(&mut self) -> () {
-        if (self.extend_EV.equal(&BBoolean::new(false)).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.open_EV.equal(&BBoolean::new(true))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if (((((((self.extend_EV.equal(&BBoolean::new(false)) && self.retract_EV.equal(&BBoolean::new(false))) && self.open_EV.equal(&BBoolean::new(true))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.extend_EV = BBoolean::new(true);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -559,7 +586,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stop_stimulate_extend_gear_valve(&mut self) -> () {
-        if (self.extend_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::up).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).and(&self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
+        if (((self.extend_EV.equal(&BBoolean::new(true)) && (self.handle.equal(&HANDLE_STATE::up) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) && self.general_EV.equal(&BBoolean::new(true)))).booleanValue() {
             self.extend_EV = BBoolean::new(false);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -567,7 +594,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_start_retracting_first(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::extended)).and(&self.valve_retract_gear.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::gear_moving]).elementOf(&self.gear)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() {
+        if ((((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&gr).equal(&GEAR_STATE::extended)) && self.valve_retract_gear.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::gear_moving]).elementOf(&self.gear)) && self.door.equal(&DOOR_STATE::open))).booleanValue() {
             let mut _ld_gears = self.gears.clone();
             self.gears = _ld_gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::gear_moving)])).clone().clone();
             self.gear = GEAR_STATE::gear_moving;
@@ -577,7 +604,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_retract_gear_skip(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
+        if ((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
             self.gears = self.gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::retracted)])).clone().clone();
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -585,7 +612,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_retract_gear_last(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.gear.equal(&GEAR_STATE::gear_moving)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() {
+        if ((((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.gear.equal(&GEAR_STATE::gear_moving)) && self.door.equal(&DOOR_STATE::open))).booleanValue() {
             let mut _ld_gears = self.gears.clone();
             self.gears = _ld_gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::retracted)])).clone().clone();
             self.gear = GEAR_STATE::retracted;
@@ -595,7 +622,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_start_extending(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::retracted)).and(&self.valve_extend_gear.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![GEAR_STATE::gear_moving, GEAR_STATE::retracted]).elementOf(&self.gear)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() {
+        if ((((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.functionCall(&gr).equal(&GEAR_STATE::retracted)) && self.valve_extend_gear.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![GEAR_STATE::gear_moving, GEAR_STATE::retracted]).elementOf(&self.gear)) && self.door.equal(&DOOR_STATE::open))).booleanValue() {
             let mut _ld_gears = self.gears.clone();
             self.gears = _ld_gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::gear_moving)])).clone().clone();
             self.gear = GEAR_STATE::gear_moving;
@@ -605,7 +632,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_extend_gear_last(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.gear.equal(&GEAR_STATE::gear_moving)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() {
+        if ((((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.gear.equal(&GEAR_STATE::gear_moving)) && self.door.equal(&DOOR_STATE::open))).booleanValue() {
             let mut _ld_gears = self.gears.clone();
             self.gears = _ld_gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::extended)])).clone().clone();
             self.gear = GEAR_STATE::extended;
@@ -615,7 +642,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_extend_gear_skip(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
+        if ((((((self.gears.domain().elementOf(&gr) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![GEAR_STATE::extended]))) && self.gears.functionCall(&gr).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
             self.gears = self.gears._override(&BRelation::new(vec![BTuple::from_refs(&gr, &GEAR_STATE::extended)])).clone().clone();
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -623,7 +650,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_start_open_door(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::closed)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![DOOR_STATE::closed, DOOR_STATE::door_moving]).elementOf(&self.door)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::retracted)).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gear.equal(&GEAR_STATE::extended))))).booleanValue() {
+        if ((((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::closed)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![DOOR_STATE::closed, DOOR_STATE::door_moving]).elementOf(&self.door)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::retracted)) || (self.handle.equal(&HANDLE_STATE::up) && self.gear.equal(&GEAR_STATE::extended))))).booleanValue() {
             let mut _ld_doors = self.doors.clone();
             self.doors = _ld_doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::door_moving)])).clone().clone();
             self.door = DOOR_STATE::door_moving;
@@ -633,7 +660,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_open_door_last(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.door.equal(&DOOR_STATE::door_moving)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::retracted)).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gear.equal(&GEAR_STATE::extended))))).booleanValue() {
+        if (((((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![DOOR_STATE::open]))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.door.equal(&DOOR_STATE::door_moving)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::retracted)) || (self.handle.equal(&HANDLE_STATE::up) && self.gear.equal(&GEAR_STATE::extended))))).booleanValue() {
             let mut _ld_doors = self.doors.clone();
             self.doors = _ld_doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::open)])).clone().clone();
             self.door = DOOR_STATE::open;
@@ -643,7 +670,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_open_door_skip(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
+        if ((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![DOOR_STATE::open]))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
             self.doors = self.doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::open)])).clone().clone();
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -651,7 +678,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_start_close_door(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::open)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![DOOR_STATE::door_moving, DOOR_STATE::open]).elementOf(&self.door)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::extended)).or(&self.handle.equal(&HANDLE_STATE::up).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() {
+        if (((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::open)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![DOOR_STATE::door_moving, DOOR_STATE::open]).elementOf(&self.door)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::extended)) || (self.handle.equal(&HANDLE_STATE::up) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() {
             let mut _ld_doors = self.doors.clone();
             self.doors = _ld_doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::door_moving)])).clone().clone();
             self.door = DOOR_STATE::door_moving;
@@ -661,7 +688,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_close_door(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.door.equal(&DOOR_STATE::door_moving)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::extended)).or(&self.handle.equal(&HANDLE_STATE::up).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() {
+        if ((((((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).equal(&BSet::new(vec![DOOR_STATE::closed]))) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.door.equal(&DOOR_STATE::door_moving)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::extended)) || (self.handle.equal(&HANDLE_STATE::up) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() {
             let mut _ld_doors = self.doors.clone();
             self.doors = _ld_doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::closed)])).clone().clone();
             self.door = DOOR_STATE::closed;
@@ -671,7 +698,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_close_door_skip(&mut self, mut gr: POSITION) -> () {
-        if (self.gears.domain().elementOf(&gr).and(&self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)).and(&self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
+        if (((((((((self.gears.domain().elementOf(&gr) && self.doors.functionCall(&gr).equal(&DOOR_STATE::door_moving)) && self.gears.functionCall(&gr).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![gr]))).unequal(&BSet::new(vec![DOOR_STATE::closed]))) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
             self.doors = self.doors._override(&BRelation::new(vec![BTuple::from_refs(&gr, &DOOR_STATE::closed)])).clone().clone();
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -697,7 +724,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stimulate_general_valve(&mut self) -> () {
-        if (self.general_EV.equal(&BBoolean::new(false)).and(&self.handle_move.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((self.general_EV.equal(&BBoolean::new(false)) && self.handle_move.equal(&BBoolean::new(true)))).booleanValue() {
             self.general_EV = BBoolean::new(true);
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -705,7 +732,7 @@ impl LandingGear_R6 {
     }
 
     pub fn con_stop_stimulate_general_valve(&mut self) -> () {
-        if (self.general_EV.equal(&BBoolean::new(true)).and(&self.open_EV.equal(&BBoolean::new(false))).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false)))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false)))))).booleanValue() {
+        if (((((((self.general_EV.equal(&BBoolean::new(true)) && self.open_EV.equal(&BBoolean::new(false))) && self.close_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && self.extend_EV.equal(&BBoolean::new(false))) && self.close_EV.equal(&BBoolean::new(false))) && (((((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false))) || (((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false)))) || (((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false)))))).booleanValue() {
             self.general_EV = BBoolean::new(false);
             self.handle_move = BBoolean::new(false);
         } else {
@@ -714,7 +741,7 @@ impl LandingGear_R6 {
     }
 
     pub fn evn_open_general_valve(&mut self) -> () {
-        if (self.general_EV.equal(&BBoolean::new(true)).and(&self.general_valve.equal(&VALVE_STATE::valve_closed)).and(&self.analogical_switch.equal(&SWITCH_STATE::switch_closed))).booleanValue() {
+        if (((self.general_EV.equal(&BBoolean::new(true)) && self.general_valve.equal(&VALVE_STATE::valve_closed)) && self.analogical_switch.equal(&SWITCH_STATE::switch_closed))).booleanValue() {
             self.general_valve = VALVE_STATE::valve_open;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -722,7 +749,7 @@ impl LandingGear_R6 {
     }
 
     pub fn evn_close_general_valve(&mut self) -> () {
-        if (self.general_EV.equal(&BBoolean::new(false)).or(&self.analogical_switch.equal(&SWITCH_STATE::switch_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
+        if (((self.general_EV.equal(&BBoolean::new(false)) || self.analogical_switch.equal(&SWITCH_STATE::switch_open)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
             self.general_valve = VALVE_STATE::valve_closed;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -730,7 +757,7 @@ impl LandingGear_R6 {
     }
 
     pub fn env_close_analogical_switch(&mut self) -> () {
-        if (self.analogical_switch.equal(&SWITCH_STATE::switch_open).and(&self.handle_move.equal(&BBoolean::new(true)))).booleanValue() {
+        if ((self.analogical_switch.equal(&SWITCH_STATE::switch_open) && self.handle_move.equal(&BBoolean::new(true)))).booleanValue() {
             self.analogical_switch = SWITCH_STATE::switch_closed;
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -770,7 +797,7 @@ impl LandingGear_R6 {
     pub fn _tr_open_valve_door_open(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_open_valve_door_open.is_none() {
-            let mut __tmp__val__ = self.valve_open_door.equal(&VALVE_STATE::valve_closed).and(&self.open_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = (self.valve_open_door.equal(&VALVE_STATE::valve_closed) && self.open_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_open_valve_door_open = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -781,7 +808,7 @@ impl LandingGear_R6 {
     pub fn _tr_close_valve_door_open(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_close_valve_door_open.is_none() {
-            let mut __tmp__val__ = self.valve_open_door.equal(&VALVE_STATE::valve_open).and(&self.open_EV.equal(&BBoolean::new(false))).booleanValue();
+            let mut __tmp__val__ = (self.valve_open_door.equal(&VALVE_STATE::valve_open) && self.open_EV.equal(&BBoolean::new(false))).booleanValue();
             self._tr_cache_close_valve_door_open = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -792,7 +819,7 @@ impl LandingGear_R6 {
     pub fn _tr_open_valve_door_close(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_open_valve_door_close.is_none() {
-            let mut __tmp__val__ = self.valve_close_door.equal(&VALVE_STATE::valve_closed).and(&self.close_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = (self.valve_close_door.equal(&VALVE_STATE::valve_closed) && self.close_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_open_valve_door_close = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -803,7 +830,7 @@ impl LandingGear_R6 {
     pub fn _tr_close_valve_door_close(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_close_valve_door_close.is_none() {
-            let mut __tmp__val__ = self.valve_close_door.equal(&VALVE_STATE::valve_open).and(&self.close_EV.equal(&BBoolean::new(false))).booleanValue();
+            let mut __tmp__val__ = (self.valve_close_door.equal(&VALVE_STATE::valve_open) && self.close_EV.equal(&BBoolean::new(false))).booleanValue();
             self._tr_cache_close_valve_door_close = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -814,7 +841,7 @@ impl LandingGear_R6 {
     pub fn _tr_open_valve_retract_gear(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_open_valve_retract_gear.is_none() {
-            let mut __tmp__val__ = self.valve_retract_gear.equal(&VALVE_STATE::valve_closed).and(&self.retract_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = (self.valve_retract_gear.equal(&VALVE_STATE::valve_closed) && self.retract_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_open_valve_retract_gear = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -825,7 +852,7 @@ impl LandingGear_R6 {
     pub fn _tr_close_valve_retract_gear(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_close_valve_retract_gear.is_none() {
-            let mut __tmp__val__ = self.valve_retract_gear.equal(&VALVE_STATE::valve_open).and(&self.retract_EV.equal(&BBoolean::new(false))).booleanValue();
+            let mut __tmp__val__ = (self.valve_retract_gear.equal(&VALVE_STATE::valve_open) && self.retract_EV.equal(&BBoolean::new(false))).booleanValue();
             self._tr_cache_close_valve_retract_gear = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -836,7 +863,7 @@ impl LandingGear_R6 {
     pub fn _tr_open_valve_extend_gear(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_open_valve_extend_gear.is_none() {
-            let mut __tmp__val__ = self.valve_extend_gear.equal(&VALVE_STATE::valve_closed).and(&self.extend_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = (self.valve_extend_gear.equal(&VALVE_STATE::valve_closed) && self.extend_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_open_valve_extend_gear = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -847,7 +874,7 @@ impl LandingGear_R6 {
     pub fn _tr_close_valve_extend_gear(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_close_valve_extend_gear.is_none() {
-            let mut __tmp__val__ = self.valve_extend_gear.equal(&VALVE_STATE::valve_open).and(&self.extend_EV.equal(&BBoolean::new(false))).booleanValue();
+            let mut __tmp__val__ = (self.valve_extend_gear.equal(&VALVE_STATE::valve_open) && self.extend_EV.equal(&BBoolean::new(false))).booleanValue();
             self._tr_cache_close_valve_extend_gear = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -858,7 +885,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stimulate_open_door_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stimulate_open_door_valve.is_none() {
-            let mut __tmp__val__ = self.open_EV.equal(&BBoolean::new(false)).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.shock_absorber.equal(&PLANE_STATE::ground)).not()))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = (((self.open_EV.equal(&BBoolean::new(false)) && self.close_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()) || ((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()) && (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.shock_absorber.equal(&PLANE_STATE::ground)).not()))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_con_stimulate_open_door_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -869,7 +896,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stop_stimulate_open_door_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stop_stimulate_open_door_valve.is_none() {
-            let mut __tmp__val__ = self.open_EV.equal(&BBoolean::new(true)).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = ((((self.open_EV.equal(&BBoolean::new(true)) && self.extend_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) || ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_con_stop_stimulate_open_door_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -880,7 +907,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stimulate_close_door_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stimulate_close_door_valve.is_none() {
-            let mut __tmp__val__ = self.close_EV.equal(&BBoolean::new(false)).and(&self.open_EV.equal(&BBoolean::new(false))).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed])).not()).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = ((((((self.close_EV.equal(&BBoolean::new(false)) && self.open_EV.equal(&BBoolean::new(false))) && self.extend_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) || (self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed])).not()) && self.general_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_con_stimulate_close_door_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -891,7 +918,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stop_stimulate_close_door_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stop_stimulate_close_door_valve.is_none() {
-            let mut __tmp__val__ = self.close_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = ((self.close_EV.equal(&BBoolean::new(true)) && (((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) || ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.shock_absorber.equal(&PLANE_STATE::ground))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_con_stop_stimulate_close_door_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -902,7 +929,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stimulate_retract_gear_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stimulate_retract_gear_valve.is_none() {
-            let mut __tmp__val__ = self.retract_EV.equal(&BBoolean::new(false)).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.open_EV.equal(&BBoolean::new(true))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()).and(&self.shock_absorber.equal(&PLANE_STATE::flight)).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = (((((((self.retract_EV.equal(&BBoolean::new(false)) && self.extend_EV.equal(&BBoolean::new(false))) && self.open_EV.equal(&BBoolean::new(true))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).not()) && self.shock_absorber.equal(&PLANE_STATE::flight)) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_con_stimulate_retract_gear_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -913,7 +940,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stop_stimulate_retract_gear_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stop_stimulate_retract_gear_valve.is_none() {
-            let mut __tmp__val__ = self.retract_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::down).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = ((self.retract_EV.equal(&BBoolean::new(true)) && (self.handle.equal(&HANDLE_STATE::down) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_con_stop_stimulate_retract_gear_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -924,7 +951,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stimulate_extend_gear_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stimulate_extend_gear_valve.is_none() {
-            let mut __tmp__val__ = self.extend_EV.equal(&BBoolean::new(false)).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.open_EV.equal(&BBoolean::new(true))).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = ((((((self.extend_EV.equal(&BBoolean::new(false)) && self.retract_EV.equal(&BBoolean::new(false))) && self.open_EV.equal(&BBoolean::new(true))) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])).not()) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open]))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_con_stimulate_extend_gear_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -935,7 +962,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stop_stimulate_extend_gear_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stop_stimulate_extend_gear_valve.is_none() {
-            let mut __tmp__val__ = self.extend_EV.equal(&BBoolean::new(true)).and(&self.handle.equal(&HANDLE_STATE::up).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).and(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = ((self.extend_EV.equal(&BBoolean::new(true)) && (self.handle.equal(&HANDLE_STATE::up) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) && self.general_EV.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_con_stop_stimulate_extend_gear_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -947,8 +974,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_start_retracting_first.is_none() {
             let mut _ic_set_18: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::extended)).and(&self.valve_retract_gear.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::gear_moving]).elementOf(&self.gear)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() {
+                if (((((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::extended)) && self.valve_retract_gear.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::gear_moving]).elementOf(&self.gear)) && self.door.equal(&DOOR_STATE::open))).booleanValue() {
                     _ic_set_18 = _ic_set_18._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -964,8 +992,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_retract_gear_skip.is_none() {
             let mut _ic_set_19: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
+                if (((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
                     _ic_set_19 = _ic_set_19._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -981,8 +1010,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_retract_gear_last.is_none() {
             let mut _ic_set_20: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.handle.equal(&HANDLE_STATE::up)).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.gear.equal(&GEAR_STATE::gear_moving)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() {
+                if (((((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.handle.equal(&HANDLE_STATE::up)) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.gear.equal(&GEAR_STATE::gear_moving)) && self.door.equal(&DOOR_STATE::open))).booleanValue() {
                     _ic_set_20 = _ic_set_20._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -998,8 +1028,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_start_extending.is_none() {
             let mut _ic_set_21: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::retracted)).and(&self.valve_extend_gear.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![GEAR_STATE::gear_moving, GEAR_STATE::retracted]).elementOf(&self.gear)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() {
+                if (((((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::retracted)) && self.valve_extend_gear.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![GEAR_STATE::gear_moving, GEAR_STATE::retracted]).elementOf(&self.gear)) && self.door.equal(&DOOR_STATE::open))).booleanValue() {
                     _ic_set_21 = _ic_set_21._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -1015,8 +1046,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_extend_gear_last.is_none() {
             let mut _ic_set_22: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.gear.equal(&GEAR_STATE::gear_moving)).and(&self.door.equal(&DOOR_STATE::open))).booleanValue() {
+                if (((((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.gear.equal(&GEAR_STATE::gear_moving)) && self.door.equal(&DOOR_STATE::open))).booleanValue() {
                     _ic_set_22 = _ic_set_22._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -1032,8 +1064,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_extend_gear_skip.is_none() {
             let mut _ic_set_23: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])).and(&self.handle.equal(&HANDLE_STATE::down)).and(&self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
+                if (((((self.doors.range().equal(&BSet::new(vec![DOOR_STATE::open])) && self.handle.equal(&HANDLE_STATE::down)) && self.gears.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![GEAR_STATE::extended]))) && self.gears.functionCall(&_ic_gr_1).equal(&GEAR_STATE::gear_moving)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
                     _ic_set_23 = _ic_set_23._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -1049,8 +1082,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_start_open_door.is_none() {
             let mut _ic_set_24: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::closed).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![DOOR_STATE::closed, DOOR_STATE::door_moving]).elementOf(&self.door)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::retracted)).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gear.equal(&GEAR_STATE::extended))))).booleanValue() {
+                if (((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::closed) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![DOOR_STATE::closed, DOOR_STATE::door_moving]).elementOf(&self.door)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::retracted)) || (self.handle.equal(&HANDLE_STATE::up) && self.gear.equal(&GEAR_STATE::extended))))).booleanValue() {
                     _ic_set_24 = _ic_set_24._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -1066,8 +1100,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_open_door_last.is_none() {
             let mut _ic_set_25: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.door.equal(&DOOR_STATE::door_moving)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::retracted)).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gear.equal(&GEAR_STATE::extended))))).booleanValue() {
+                if ((((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![DOOR_STATE::open]))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.door.equal(&DOOR_STATE::door_moving)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::retracted)) || (self.handle.equal(&HANDLE_STATE::up) && self.gear.equal(&GEAR_STATE::extended))))).booleanValue() {
                     _ic_set_25 = _ic_set_25._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -1083,8 +1118,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_open_door_skip.is_none() {
             let mut _ic_set_26: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![DOOR_STATE::open]))).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_open_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
+                if (((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![DOOR_STATE::open]))) && ((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) || (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_open_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
                     _ic_set_26 = _ic_set_26._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -1100,8 +1136,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_start_close_door.is_none() {
             let mut _ic_set_27: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::open).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&BSet::new(vec![DOOR_STATE::door_moving, DOOR_STATE::open]).elementOf(&self.door)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::extended)).or(&self.handle.equal(&HANDLE_STATE::up).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() {
+                if ((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::open) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)) && BSet::new(vec![DOOR_STATE::door_moving, DOOR_STATE::open]).elementOf(&self.door)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::extended)) || (self.handle.equal(&HANDLE_STATE::up) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() {
                     _ic_set_27 = _ic_set_27._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -1117,8 +1154,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_close_door.is_none() {
             let mut _ic_set_28: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).and(&self.door.equal(&DOOR_STATE::door_moving)).and(&self.gear.unequal(&GEAR_STATE::gear_moving)).and(&self.handle.equal(&HANDLE_STATE::down).and(&self.gear.equal(&GEAR_STATE::extended)).or(&self.handle.equal(&HANDLE_STATE::up).and(&BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() {
+                if (((((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).equal(&BSet::new(vec![DOOR_STATE::closed]))) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))) && self.general_valve.equal(&VALVE_STATE::valve_open)) && self.door.equal(&DOOR_STATE::door_moving)) && self.gear.unequal(&GEAR_STATE::gear_moving)) && ((self.handle.equal(&HANDLE_STATE::down) && self.gear.equal(&GEAR_STATE::extended)) || (self.handle.equal(&HANDLE_STATE::up) && BSet::new(vec![GEAR_STATE::extended, GEAR_STATE::retracted]).elementOf(&self.gear))))).booleanValue() {
                     _ic_set_28 = _ic_set_28._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -1134,8 +1172,9 @@ impl LandingGear_R6 {
         //transition
         if !is_caching || self._tr_cache_env_close_door_skip.is_none() {
             let mut _ic_set_29: BSet<POSITION> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_gr_1 in self.gears.domain().clone().iter().cloned() {
-                if (self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving).and(&self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)).and(&self.gears.range().notElementOf(&GEAR_STATE::gear_moving)).and(&self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])).or(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))).and(&self.valve_close_door.equal(&VALVE_STATE::valve_open)).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))).and(&self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
+                if ((((((((self.doors.functionCall(&_ic_gr_1).equal(&DOOR_STATE::door_moving) && self.gears.functionCall(&_ic_gr_1).unequal(&GEAR_STATE::gear_moving)) && self.gears.range().notElementOf(&GEAR_STATE::gear_moving)) && self.doors.relationImage(&self._POSITION.difference(&BSet::new(vec![_ic_gr_1]))).unequal(&BSet::new(vec![DOOR_STATE::closed]))) && ((self.handle.equal(&HANDLE_STATE::up) && (self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted])) || self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended])))) || (self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))))) && self.valve_close_door.equal(&VALVE_STATE::valve_open)) && (self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).implies(&self.shock_absorber.equal(&PLANE_STATE::ground))) && self.general_valve.equal(&VALVE_STATE::valve_open))).booleanValue() {
                     _ic_set_29 = _ic_set_29._union(&BSet::new(vec![_ic_gr_1]));
                 }
 
@@ -1172,7 +1211,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stimulate_general_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stimulate_general_valve.is_none() {
-            let mut __tmp__val__ = self.general_EV.equal(&BBoolean::new(false)).and(&self.handle_move.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = (self.general_EV.equal(&BBoolean::new(false)) && self.handle_move.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_con_stimulate_general_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -1183,7 +1222,7 @@ impl LandingGear_R6 {
     pub fn _tr_con_stop_stimulate_general_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_con_stop_stimulate_general_valve.is_none() {
-            let mut __tmp__val__ = self.general_EV.equal(&BBoolean::new(true)).and(&self.open_EV.equal(&BBoolean::new(false))).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.retract_EV.equal(&BBoolean::new(false))).and(&self.extend_EV.equal(&BBoolean::new(false))).and(&self.close_EV.equal(&BBoolean::new(false))).and(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false))).or(&self.handle.equal(&HANDLE_STATE::down).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false)))).or(&self.handle.equal(&HANDLE_STATE::up).and(&self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))).and(&self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))).and(&self.open_EV.equal(&BBoolean::new(false))))).booleanValue();
+            let mut __tmp__val__ = ((((((self.general_EV.equal(&BBoolean::new(true)) && self.open_EV.equal(&BBoolean::new(false))) && self.close_EV.equal(&BBoolean::new(false))) && self.retract_EV.equal(&BBoolean::new(false))) && self.extend_EV.equal(&BBoolean::new(false))) && self.close_EV.equal(&BBoolean::new(false))) && (((((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::retracted]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false))) || (((self.handle.equal(&HANDLE_STATE::down) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false)))) || (((self.handle.equal(&HANDLE_STATE::up) && self.gears.range().equal(&BSet::new(vec![GEAR_STATE::extended]))) && self.doors.range().equal(&BSet::new(vec![DOOR_STATE::closed]))) && self.open_EV.equal(&BBoolean::new(false))))).booleanValue();
             self._tr_cache_con_stop_stimulate_general_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -1194,7 +1233,7 @@ impl LandingGear_R6 {
     pub fn _tr_evn_open_general_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_evn_open_general_valve.is_none() {
-            let mut __tmp__val__ = self.general_EV.equal(&BBoolean::new(true)).and(&self.general_valve.equal(&VALVE_STATE::valve_closed)).and(&self.analogical_switch.equal(&SWITCH_STATE::switch_closed)).booleanValue();
+            let mut __tmp__val__ = ((self.general_EV.equal(&BBoolean::new(true)) && self.general_valve.equal(&VALVE_STATE::valve_closed)) && self.analogical_switch.equal(&SWITCH_STATE::switch_closed)).booleanValue();
             self._tr_cache_evn_open_general_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -1205,7 +1244,7 @@ impl LandingGear_R6 {
     pub fn _tr_evn_close_general_valve(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_evn_close_general_valve.is_none() {
-            let mut __tmp__val__ = self.general_EV.equal(&BBoolean::new(false)).or(&self.analogical_switch.equal(&SWITCH_STATE::switch_open)).and(&self.general_valve.equal(&VALVE_STATE::valve_open)).booleanValue();
+            let mut __tmp__val__ = ((self.general_EV.equal(&BBoolean::new(false)) || self.analogical_switch.equal(&SWITCH_STATE::switch_open)) && self.general_valve.equal(&VALVE_STATE::valve_open)).booleanValue();
             self._tr_cache_evn_close_general_valve = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -1216,7 +1255,7 @@ impl LandingGear_R6 {
     pub fn _tr_env_close_analogical_switch(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_env_close_analogical_switch.is_none() {
-            let mut __tmp__val__ = self.analogical_switch.equal(&SWITCH_STATE::switch_open).and(&self.handle_move.equal(&BBoolean::new(true))).booleanValue();
+            let mut __tmp__val__ = (self.analogical_switch.equal(&SWITCH_STATE::switch_open) && self.handle_move.equal(&BBoolean::new(true))).booleanValue();
             self._tr_cache_env_close_analogical_switch = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -1317,12 +1356,12 @@ impl LandingGear_R6 {
 
     pub fn _check_inv_17(&self) -> bool {
         //invariant
-        return self.open_EV.equal(&BBoolean::new(true)).or(&self.close_EV.equal(&BBoolean::new(true))).or(&self.retract_EV.equal(&BBoolean::new(true))).or(&self.extend_EV.equal(&BBoolean::new(true))).implies(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
+        return (((self.open_EV.equal(&BBoolean::new(true)) || self.close_EV.equal(&BBoolean::new(true))) || self.retract_EV.equal(&BBoolean::new(true))) || self.extend_EV.equal(&BBoolean::new(true))).implies(&self.general_EV.equal(&BBoolean::new(true))).booleanValue();
     }
 
     pub fn _check_inv_18(&self) -> bool {
         //invariant
-        return self.open_EV.equal(&BBoolean::new(true)).and(&self.close_EV.equal(&BBoolean::new(true))).not().booleanValue();
+        return (self.open_EV.equal(&BBoolean::new(true)) && self.close_EV.equal(&BBoolean::new(true))).not().booleanValue();
     }
 
     pub fn _check_inv_19(&self) -> bool {
@@ -1360,11 +1399,10 @@ impl LandingGear_R6 {
         return self.gear.equal(&GEAR_STATE::gear_moving).implies(&self.door.equal(&DOOR_STATE::open)).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_begin_flying" => {self._tr_begin_flying(false);},
                 "_tr_land_plane" => {self._tr_land_plane(false);},
                 "_tr_open_valve_door_open" => {self._tr_open_valve_door_open(false);},
@@ -1411,1557 +1449,583 @@ impl LandingGear_R6 {
     //model_check_next_states
     fn generateNextStates(state: &mut LandingGear_R6,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<LandingGear_R6, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_guard_m: Arc<Mutex<HashMap<LandingGear_R6, HashSet<&str>>>>,
-                          guardCache: Arc<Mutex<HashMap<LandingGear_R6, PersistentHashMap<&str, bool>>>>,
-                          parents_m: Arc<Mutex<HashMap<LandingGear_R6, LandingGear_R6>>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<LandingGear_R6> {
-        let mut result = HashSet::<LandingGear_R6>::new();
-        if isCaching {
-            let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned());
-            let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() };
-            //model_check_transition
-            let mut _trid_1 = state._tr_begin_flying(isCaching);
-            if _trid_1 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.begin_flying();
-                match guard_dependency.get("begin_flying") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("begin_flying").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("begin_flying").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_land_plane(isCaching);
-            if _trid_2 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.land_plane();
-                match guard_dependency.get("land_plane") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("land_plane").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("land_plane").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_open_valve_door_open(isCaching);
-            if _trid_3 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.open_valve_door_open();
-                match guard_dependency.get("open_valve_door_open") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("open_valve_door_open").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("open_valve_door_open").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_close_valve_door_open(isCaching);
-            if _trid_4 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.close_valve_door_open();
-                match guard_dependency.get("close_valve_door_open") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("close_valve_door_open").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("close_valve_door_open").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_5 = state._tr_open_valve_door_close(isCaching);
-            if _trid_5 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.open_valve_door_close();
-                match guard_dependency.get("open_valve_door_close") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("open_valve_door_close").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("open_valve_door_close").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_close_valve_door_close(isCaching);
-            if _trid_6 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.close_valve_door_close();
-                match guard_dependency.get("close_valve_door_close") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("close_valve_door_close").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("close_valve_door_close").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_7 = state._tr_open_valve_retract_gear(isCaching);
-            if _trid_7 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.open_valve_retract_gear();
-                match guard_dependency.get("open_valve_retract_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("open_valve_retract_gear").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("open_valve_retract_gear").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_8 = state._tr_close_valve_retract_gear(isCaching);
-            if _trid_8 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.close_valve_retract_gear();
-                match guard_dependency.get("close_valve_retract_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("close_valve_retract_gear").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("close_valve_retract_gear").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_9 = state._tr_open_valve_extend_gear(isCaching);
-            if _trid_9 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.open_valve_extend_gear();
-                match guard_dependency.get("open_valve_extend_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("open_valve_extend_gear").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("open_valve_extend_gear").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_10 = state._tr_close_valve_extend_gear(isCaching);
-            if _trid_10 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.close_valve_extend_gear();
-                match guard_dependency.get("close_valve_extend_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("close_valve_extend_gear").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("close_valve_extend_gear").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_11 = state._tr_con_stimulate_open_door_valve(isCaching);
-            if _trid_11 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_open_door_valve();
-                match guard_dependency.get("con_stimulate_open_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stimulate_open_door_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_open_door_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_12 = state._tr_con_stop_stimulate_open_door_valve(isCaching);
-            if _trid_12 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_open_door_valve();
-                match guard_dependency.get("con_stop_stimulate_open_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stop_stimulate_open_door_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_open_door_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_13 = state._tr_con_stimulate_close_door_valve(isCaching);
-            if _trid_13 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_close_door_valve();
-                match guard_dependency.get("con_stimulate_close_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stimulate_close_door_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_close_door_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_14 = state._tr_con_stop_stimulate_close_door_valve(isCaching);
-            if _trid_14 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_close_door_valve();
-                match guard_dependency.get("con_stop_stimulate_close_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stop_stimulate_close_door_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_close_door_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_15 = state._tr_con_stimulate_retract_gear_valve(isCaching);
-            if _trid_15 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_retract_gear_valve();
-                match guard_dependency.get("con_stimulate_retract_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stimulate_retract_gear_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_retract_gear_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_16 = state._tr_con_stop_stimulate_retract_gear_valve(isCaching);
-            if _trid_16 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_retract_gear_valve();
-                match guard_dependency.get("con_stop_stimulate_retract_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stop_stimulate_retract_gear_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_retract_gear_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_17 = state._tr_con_stimulate_extend_gear_valve(isCaching);
-            if _trid_17 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_extend_gear_valve();
-                match guard_dependency.get("con_stimulate_extend_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stimulate_extend_gear_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_extend_gear_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_18 = state._tr_con_stop_stimulate_extend_gear_valve(isCaching);
-            if _trid_18 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_extend_gear_valve();
-                match guard_dependency.get("con_stop_stimulate_extend_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stop_stimulate_extend_gear_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_extend_gear_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_19 = state._tr_env_start_retracting_first(isCaching);
-            for param in _trid_19.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_start_retracting_first(_tmp_1);
-                match guard_dependency.get("env_start_retracting_first") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_start_retracting_first").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_start_retracting_first").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_20 = state._tr_env_retract_gear_skip(isCaching);
-            for param in _trid_20.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_retract_gear_skip(_tmp_1);
-                match guard_dependency.get("env_retract_gear_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_retract_gear_skip").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_retract_gear_skip").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_21 = state._tr_env_retract_gear_last(isCaching);
-            for param in _trid_21.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_retract_gear_last(_tmp_1);
-                match guard_dependency.get("env_retract_gear_last") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_retract_gear_last").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_retract_gear_last").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_22 = state._tr_env_start_extending(isCaching);
-            for param in _trid_22.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_start_extending(_tmp_1);
-                match guard_dependency.get("env_start_extending") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_start_extending").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_start_extending").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_23 = state._tr_env_extend_gear_last(isCaching);
-            for param in _trid_23.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_extend_gear_last(_tmp_1);
-                match guard_dependency.get("env_extend_gear_last") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_extend_gear_last").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_extend_gear_last").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_24 = state._tr_env_extend_gear_skip(isCaching);
-            for param in _trid_24.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_extend_gear_skip(_tmp_1);
-                match guard_dependency.get("env_extend_gear_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_extend_gear_skip").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_extend_gear_skip").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_25 = state._tr_env_start_open_door(isCaching);
-            for param in _trid_25.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_start_open_door(_tmp_1);
-                match guard_dependency.get("env_start_open_door") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_start_open_door").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_start_open_door").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_26 = state._tr_env_open_door_last(isCaching);
-            for param in _trid_26.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_open_door_last(_tmp_1);
-                match guard_dependency.get("env_open_door_last") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_open_door_last").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_open_door_last").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_27 = state._tr_env_open_door_skip(isCaching);
-            for param in _trid_27.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_open_door_skip(_tmp_1);
-                match guard_dependency.get("env_open_door_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_open_door_skip").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_open_door_skip").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_28 = state._tr_env_start_close_door(isCaching);
-            for param in _trid_28.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_start_close_door(_tmp_1);
-                match guard_dependency.get("env_start_close_door") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_start_close_door").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_start_close_door").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_29 = state._tr_env_close_door(isCaching);
-            for param in _trid_29.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_close_door(_tmp_1);
-                match guard_dependency.get("env_close_door") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_close_door").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_close_door").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_30 = state._tr_env_close_door_skip(isCaching);
-            for param in _trid_30.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_close_door_skip(_tmp_1);
-                match guard_dependency.get("env_close_door_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_close_door_skip").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_close_door_skip").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_31 = state._tr_toggle_handle_up(isCaching);
-            if _trid_31 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.toggle_handle_up();
-                match guard_dependency.get("toggle_handle_up") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("toggle_handle_up").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("toggle_handle_up").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_32 = state._tr_toggle_handle_down(isCaching);
-            if _trid_32 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.toggle_handle_down();
-                match guard_dependency.get("toggle_handle_down") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("toggle_handle_down").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("toggle_handle_down").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_33 = state._tr_con_stimulate_general_valve(isCaching);
-            if _trid_33 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_general_valve();
-                match guard_dependency.get("con_stimulate_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stimulate_general_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stimulate_general_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_34 = state._tr_con_stop_stimulate_general_valve(isCaching);
-            if _trid_34 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_general_valve();
-                match guard_dependency.get("con_stop_stimulate_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("con_stop_stimulate_general_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("con_stop_stimulate_general_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_35 = state._tr_evn_open_general_valve(isCaching);
-            if _trid_35 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.evn_open_general_valve();
-                match guard_dependency.get("evn_open_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("evn_open_general_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("evn_open_general_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_36 = state._tr_evn_close_general_valve(isCaching);
-            if _trid_36 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.evn_close_general_valve();
-                match guard_dependency.get("evn_close_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("evn_close_general_valve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("evn_close_general_valve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_37 = state._tr_env_close_analogical_switch(isCaching);
-            if _trid_37 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.env_close_analogical_switch();
-                match guard_dependency.get("env_close_analogical_switch") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_close_analogical_switch").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_close_analogical_switch").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_38 = state._tr_env_open_analogical_switch(isCaching);
-            if _trid_38 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.env_open_analogical_switch();
-                match guard_dependency.get("env_open_analogical_switch") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("env_open_analogical_switch").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("env_open_analogical_switch").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-
-            guardCache.lock().unwrap().insert(state.clone(), newCache);
-        } else {
-            //model_check_transition
-            if state._tr_begin_flying(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.begin_flying();
-                match guard_dependency.get("begin_flying") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_land_plane(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.land_plane();
-                match guard_dependency.get("land_plane") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_open_valve_door_open(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.open_valve_door_open();
-                match guard_dependency.get("open_valve_door_open") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_close_valve_door_open(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.close_valve_door_open();
-                match guard_dependency.get("close_valve_door_open") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_open_valve_door_close(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.open_valve_door_close();
-                match guard_dependency.get("open_valve_door_close") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_close_valve_door_close(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.close_valve_door_close();
-                match guard_dependency.get("close_valve_door_close") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_open_valve_retract_gear(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.open_valve_retract_gear();
-                match guard_dependency.get("open_valve_retract_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_close_valve_retract_gear(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.close_valve_retract_gear();
-                match guard_dependency.get("close_valve_retract_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_open_valve_extend_gear(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.open_valve_extend_gear();
-                match guard_dependency.get("open_valve_extend_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_close_valve_extend_gear(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.close_valve_extend_gear();
-                match guard_dependency.get("close_valve_extend_gear") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stimulate_open_door_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_open_door_valve();
-                match guard_dependency.get("con_stimulate_open_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stop_stimulate_open_door_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_open_door_valve();
-                match guard_dependency.get("con_stop_stimulate_open_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stimulate_close_door_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_close_door_valve();
-                match guard_dependency.get("con_stimulate_close_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stop_stimulate_close_door_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_close_door_valve();
-                match guard_dependency.get("con_stop_stimulate_close_door_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stimulate_retract_gear_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_retract_gear_valve();
-                match guard_dependency.get("con_stimulate_retract_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stop_stimulate_retract_gear_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_retract_gear_valve();
-                match guard_dependency.get("con_stop_stimulate_retract_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stimulate_extend_gear_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_extend_gear_valve();
-                match guard_dependency.get("con_stimulate_extend_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stop_stimulate_extend_gear_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_extend_gear_valve();
-                match guard_dependency.get("con_stop_stimulate_extend_gear_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_19 = state._tr_env_start_retracting_first(isCaching);
-            for param in _trid_19.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_start_retracting_first(_tmp_1);
-                match guard_dependency.get("env_start_retracting_first") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_20 = state._tr_env_retract_gear_skip(isCaching);
-            for param in _trid_20.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_retract_gear_skip(_tmp_1);
-                match guard_dependency.get("env_retract_gear_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_21 = state._tr_env_retract_gear_last(isCaching);
-            for param in _trid_21.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_retract_gear_last(_tmp_1);
-                match guard_dependency.get("env_retract_gear_last") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_22 = state._tr_env_start_extending(isCaching);
-            for param in _trid_22.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_start_extending(_tmp_1);
-                match guard_dependency.get("env_start_extending") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_23 = state._tr_env_extend_gear_last(isCaching);
-            for param in _trid_23.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_extend_gear_last(_tmp_1);
-                match guard_dependency.get("env_extend_gear_last") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_24 = state._tr_env_extend_gear_skip(isCaching);
-            for param in _trid_24.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_extend_gear_skip(_tmp_1);
-                match guard_dependency.get("env_extend_gear_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_25 = state._tr_env_start_open_door(isCaching);
-            for param in _trid_25.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_start_open_door(_tmp_1);
-                match guard_dependency.get("env_start_open_door") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_26 = state._tr_env_open_door_last(isCaching);
-            for param in _trid_26.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_open_door_last(_tmp_1);
-                match guard_dependency.get("env_open_door_last") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_27 = state._tr_env_open_door_skip(isCaching);
-            for param in _trid_27.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_open_door_skip(_tmp_1);
-                match guard_dependency.get("env_open_door_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_28 = state._tr_env_start_close_door(isCaching);
-            for param in _trid_28.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_start_close_door(_tmp_1);
-                match guard_dependency.get("env_start_close_door") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_29 = state._tr_env_close_door(isCaching);
-            for param in _trid_29.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_close_door(_tmp_1);
-                match guard_dependency.get("env_close_door") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_30 = state._tr_env_close_door_skip(isCaching);
-            for param in _trid_30.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.env_close_door_skip(_tmp_1);
-                match guard_dependency.get("env_close_door_skip") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_toggle_handle_up(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.toggle_handle_up();
-                match guard_dependency.get("toggle_handle_up") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_toggle_handle_down(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.toggle_handle_down();
-                match guard_dependency.get("toggle_handle_down") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stimulate_general_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stimulate_general_valve();
-                match guard_dependency.get("con_stimulate_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_con_stop_stimulate_general_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.con_stop_stimulate_general_valve();
-                match guard_dependency.get("con_stop_stimulate_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_evn_open_general_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.evn_open_general_valve();
-                match guard_dependency.get("evn_open_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_evn_close_general_valve(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.evn_close_general_valve();
-                match guard_dependency.get("evn_close_general_valve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_env_close_analogical_switch(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.env_close_analogical_switch();
-                match guard_dependency.get("env_close_analogical_switch") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_env_open_analogical_switch(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.env_open_analogical_switch();
-                match guard_dependency.get("env_open_analogical_switch") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-
-        }
+                          transitions: Arc<AtomicU64>) -> HashSet<(LandingGear_R6, &'static str)> {
+        let mut result = HashSet::<(LandingGear_R6, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        if state._tr_begin_flying(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.begin_flying();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("begin_flying")); }
+            result.insert((copiedState, "begin_flying"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_land_plane(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.land_plane();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("land_plane")); }
+            result.insert((copiedState, "land_plane"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_open_valve_door_open(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.open_valve_door_open();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("open_valve_door_open")); }
+            result.insert((copiedState, "open_valve_door_open"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_close_valve_door_open(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.close_valve_door_open();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("close_valve_door_open")); }
+            result.insert((copiedState, "close_valve_door_open"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_open_valve_door_close(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.open_valve_door_close();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("open_valve_door_close")); }
+            result.insert((copiedState, "open_valve_door_close"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_close_valve_door_close(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.close_valve_door_close();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("close_valve_door_close")); }
+            result.insert((copiedState, "close_valve_door_close"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_open_valve_retract_gear(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.open_valve_retract_gear();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("open_valve_retract_gear")); }
+            result.insert((copiedState, "open_valve_retract_gear"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_close_valve_retract_gear(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.close_valve_retract_gear();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("close_valve_retract_gear")); }
+            result.insert((copiedState, "close_valve_retract_gear"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_open_valve_extend_gear(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.open_valve_extend_gear();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("open_valve_extend_gear")); }
+            result.insert((copiedState, "open_valve_extend_gear"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_close_valve_extend_gear(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.close_valve_extend_gear();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("close_valve_extend_gear")); }
+            result.insert((copiedState, "close_valve_extend_gear"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stimulate_open_door_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stimulate_open_door_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_open_door_valve")); }
+            result.insert((copiedState, "con_stimulate_open_door_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stop_stimulate_open_door_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stop_stimulate_open_door_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_open_door_valve")); }
+            result.insert((copiedState, "con_stop_stimulate_open_door_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stimulate_close_door_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stimulate_close_door_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_close_door_valve")); }
+            result.insert((copiedState, "con_stimulate_close_door_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stop_stimulate_close_door_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stop_stimulate_close_door_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_close_door_valve")); }
+            result.insert((copiedState, "con_stop_stimulate_close_door_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stimulate_retract_gear_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stimulate_retract_gear_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_retract_gear_valve")); }
+            result.insert((copiedState, "con_stimulate_retract_gear_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stop_stimulate_retract_gear_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stop_stimulate_retract_gear_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_retract_gear_valve")); }
+            result.insert((copiedState, "con_stop_stimulate_retract_gear_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stimulate_extend_gear_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stimulate_extend_gear_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_extend_gear_valve")); }
+            result.insert((copiedState, "con_stimulate_extend_gear_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stop_stimulate_extend_gear_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stop_stimulate_extend_gear_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_extend_gear_valve")); }
+            result.insert((copiedState, "con_stop_stimulate_extend_gear_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_19 = state._tr_env_start_retracting_first(isCaching);
+        for param in _trid_19.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_start_retracting_first(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_start_retracting_first")); }
+            result.insert((copiedState, "env_start_retracting_first"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_20 = state._tr_env_retract_gear_skip(isCaching);
+        for param in _trid_20.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_retract_gear_skip(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_retract_gear_skip")); }
+            result.insert((copiedState, "env_retract_gear_skip"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_21 = state._tr_env_retract_gear_last(isCaching);
+        for param in _trid_21.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_retract_gear_last(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_retract_gear_last")); }
+            result.insert((copiedState, "env_retract_gear_last"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_22 = state._tr_env_start_extending(isCaching);
+        for param in _trid_22.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_start_extending(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_start_extending")); }
+            result.insert((copiedState, "env_start_extending"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_23 = state._tr_env_extend_gear_last(isCaching);
+        for param in _trid_23.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_extend_gear_last(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_extend_gear_last")); }
+            result.insert((copiedState, "env_extend_gear_last"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_24 = state._tr_env_extend_gear_skip(isCaching);
+        for param in _trid_24.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_extend_gear_skip(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_extend_gear_skip")); }
+            result.insert((copiedState, "env_extend_gear_skip"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_25 = state._tr_env_start_open_door(isCaching);
+        for param in _trid_25.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_start_open_door(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_start_open_door")); }
+            result.insert((copiedState, "env_start_open_door"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_26 = state._tr_env_open_door_last(isCaching);
+        for param in _trid_26.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_open_door_last(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_open_door_last")); }
+            result.insert((copiedState, "env_open_door_last"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_27 = state._tr_env_open_door_skip(isCaching);
+        for param in _trid_27.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_open_door_skip(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_open_door_skip")); }
+            result.insert((copiedState, "env_open_door_skip"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_28 = state._tr_env_start_close_door(isCaching);
+        for param in _trid_28.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_start_close_door(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_start_close_door")); }
+            result.insert((copiedState, "env_start_close_door"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_29 = state._tr_env_close_door(isCaching);
+        for param in _trid_29.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_close_door(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_close_door")); }
+            result.insert((copiedState, "env_close_door"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_30 = state._tr_env_close_door_skip(isCaching);
+        for param in _trid_30.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.env_close_door_skip(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_close_door_skip")); }
+            result.insert((copiedState, "env_close_door_skip"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_toggle_handle_up(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.toggle_handle_up();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("toggle_handle_up")); }
+            result.insert((copiedState, "toggle_handle_up"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_toggle_handle_down(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.toggle_handle_down();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("toggle_handle_down")); }
+            result.insert((copiedState, "toggle_handle_down"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stimulate_general_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stimulate_general_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stimulate_general_valve")); }
+            result.insert((copiedState, "con_stimulate_general_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_con_stop_stimulate_general_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.con_stop_stimulate_general_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("con_stop_stimulate_general_valve")); }
+            result.insert((copiedState, "con_stop_stimulate_general_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_evn_open_general_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.evn_open_general_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("evn_open_general_valve")); }
+            result.insert((copiedState, "evn_open_general_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_evn_close_general_valve(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.evn_close_general_valve();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("evn_close_general_valve")); }
+            result.insert((copiedState, "evn_close_general_valve"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_env_close_analogical_switch(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.env_close_analogical_switch();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_close_analogical_switch")); }
+            result.insert((copiedState, "env_close_analogical_switch"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_env_open_analogical_switch(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.env_open_analogical_switch();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("env_open_analogical_switch")); }
+            result.insert((copiedState, "env_open_analogical_switch"));
+            evaluated_transitions += 1;
+        }
+
+
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &LandingGear_R6,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<LandingGear_R6, HashSet<&str>>>> ) -> bool {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &LandingGear_R6, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_2") {
+            if dependent_invariants_of_state.contains(&"_check_inv_2") {
                 if !state._check_inv_2() {
+                    println!("_check_inv_2 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_3") {
+            if dependent_invariants_of_state.contains(&"_check_inv_3") {
                 if !state._check_inv_3() {
+                    println!("_check_inv_3 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_4") {
+            if dependent_invariants_of_state.contains(&"_check_inv_4") {
                 if !state._check_inv_4() {
+                    println!("_check_inv_4 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_5") {
+            if dependent_invariants_of_state.contains(&"_check_inv_5") {
                 if !state._check_inv_5() {
+                    println!("_check_inv_5 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_6") {
+            if dependent_invariants_of_state.contains(&"_check_inv_6") {
                 if !state._check_inv_6() {
+                    println!("_check_inv_6 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_7") {
+            if dependent_invariants_of_state.contains(&"_check_inv_7") {
                 if !state._check_inv_7() {
+                    println!("_check_inv_7 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_8") {
+            if dependent_invariants_of_state.contains(&"_check_inv_8") {
                 if !state._check_inv_8() {
+                    println!("_check_inv_8 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_9") {
+            if dependent_invariants_of_state.contains(&"_check_inv_9") {
                 if !state._check_inv_9() {
+                    println!("_check_inv_9 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_10") {
+            if dependent_invariants_of_state.contains(&"_check_inv_10") {
                 if !state._check_inv_10() {
+                    println!("_check_inv_10 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_11") {
+            if dependent_invariants_of_state.contains(&"_check_inv_11") {
                 if !state._check_inv_11() {
+                    println!("_check_inv_11 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_12") {
+            if dependent_invariants_of_state.contains(&"_check_inv_12") {
                 if !state._check_inv_12() {
+                    println!("_check_inv_12 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_13") {
+            if dependent_invariants_of_state.contains(&"_check_inv_13") {
                 if !state._check_inv_13() {
+                    println!("_check_inv_13 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_14") {
+            if dependent_invariants_of_state.contains(&"_check_inv_14") {
                 if !state._check_inv_14() {
+                    println!("_check_inv_14 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_15") {
+            if dependent_invariants_of_state.contains(&"_check_inv_15") {
                 if !state._check_inv_15() {
+                    println!("_check_inv_15 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_16") {
+            if dependent_invariants_of_state.contains(&"_check_inv_16") {
                 if !state._check_inv_16() {
+                    println!("_check_inv_16 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_17") {
+            if dependent_invariants_of_state.contains(&"_check_inv_17") {
                 if !state._check_inv_17() {
+                    println!("_check_inv_17 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_18") {
+            if dependent_invariants_of_state.contains(&"_check_inv_18") {
                 if !state._check_inv_18() {
+                    println!("_check_inv_18 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_19") {
+            if dependent_invariants_of_state.contains(&"_check_inv_19") {
                 if !state._check_inv_19() {
+                    println!("_check_inv_19 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_20") {
+            if dependent_invariants_of_state.contains(&"_check_inv_20") {
                 if !state._check_inv_20() {
+                    println!("_check_inv_20 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_21") {
+            if dependent_invariants_of_state.contains(&"_check_inv_21") {
                 if !state._check_inv_21() {
+                    println!("_check_inv_21 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_22") {
+            if dependent_invariants_of_state.contains(&"_check_inv_22") {
                 if !state._check_inv_22() {
+                    println!("_check_inv_22 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_23") {
+            if dependent_invariants_of_state.contains(&"_check_inv_23") {
                 if !state._check_inv_23() {
+                    println!("_check_inv_23 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_24") {
+            if dependent_invariants_of_state.contains(&"_check_inv_24") {
                 if !state._check_inv_24() {
+                    println!("_check_inv_24 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_25") {
+            if dependent_invariants_of_state.contains(&"_check_inv_25") {
                 if !state._check_inv_25() {
+                    println!("_check_inv_25 failed!");
                     return false;
                 }
             }
@@ -2971,16 +2035,14 @@ impl LandingGear_R6 {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<LandingGear_R6>>>, mc_type: MC_TYPE) -> LandingGear_R6 {
+    fn next(collection_m: Arc<Mutex<LinkedList<(LandingGear_R6, &'static str)>>>, mc_type: MC_TYPE) -> (LandingGear_R6, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -2989,220 +2051,208 @@ impl LandingGear_R6 {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = LandingGear_R6::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() || !machine._check_inv_21() || !machine._check_inv_22() || !machine._check_inv_23() || !machine._check_inv_24() || !machine._check_inv_25() {
-            invariant_violated.store(true, Ordering::Release);
-        }
-
-        let mut states = HashSet::<LandingGear_R6>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<LandingGear_R6>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, HashSet<&str>>::new()));
-        let mut guard_cache = Arc::new(Mutex::new(HashMap::<LandingGear_R6, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, LandingGear_R6>::new()));
-
-        if is_caching {
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            invariantDependency.insert("close_valve_door_close", HashSet::from(["_check_inv_10"]));
+            "close_valve_door_close" => vec!["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"],
             //model_check_init_static
-            invariantDependency.insert("close_valve_retract_gear", HashSet::from(["_check_inv_13"]));
+            "close_valve_retract_gear" => vec!["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"],
             //model_check_init_static
-            invariantDependency.insert("con_stimulate_open_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_7"]));
+            "con_stimulate_open_door_valve" => vec!["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"],
             //model_check_init_static
-            invariantDependency.insert("env_close_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"]));
+            "env_close_door" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("env_start_close_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"]));
+            "env_start_close_door" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("toggle_handle_up", HashSet::from(["_check_inv_4", "_check_inv_14"]));
+            "toggle_handle_up" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"],
             //model_check_init_static
-            invariantDependency.insert("toggle_handle_down", HashSet::from(["_check_inv_4", "_check_inv_14"]));
+            "toggle_handle_down" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"],
             //model_check_init_static
-            invariantDependency.insert("open_valve_door_open", HashSet::from(["_check_inv_12"]));
+            "open_valve_door_open" => vec!["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"],
             //model_check_init_static
-            invariantDependency.insert("env_retract_gear_last", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"]));
+            "env_retract_gear_last" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("env_open_door_last", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"]));
+            "env_open_door_last" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_retract_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_8"]));
+            "con_stop_stimulate_retract_gear_valve" => vec!["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"],
             //model_check_init_static
-            invariantDependency.insert("env_close_door_skip", HashSet::from(["_check_inv_21", "_check_inv_20", "_check_inv_22"]));
+            "env_close_door_skip" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_close_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_5"]));
+            "con_stop_stimulate_close_door_valve" => vec!["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"],
             //model_check_init_static
-            invariantDependency.insert("env_open_analogical_switch", HashSet::from(["_check_inv_1"]));
+            "env_open_analogical_switch" => vec!["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"],
             //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_general_valve", HashSet::from(["_check_inv_17", "_check_inv_2", "_check_inv_4"]));
+            "con_stop_stimulate_general_valve" => vec!["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve"],
             //model_check_init_static
-            invariantDependency.insert("env_extend_gear_last", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"]));
+            "env_extend_gear_last" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("evn_open_general_valve", HashSet::from(["_check_inv_3"]));
+            "evn_open_general_valve" => vec!["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("land_plane", HashSet::from(["_check_inv_9"]));
+            "land_plane" => vec!["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"],
             //model_check_init_static
-            invariantDependency.insert("con_stimulate_retract_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_8"]));
+            "con_stimulate_retract_gear_valve" => vec!["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"],
             //model_check_init_static
-            invariantDependency.insert("con_stimulate_general_valve", HashSet::from(["_check_inv_17", "_check_inv_2"]));
+            "con_stimulate_general_valve" => vec!["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"],
             //model_check_init_static
-            invariantDependency.insert("env_start_retracting_first", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"]));
+            "env_start_retracting_first" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("env_retract_gear_skip", HashSet::from(["_check_inv_19", "_check_inv_24", "_check_inv_23"]));
+            "env_retract_gear_skip" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("open_valve_extend_gear", HashSet::from(["_check_inv_11"]));
+            "open_valve_extend_gear" => vec!["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"],
             //model_check_init_static
-            invariantDependency.insert("begin_flying", HashSet::from(["_check_inv_9"]));
+            "begin_flying" => vec!["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"],
             //model_check_init_static
-            invariantDependency.insert("open_valve_retract_gear", HashSet::from(["_check_inv_13"]));
+            "open_valve_retract_gear" => vec!["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"],
             //model_check_init_static
-            invariantDependency.insert("env_close_analogical_switch", HashSet::from(["_check_inv_1"]));
+            "env_close_analogical_switch" => vec!["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"],
             //model_check_init_static
-            invariantDependency.insert("env_start_extending", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"]));
+            "env_start_extending" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("open_valve_door_close", HashSet::from(["_check_inv_10"]));
+            "open_valve_door_close" => vec!["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"],
             //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_open_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_7"]));
+            "con_stop_stimulate_open_door_valve" => vec!["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"],
             //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_extend_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_6"]));
+            "con_stop_stimulate_extend_gear_valve" => vec!["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"],
             //model_check_init_static
-            invariantDependency.insert("evn_close_general_valve", HashSet::from(["_check_inv_3"]));
+            "evn_close_general_valve" => vec!["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("close_valve_extend_gear", HashSet::from(["_check_inv_11"]));
+            "close_valve_extend_gear" => vec!["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"],
             //model_check_init_static
-            invariantDependency.insert("con_stimulate_extend_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_6"]));
+            "con_stimulate_extend_gear_valve" => vec!["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"],
             //model_check_init_static
-            invariantDependency.insert("close_valve_door_open", HashSet::from(["_check_inv_12"]));
+            "close_valve_door_open" => vec!["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"],
             //model_check_init_static
-            invariantDependency.insert("con_stimulate_close_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_5"]));
+            "con_stimulate_close_door_valve" => vec!["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"],
             //model_check_init_static
-            invariantDependency.insert("env_extend_gear_skip", HashSet::from(["_check_inv_19", "_check_inv_24", "_check_inv_23"]));
+            "env_extend_gear_skip" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("env_open_door_skip", HashSet::from(["_check_inv_21", "_check_inv_20", "_check_inv_22"]));
+            "env_open_door_skip" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
             //model_check_init_static
-            invariantDependency.insert("env_start_open_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"]));
+            "env_start_open_door" => vec!["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"],
+            _ => vec![],
+        }
+    }
+
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            guardDependency.insert("close_valve_door_close", HashSet::from(["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"]));
+            "close_valve_door_close" => vec!["_check_inv_10"],
             //model_check_init_static
-            guardDependency.insert("close_valve_retract_gear", HashSet::from(["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"]));
+            "close_valve_retract_gear" => vec!["_check_inv_13"],
             //model_check_init_static
-            guardDependency.insert("con_stimulate_open_door_valve", HashSet::from(["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"]));
+            "con_stimulate_open_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_7"],
             //model_check_init_static
-            guardDependency.insert("env_close_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_close_door" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"],
             //model_check_init_static
-            guardDependency.insert("env_start_close_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_start_close_door" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"],
             //model_check_init_static
-            guardDependency.insert("toggle_handle_up", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"]));
+            "toggle_handle_up" => vec!["_check_inv_4", "_check_inv_14"],
             //model_check_init_static
-            guardDependency.insert("toggle_handle_down", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"]));
+            "toggle_handle_down" => vec!["_check_inv_4", "_check_inv_14"],
             //model_check_init_static
-            guardDependency.insert("open_valve_door_open", HashSet::from(["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"]));
+            "open_valve_door_open" => vec!["_check_inv_12"],
             //model_check_init_static
-            guardDependency.insert("env_retract_gear_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_retract_gear_last" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"],
             //model_check_init_static
-            guardDependency.insert("env_open_door_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_open_door_last" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"],
             //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_retract_gear_valve", HashSet::from(["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"]));
+            "con_stop_stimulate_retract_gear_valve" => vec!["_check_inv_17", "_check_inv_8"],
             //model_check_init_static
-            guardDependency.insert("env_close_door_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_close_door_skip" => vec!["_check_inv_21", "_check_inv_20", "_check_inv_22"],
             //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_close_door_valve", HashSet::from(["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"]));
+            "con_stop_stimulate_close_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_5"],
             //model_check_init_static
-            guardDependency.insert("env_open_analogical_switch", HashSet::from(["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"]));
+            "env_open_analogical_switch" => vec!["_check_inv_1"],
             //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_general_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve"]));
+            "con_stop_stimulate_general_valve" => vec!["_check_inv_17", "_check_inv_2", "_check_inv_4"],
             //model_check_init_static
-            guardDependency.insert("env_extend_gear_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_extend_gear_last" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"],
             //model_check_init_static
-            guardDependency.insert("evn_open_general_valve", HashSet::from(["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "evn_open_general_valve" => vec!["_check_inv_3"],
             //model_check_init_static
-            guardDependency.insert("land_plane", HashSet::from(["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"]));
+            "land_plane" => vec!["_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("con_stimulate_retract_gear_valve", HashSet::from(["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"]));
+            "con_stimulate_retract_gear_valve" => vec!["_check_inv_17", "_check_inv_8"],
             //model_check_init_static
-            guardDependency.insert("con_stimulate_general_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"]));
+            "con_stimulate_general_valve" => vec!["_check_inv_17", "_check_inv_2"],
             //model_check_init_static
-            guardDependency.insert("env_start_retracting_first", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_start_retracting_first" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"],
             //model_check_init_static
-            guardDependency.insert("env_retract_gear_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_retract_gear_skip" => vec!["_check_inv_19", "_check_inv_24", "_check_inv_23"],
             //model_check_init_static
-            guardDependency.insert("open_valve_extend_gear", HashSet::from(["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"]));
+            "open_valve_extend_gear" => vec!["_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("begin_flying", HashSet::from(["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"]));
+            "begin_flying" => vec!["_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("open_valve_retract_gear", HashSet::from(["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"]));
+            "open_valve_retract_gear" => vec!["_check_inv_13"],
             //model_check_init_static
-            guardDependency.insert("env_close_analogical_switch", HashSet::from(["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"]));
+            "env_close_analogical_switch" => vec!["_check_inv_1"],
             //model_check_init_static
-            guardDependency.insert("env_start_extending", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_start_extending" => vec!["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"],
             //model_check_init_static
-            guardDependency.insert("open_valve_door_close", HashSet::from(["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"]));
+            "open_valve_door_close" => vec!["_check_inv_10"],
             //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_open_door_valve", HashSet::from(["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"]));
+            "con_stop_stimulate_open_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_7"],
             //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_extend_gear_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"]));
+            "con_stop_stimulate_extend_gear_valve" => vec!["_check_inv_17", "_check_inv_6"],
             //model_check_init_static
-            guardDependency.insert("evn_close_general_valve", HashSet::from(["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "evn_close_general_valve" => vec!["_check_inv_3"],
             //model_check_init_static
-            guardDependency.insert("close_valve_extend_gear", HashSet::from(["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"]));
+            "close_valve_extend_gear" => vec!["_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("con_stimulate_extend_gear_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"]));
+            "con_stimulate_extend_gear_valve" => vec!["_check_inv_17", "_check_inv_6"],
             //model_check_init_static
-            guardDependency.insert("close_valve_door_open", HashSet::from(["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"]));
+            "close_valve_door_open" => vec!["_check_inv_12"],
             //model_check_init_static
-            guardDependency.insert("con_stimulate_close_door_valve", HashSet::from(["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"]));
+            "con_stimulate_close_door_valve" => vec!["_check_inv_18", "_check_inv_17", "_check_inv_5"],
             //model_check_init_static
-            guardDependency.insert("env_extend_gear_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_extend_gear_skip" => vec!["_check_inv_19", "_check_inv_24", "_check_inv_23"],
             //model_check_init_static
-            guardDependency.insert("env_open_door_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
+            "env_open_door_skip" => vec!["_check_inv_21", "_check_inv_20", "_check_inv_22"],
             //model_check_init_static
-            guardDependency.insert("env_start_open_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
+            "env_start_open_door" => vec!["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"],
+            _ => vec![],
         }
+    }
 
-        let transitions = Arc::new(AtomicI64::new(0));
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = LandingGear_R6::new();
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        let mut all_states = HashSet::<LandingGear_R6>::new();
+        all_states.insert(machine.clone());
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(LandingGear_R6, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+        let num_transitions = Arc::new(AtomicU64::new(0));
+
+        let mut stop_threads = false;
+
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
 
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                       .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                       .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -3210,255 +2260,66 @@ impl LandingGear_R6 {
 
         let machine = LandingGear_R6::new();
 
+        let all_states = Arc::new(DashSet::<LandingGear_R6>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(LandingGear_R6, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() || !machine._check_inv_19() || !machine._check_inv_20() || !machine._check_inv_21() || !machine._check_inv_22() || !machine._check_inv_23() || !machine._check_inv_24() || !machine._check_inv_25() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
-
-        let states_m = Arc::new(Mutex::new(HashSet::<LandingGear_R6>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<LandingGear_R6>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, HashSet<&str>>::new()));
-        let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<LandingGear_R6, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<LandingGear_R6, LandingGear_R6>::new()));
-
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("close_valve_door_close", HashSet::from(["_check_inv_10"]));
-            //model_check_init_static
-            invariantDependency.insert("close_valve_retract_gear", HashSet::from(["_check_inv_13"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stimulate_open_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_7"]));
-            //model_check_init_static
-            invariantDependency.insert("env_close_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"]));
-            //model_check_init_static
-            invariantDependency.insert("env_start_close_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"]));
-            //model_check_init_static
-            invariantDependency.insert("toggle_handle_up", HashSet::from(["_check_inv_4", "_check_inv_14"]));
-            //model_check_init_static
-            invariantDependency.insert("toggle_handle_down", HashSet::from(["_check_inv_4", "_check_inv_14"]));
-            //model_check_init_static
-            invariantDependency.insert("open_valve_door_open", HashSet::from(["_check_inv_12"]));
-            //model_check_init_static
-            invariantDependency.insert("env_retract_gear_last", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"]));
-            //model_check_init_static
-            invariantDependency.insert("env_open_door_last", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_retract_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_8"]));
-            //model_check_init_static
-            invariantDependency.insert("env_close_door_skip", HashSet::from(["_check_inv_21", "_check_inv_20", "_check_inv_22"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_close_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_5"]));
-            //model_check_init_static
-            invariantDependency.insert("env_open_analogical_switch", HashSet::from(["_check_inv_1"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_general_valve", HashSet::from(["_check_inv_17", "_check_inv_2", "_check_inv_4"]));
-            //model_check_init_static
-            invariantDependency.insert("env_extend_gear_last", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"]));
-            //model_check_init_static
-            invariantDependency.insert("evn_open_general_valve", HashSet::from(["_check_inv_3"]));
-            //model_check_init_static
-            invariantDependency.insert("land_plane", HashSet::from(["_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stimulate_retract_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_8"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stimulate_general_valve", HashSet::from(["_check_inv_17", "_check_inv_2"]));
-            //model_check_init_static
-            invariantDependency.insert("env_start_retracting_first", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"]));
-            //model_check_init_static
-            invariantDependency.insert("env_retract_gear_skip", HashSet::from(["_check_inv_19", "_check_inv_24", "_check_inv_23"]));
-            //model_check_init_static
-            invariantDependency.insert("open_valve_extend_gear", HashSet::from(["_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("begin_flying", HashSet::from(["_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("open_valve_retract_gear", HashSet::from(["_check_inv_13"]));
-            //model_check_init_static
-            invariantDependency.insert("env_close_analogical_switch", HashSet::from(["_check_inv_1"]));
-            //model_check_init_static
-            invariantDependency.insert("env_start_extending", HashSet::from(["_check_inv_16", "_check_inv_19", "_check_inv_25", "_check_inv_24", "_check_inv_23"]));
-            //model_check_init_static
-            invariantDependency.insert("open_valve_door_close", HashSet::from(["_check_inv_10"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_open_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_7"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stop_stimulate_extend_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_6"]));
-            //model_check_init_static
-            invariantDependency.insert("evn_close_general_valve", HashSet::from(["_check_inv_3"]));
-            //model_check_init_static
-            invariantDependency.insert("close_valve_extend_gear", HashSet::from(["_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stimulate_extend_gear_valve", HashSet::from(["_check_inv_17", "_check_inv_6"]));
-            //model_check_init_static
-            invariantDependency.insert("close_valve_door_open", HashSet::from(["_check_inv_12"]));
-            //model_check_init_static
-            invariantDependency.insert("con_stimulate_close_door_valve", HashSet::from(["_check_inv_18", "_check_inv_17", "_check_inv_5"]));
-            //model_check_init_static
-            invariantDependency.insert("env_extend_gear_skip", HashSet::from(["_check_inv_19", "_check_inv_24", "_check_inv_23"]));
-            //model_check_init_static
-            invariantDependency.insert("env_open_door_skip", HashSet::from(["_check_inv_21", "_check_inv_20", "_check_inv_22"]));
-            //model_check_init_static
-            invariantDependency.insert("env_start_open_door", HashSet::from(["_check_inv_15", "_check_inv_21", "_check_inv_20", "_check_inv_25", "_check_inv_22"]));
-            //model_check_init_static
-            guardDependency.insert("close_valve_door_close", HashSet::from(["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"]));
-            //model_check_init_static
-            guardDependency.insert("close_valve_retract_gear", HashSet::from(["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"]));
-            //model_check_init_static
-            guardDependency.insert("con_stimulate_open_door_valve", HashSet::from(["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"]));
-            //model_check_init_static
-            guardDependency.insert("env_close_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("env_start_close_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("toggle_handle_up", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"]));
-            //model_check_init_static
-            guardDependency.insert("toggle_handle_down", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip", "_tr_con_stimulate_general_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_toggle_handle_down", "_tr_env_open_door_last", "_tr_toggle_handle_up", "_tr_env_start_close_door", "_tr_con_stop_stimulate_close_door_valve"]));
-            //model_check_init_static
-            guardDependency.insert("open_valve_door_open", HashSet::from(["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"]));
-            //model_check_init_static
-            guardDependency.insert("env_retract_gear_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("env_open_door_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_retract_gear_valve", HashSet::from(["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"]));
-            //model_check_init_static
-            guardDependency.insert("env_close_door_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_close_door_valve", HashSet::from(["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"]));
-            //model_check_init_static
-            guardDependency.insert("env_open_analogical_switch", HashSet::from(["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"]));
-            //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_general_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve"]));
-            //model_check_init_static
-            guardDependency.insert("env_extend_gear_last", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("evn_open_general_valve", HashSet::from(["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("land_plane", HashSet::from(["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"]));
-            //model_check_init_static
-            guardDependency.insert("con_stimulate_retract_gear_valve", HashSet::from(["_tr_close_valve_retract_gear", "_tr_con_stimulate_extend_gear_valve", "_tr_open_valve_retract_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"]));
-            //model_check_init_static
-            guardDependency.insert("con_stimulate_general_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_con_stimulate_general_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_evn_open_general_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_evn_close_general_valve", "_tr_con_stop_stimulate_retract_gear_valve"]));
-            //model_check_init_static
-            guardDependency.insert("env_start_retracting_first", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("env_retract_gear_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("open_valve_extend_gear", HashSet::from(["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"]));
-            //model_check_init_static
-            guardDependency.insert("begin_flying", HashSet::from(["_tr_land_plane", "_tr_begin_flying", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_close_door"]));
-            //model_check_init_static
-            guardDependency.insert("open_valve_retract_gear", HashSet::from(["_tr_close_valve_retract_gear", "_tr_open_valve_retract_gear", "_tr_env_start_retracting_first"]));
-            //model_check_init_static
-            guardDependency.insert("env_close_analogical_switch", HashSet::from(["_tr_env_open_analogical_switch", "_tr_evn_open_general_valve", "_tr_env_close_analogical_switch", "_tr_evn_close_general_valve"]));
-            //model_check_init_static
-            guardDependency.insert("env_start_extending", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("open_valve_door_close", HashSet::from(["_tr_open_valve_door_close", "_tr_env_close_door_skip", "_tr_env_start_close_door", "_tr_env_close_door", "_tr_close_valve_door_close"]));
-            //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_open_door_valve", HashSet::from(["_tr_open_valve_door_open", "_tr_con_stimulate_extend_gear_valve", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_open"]));
-            //model_check_init_static
-            guardDependency.insert("con_stop_stimulate_extend_gear_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"]));
-            //model_check_init_static
-            guardDependency.insert("evn_close_general_valve", HashSet::from(["_tr_env_retract_gear_last", "_tr_env_close_door_skip", "_tr_evn_open_general_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_evn_close_general_valve", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("close_valve_extend_gear", HashSet::from(["_tr_close_valve_extend_gear", "_tr_open_valve_extend_gear", "_tr_env_start_extending"]));
-            //model_check_init_static
-            guardDependency.insert("con_stimulate_extend_gear_valve", HashSet::from(["_tr_con_stimulate_extend_gear_valve", "_tr_close_valve_extend_gear", "_tr_con_stop_stimulate_open_door_valve", "_tr_open_valve_extend_gear", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_extend_gear_valve"]));
-            //model_check_init_static
-            guardDependency.insert("close_valve_door_open", HashSet::from(["_tr_open_valve_door_open", "_tr_env_open_door_last", "_tr_env_start_open_door", "_tr_env_open_door_skip", "_tr_close_valve_door_open"]));
-            //model_check_init_static
-            guardDependency.insert("con_stimulate_close_door_valve", HashSet::from(["_tr_open_valve_door_close", "_tr_con_stimulate_close_door_valve", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_close_valve_door_close"]));
-            //model_check_init_static
-            guardDependency.insert("env_extend_gear_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_con_stop_stimulate_extend_gear_valve", "_tr_env_start_retracting_first", "_tr_con_stop_stimulate_retract_gear_valve", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("env_open_door_skip", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            //model_check_init_static
-            guardDependency.insert("env_start_open_door", HashSet::from(["_tr_env_retract_gear_last", "_tr_con_stimulate_extend_gear_valve", "_tr_env_close_door_skip", "_tr_con_stop_stimulate_open_door_valve", "_tr_con_stimulate_retract_gear_valve", "_tr_con_stimulate_close_door_valve", "_tr_env_retract_gear_skip", "_tr_env_start_open_door", "_tr_env_close_door", "_tr_env_start_retracting_first", "_tr_env_extend_gear_skip", "_tr_env_open_door_last", "_tr_env_start_close_door", "_tr_con_stop_stimulate_general_valve", "_tr_con_stop_stimulate_close_door_valve", "_tr_con_stimulate_open_door_valve", "_tr_env_start_extending", "_tr_env_extend_gear_last", "_tr_env_open_door_skip"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
-            let dependent_guard_m2 = Arc::clone(&dependent_guard_m);
-            let parents_m2 = Arc::clone(&parents_m);
-            let guard_cache = Arc::clone(&guard_cache_b);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
+
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
                 //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
-
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                next_states.into_iter()
+                           .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                           .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                            Ok(_) => finished_tasks += 1,
+                            Err(msg) => { println!("{}", msg); stop_threads = true; },
+                        },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/benchmarks/model_checking/Rust/Lift_MC_Large.rs b/benchmarks/model_checking/Rust/Lift_MC_Large.rs
index 7dd7d1805e110045aa7449333c85a835255128c0..3e458e750db453b1496c8f2180f4adad6cb05ba4 100644
--- a/benchmarks/model_checking/Rust/Lift_MC_Large.rs
+++ b/benchmarks/model_checking/Rust/Lift_MC_Large.rs
@@ -1,16 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::binteger::BInteger;
 use btypes::bboolean::BBoolean;
 use btypes::btuple::BTuple;
@@ -29,6 +30,15 @@ pub struct Lift_MC_Large {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_dec: Option<bool>,}
 
+impl fmt::Display for Lift_MC_Large {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "Lift_MC_Large: (".to_owned();
+        result += &format!("_get_level: {}, ", self._get_level());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl Lift_MC_Large {
 
     pub fn new() -> Lift_MC_Large {
@@ -41,7 +51,7 @@ impl Lift_MC_Large {
         self.level = BInteger::new(0);
     }
 
-    pub fn get_level(&self) -> BInteger {
+    pub fn _get_level(&self) -> BInteger {
         return self.level.clone();
     }
 
@@ -89,11 +99,10 @@ impl Lift_MC_Large {
         return self.level.lessEqual(&BInteger::new(1000000)).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_inc" => {self._tr_inc(false);},
                 "_tr_dec" => {self._tr_dec(false);},
                 _ => {},
@@ -104,111 +113,50 @@ impl Lift_MC_Large {
     //model_check_next_states
     fn generateNextStates(state: &mut Lift_MC_Large,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<Lift_MC_Large, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_guard_m: Arc<Mutex<HashMap<Lift_MC_Large, HashSet<&str>>>>,
-                          guardCache: Arc<Mutex<HashMap<Lift_MC_Large, PersistentHashMap<&str, bool>>>>,
-                          parents_m: Arc<Mutex<HashMap<Lift_MC_Large, Lift_MC_Large>>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<Lift_MC_Large> {
-        let mut result = HashSet::<Lift_MC_Large>::new();
-        if isCaching {
-            let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned());
-            let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() };
-            //model_check_transition
-            let mut _trid_1 = state._tr_inc(isCaching);
-            if _trid_1 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.inc();
-                match guard_dependency.get("inc") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("inc").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("inc").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_dec(isCaching);
-            if _trid_2 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.dec();
-                match guard_dependency.get("dec") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("dec").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("dec").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
+                          transitions: Arc<AtomicU64>) -> HashSet<(Lift_MC_Large, &'static str)> {
+        let mut result = HashSet::<(Lift_MC_Large, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        if state._tr_inc(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.inc();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("inc")); }
+            result.insert((copiedState, "inc"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_dec(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.dec();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("dec")); }
+            result.insert((copiedState, "dec"));
+            evaluated_transitions += 1;
+        }
 
-            guardCache.lock().unwrap().insert(state.clone(), newCache);
-        } else {
-            //model_check_transition
-            if state._tr_inc(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.inc();
-                match guard_dependency.get("inc") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_dec(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.dec();
-                match guard_dependency.get("dec") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
 
-        }
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &Lift_MC_Large,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<Lift_MC_Large, HashSet<&str>>>> ) -> bool {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &Lift_MC_Large, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_2") {
+            if dependent_invariants_of_state.contains(&"_check_inv_2") {
                 if !state._check_inv_2() {
+                    println!("_check_inv_2 failed!");
                     return false;
                 }
             }
@@ -218,16 +166,14 @@ impl Lift_MC_Large {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<Lift_MC_Large>>>, mc_type: MC_TYPE) -> Lift_MC_Large {
+    fn next(collection_m: Arc<Mutex<LinkedList<(Lift_MC_Large, &'static str)>>>, mc_type: MC_TYPE) -> (Lift_MC_Large, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -236,76 +182,64 @@ impl Lift_MC_Large {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = Lift_MC_Large::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
-
-        if !machine._check_inv_1() || !machine._check_inv_2() {
-            invariant_violated.store(true, Ordering::Release);
-        }
-
-        let mut states = HashSet::<Lift_MC_Large>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<Lift_MC_Large>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, HashSet<&str>>::new()));
-        let mut guard_cache = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, Lift_MC_Large>::new()));
-
-        if is_caching {
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            invariantDependency.insert("dec", HashSet::from(["_check_inv_2", "_check_inv_1"]));
+            "dec" => vec!["_tr_dec", "_tr_inc"],
             //model_check_init_static
-            invariantDependency.insert("inc", HashSet::from(["_check_inv_2", "_check_inv_1"]));
+            "inc" => vec!["_tr_dec", "_tr_inc"],
+            _ => vec![],
+        }
+    }
+
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            guardDependency.insert("dec", HashSet::from(["_tr_dec", "_tr_inc"]));
+            "dec" => vec!["_check_inv_2", "_check_inv_1"],
             //model_check_init_static
-            guardDependency.insert("inc", HashSet::from(["_tr_dec", "_tr_inc"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
+            "inc" => vec!["_check_inv_2", "_check_inv_1"],
+            _ => vec![],
         }
+    }
 
-        let transitions = Arc::new(AtomicI64::new(0));
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = Lift_MC_Large::new();
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        let mut all_states = HashSet::<Lift_MC_Large>::new();
+        all_states.insert(machine.clone());
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Lift_MC_Large, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+        let num_transitions = Arc::new(AtomicU64::new(0));
+
+        let mut stop_threads = false;
 
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
+
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                       .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                       .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -313,111 +247,66 @@ impl Lift_MC_Large {
 
         let machine = Lift_MC_Large::new();
 
+        let all_states = Arc::new(DashSet::<Lift_MC_Large>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
-
-        if !machine._check_inv_1() || !machine._check_inv_2() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
-
-        let states_m = Arc::new(Mutex::new(HashSet::<Lift_MC_Large>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<Lift_MC_Large>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, HashSet<&str>>::new()));
-        let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<Lift_MC_Large, Lift_MC_Large>::new()));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Lift_MC_Large, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("dec", HashSet::from(["_check_inv_2", "_check_inv_1"]));
-            //model_check_init_static
-            invariantDependency.insert("inc", HashSet::from(["_check_inv_2", "_check_inv_1"]));
-            //model_check_init_static
-            guardDependency.insert("dec", HashSet::from(["_tr_dec", "_tr_inc"]));
-            //model_check_init_static
-            guardDependency.insert("inc", HashSet::from(["_tr_dec", "_tr_inc"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
-            let dependent_guard_m2 = Arc::clone(&dependent_guard_m);
-            let parents_m2 = Arc::clone(&parents_m);
-            let guard_cache = Arc::clone(&guard_cache_b);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
+
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
                 //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
-
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                next_states.into_iter()
+                           .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                           .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                            Ok(_) => finished_tasks += 1,
+                            Err(msg) => { println!("{}", msg); stop_threads = true; },
+                        },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/benchmarks/model_checking/Rust/Makefile b/benchmarks/model_checking/Rust/Makefile
index 16351e5c1940f9efdc694e66f4b5ca268bca06d6..439baef89facffe899bcdc95112140d51d761192 100644
--- a/benchmarks/model_checking/Rust/Makefile
+++ b/benchmarks/model_checking/Rust/Makefile
@@ -11,16 +11,16 @@ CARGO_BUILD=cargo build --release --manifest-path $(CARGO_PROJ_PATH)/Cargo.toml
 #CARGO_BUILD=minicargo build --offline --release --manifest-path $(CARGO_PROJ_PATH)/Cargo.toml
 STRATEGY=mixed
 THREADS=1
-CACHING=false
+CACHING=true
 
 % : clean %.rs
 	cp $(*).rs $(CARGO_PROJ_PATH)/src/main.rs
 	$(CARGO_BUILD)
-	/usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
-	/usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
-	/usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
-	/usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
-	/usr/bin/time -f "$(*) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
+	/usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
+	/usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
+	/usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
+	/usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
+	/usr/bin/time -f "$(*) $(STRATEGY) $(THREADS) $(CACHING) %E %M" -ao $(OUTPUT) $(CARGO_PROJ_PATH)/target/release/bmachine $(STRATEGY) $(THREADS) $(CACHING)
 
 clean:
 	rm -f $(CARGO_PROJ_PATH)/src/*.rs
\ No newline at end of file
diff --git a/benchmarks/model_checking/Rust/QueensWithEvents_4.rs b/benchmarks/model_checking/Rust/QueensWithEvents_4.rs
index 3a5756de83569b28e455355e481c0d28aa58b4e9..7af2de3e37a983b86532ea80f68806712bb7c82c 100644
--- a/benchmarks/model_checking/Rust/QueensWithEvents_4.rs
+++ b/benchmarks/model_checking/Rust/QueensWithEvents_4.rs
@@ -1,16 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::binteger::BInteger;
 use btypes::bboolean::BBoolean;
 use btypes::brelation::BRelation;
@@ -32,6 +33,15 @@ pub struct QueensWithEvents_4 {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_Solve: Option<BSet<BRelation<BInteger, BInteger>>>,}
 
+impl fmt::Display for QueensWithEvents_4 {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "QueensWithEvents_4: (".to_owned();
+        result += &format!("_get_queens: {}, ", self._get_queens());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl QueensWithEvents_4 {
 
     pub fn new() -> QueensWithEvents_4 {
@@ -47,26 +57,26 @@ impl QueensWithEvents_4 {
         self.queens = BRelation::new(vec![]).clone().clone();
     }
 
-    pub fn get_n(&self) -> BInteger {
+    pub fn _get_n(&self) -> BInteger {
         return self.n.clone();
     }
 
-    pub fn get_interval(&self) -> BSet<BInteger> {
+    pub fn _get_interval(&self) -> BSet<BInteger> {
         return self.interval.clone();
     }
 
-    pub fn get_allFields(&self) -> BSet<BRelation<BInteger, BInteger>> {
+    pub fn _get_allFields(&self) -> BSet<BRelation<BInteger, BInteger>> {
         return self.allFields.clone();
     }
 
-    pub fn get_queens(&self) -> BRelation<BInteger, BInteger> {
+    pub fn _get_queens(&self) -> BRelation<BInteger, BInteger> {
         return self.queens.clone();
     }
 
     pub fn Solve(&mut self, mut solution: BRelation<BInteger, BInteger>) -> () {
         //quantified_predicate
         let mut _ic_boolean_1 = BBoolean::new(true);
-        if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).booleanValue() {
+        if (solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)).booleanValue() {
             for _ic_x_1 in self.interval.clone().iter().cloned() {
                 for _ic_y_1 in self.interval.clone().iter().cloned() {
                     //quantified_predicate
@@ -90,10 +100,10 @@ impl QueensWithEvents_4 {
 
         //quantified_predicate
         let mut _ic_boolean_2 = BBoolean::new(true);
-        if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).booleanValue() {
+        if ((solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)) && _ic_boolean_1).booleanValue() {
             for _ic_q1_1 in self.interval.clone().iter().cloned() {
                 for _ic_q2_1 in self.interval.difference(&BSet::new(vec![BInteger::new(1)])).clone().iter().cloned() {
-                    if !(_ic_q2_1.greater(&_ic_q1_1).implies(&solution.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1)).and(&solution.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1))))).booleanValue() {
+                    if !(_ic_q2_1.greater(&_ic_q1_1).implies(&(solution.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1)) && solution.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1))))).booleanValue() {
                         _ic_boolean_2 = BBoolean::new(false);
                         break;
                     }
@@ -104,7 +114,7 @@ impl QueensWithEvents_4 {
 
         //quantified_predicate
         let mut _ic_boolean_3 = BBoolean::new(true);
-        if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).and(&_ic_boolean_2).booleanValue() {
+        if (((solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)) && _ic_boolean_1) && _ic_boolean_2).booleanValue() {
             for _ic_x_1 in self.queens.domain().clone().iter().cloned() {
                 if !(solution.functionCall(&_ic_x_1).equal(&self.queens.functionCall(&_ic_x_1))).booleanValue() {
                     _ic_boolean_3 = BBoolean::new(false);
@@ -114,7 +124,7 @@ impl QueensWithEvents_4 {
             }
         }
 
-        if (self.allFields.elementOf(&solution).and(&solution.domain().equal(&self.interval)).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).and(&_ic_boolean_2).and(&_ic_boolean_3)).booleanValue() {
+        if ((((((self.allFields.elementOf(&solution) && solution.domain().equal(&self.interval)) && solution.range().equal(&self.interval)) && _ic_boolean_1) && _ic_boolean_2) && _ic_boolean_3)).booleanValue() {
             self.queens = solution.clone().clone();
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -129,7 +139,7 @@ impl QueensWithEvents_4 {
             for _ic_solution_1 in self.allFields.clone().iter().cloned() {
                 //quantified_predicate
                 let mut _ic_boolean_5 = BBoolean::new(true);
-                if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).booleanValue() {
+                if (_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)).booleanValue() {
                     for _ic_x_1 in self.interval.clone().iter().cloned() {
                         for _ic_y_1 in self.interval.clone().iter().cloned() {
                             //quantified_predicate
@@ -152,10 +162,10 @@ impl QueensWithEvents_4 {
                 }
                 //quantified_predicate
                 let mut _ic_boolean_6 = BBoolean::new(true);
-                if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).booleanValue() {
+                if ((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5).booleanValue() {
                     for _ic_q1_1 in self.interval.clone().iter().cloned() {
                         for _ic_q2_1 in self.interval.difference(&BSet::new(vec![BInteger::new(1)])).clone().iter().cloned() {
-                            if !(_ic_q2_1.greater(&_ic_q1_1).implies(&_ic_solution_1.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1)).and(&_ic_solution_1.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1))))).booleanValue() {
+                            if !(_ic_q2_1.greater(&_ic_q1_1).implies(&(_ic_solution_1.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1)) && _ic_solution_1.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1))))).booleanValue() {
                                 _ic_boolean_6 = BBoolean::new(false);
                                 break;
                             }
@@ -165,7 +175,7 @@ impl QueensWithEvents_4 {
                 }
                 //quantified_predicate
                 let mut _ic_boolean_7 = BBoolean::new(true);
-                if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).and(&_ic_boolean_6).booleanValue() {
+                if (((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5) && _ic_boolean_6).booleanValue() {
                     for _ic_x_1 in self.queens.domain().clone().iter().cloned() {
                         if !(_ic_solution_1.functionCall(&_ic_x_1).equal(&self.queens.functionCall(&_ic_x_1))).booleanValue() {
                             _ic_boolean_7 = BBoolean::new(false);
@@ -175,7 +185,7 @@ impl QueensWithEvents_4 {
                     }
                 }
 
-                if (_ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).and(&_ic_boolean_6).and(&_ic_boolean_7)).booleanValue() {
+                if (((((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5) && _ic_boolean_6) && _ic_boolean_7)).booleanValue() {
                     _ic_set_4 = _ic_set_4._union(&BSet::new(vec![_ic_solution_1]));
                 }
 
@@ -192,11 +202,10 @@ impl QueensWithEvents_4 {
         return self.queens.checkDomain(&self.interval).and(&self.queens.checkRange(&self.interval)).and(&self.queens.isFunction()).and(&self.queens.isPartial(&self.interval)).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_Solve" => {self._tr_Solve(false);},
                 _ => {},
             }
@@ -206,78 +215,38 @@ impl QueensWithEvents_4 {
     //model_check_next_states
     fn generateNextStates(state: &mut QueensWithEvents_4,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<QueensWithEvents_4, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_guard_m: Arc<Mutex<HashMap<QueensWithEvents_4, HashSet<&str>>>>,
-                          guardCache: Arc<Mutex<HashMap<QueensWithEvents_4, PersistentHashMap<&str, bool>>>>,
-                          parents_m: Arc<Mutex<HashMap<QueensWithEvents_4, QueensWithEvents_4>>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<QueensWithEvents_4> {
-        let mut result = HashSet::<QueensWithEvents_4>::new();
-        if isCaching {
-            let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned());
-            let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() };
-            //model_check_transition
-            let mut _trid_1 = state._tr_Solve(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.Solve(_tmp_1);
-                match guard_dependency.get("Solve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("Solve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("Solve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
+                          transitions: Arc<AtomicU64>) -> HashSet<(QueensWithEvents_4, &'static str)> {
+        let mut result = HashSet::<(QueensWithEvents_4, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        let mut _trid_1 = state._tr_Solve(isCaching);
+        for param in _trid_1.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.Solve(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("Solve")); }
+            result.insert((copiedState, "Solve"));
+            evaluated_transitions += 1;
+        }
 
-            guardCache.lock().unwrap().insert(state.clone(), newCache);
-        } else {
-            //model_check_transition
-            let mut _trid_1 = state._tr_Solve(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.Solve(_tmp_1);
-                match guard_dependency.get("Solve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
 
-        }
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &QueensWithEvents_4,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<QueensWithEvents_4, HashSet<&str>>>> ) -> bool {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &QueensWithEvents_4, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
@@ -287,16 +256,14 @@ impl QueensWithEvents_4 {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<QueensWithEvents_4>>>, mc_type: MC_TYPE) -> QueensWithEvents_4 {
+    fn next(collection_m: Arc<Mutex<LinkedList<(QueensWithEvents_4, &'static str)>>>, mc_type: MC_TYPE) -> (QueensWithEvents_4, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -305,72 +272,60 @@ impl QueensWithEvents_4 {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = QueensWithEvents_4::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
+            //model_check_init_static
+            "Solve" => vec!["_tr_Solve"],
+            _ => vec![],
+        }
+    }
 
-        if !machine._check_inv_1() {
-            invariant_violated.store(true, Ordering::Release);
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
+            //model_check_init_static
+            "Solve" => vec!["_check_inv_1"],
+            _ => vec![],
         }
+    }
 
-        let mut states = HashSet::<QueensWithEvents_4>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = QueensWithEvents_4::new();
 
-        let collection_m = Arc::new(Mutex::new(LinkedList::<QueensWithEvents_4>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
+        let mut all_states = HashSet::<QueensWithEvents_4>::new();
+        all_states.insert(machine.clone());
 
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, HashSet<&str>>::new()));
-        let mut guard_cache = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, QueensWithEvents_4>::new()));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(QueensWithEvents_4, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("Solve", HashSet::from(["_check_inv_1"]));
-            //model_check_init_static
-            guardDependency.insert("Solve", HashSet::from(["_tr_Solve"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let transitions = Arc::new(AtomicI64::new(0));
+        let mut stop_threads = false;
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions));
-
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
 
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                       .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                       .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -378,107 +333,66 @@ impl QueensWithEvents_4 {
 
         let machine = QueensWithEvents_4::new();
 
+        let all_states = Arc::new(DashSet::<QueensWithEvents_4>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
-
-        if !machine._check_inv_1() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
-
-        let states_m = Arc::new(Mutex::new(HashSet::<QueensWithEvents_4>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<QueensWithEvents_4>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, HashSet<&str>>::new()));
-        let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_4, QueensWithEvents_4>::new()));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(QueensWithEvents_4, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("Solve", HashSet::from(["_check_inv_1"]));
-            //model_check_init_static
-            guardDependency.insert("Solve", HashSet::from(["_tr_Solve"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
-            let dependent_guard_m2 = Arc::clone(&dependent_guard_m);
-            let parents_m2 = Arc::clone(&parents_m);
-            let guard_cache = Arc::clone(&guard_cache_b);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
 
-                //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                //println!("Thread {:?} executing", thread::current().id());
+                next_states.into_iter()
+                           .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                           .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                            Ok(_) => finished_tasks += 1,
+                            Err(msg) => { println!("{}", msg); stop_threads = true; },
+                        },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/benchmarks/model_checking/Rust/QueensWithEvents_8.rs b/benchmarks/model_checking/Rust/QueensWithEvents_8.rs
index a4855dd4df42e66d8adafe9f36f5ab32941858ce..ab2c086ae41125f80940cc9193ab0975768088c0 100644
--- a/benchmarks/model_checking/Rust/QueensWithEvents_8.rs
+++ b/benchmarks/model_checking/Rust/QueensWithEvents_8.rs
@@ -1,16 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::binteger::BInteger;
 use btypes::bboolean::BBoolean;
 use btypes::brelation::BRelation;
@@ -32,6 +33,15 @@ pub struct QueensWithEvents_8 {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_Solve: Option<BSet<BRelation<BInteger, BInteger>>>,}
 
+impl fmt::Display for QueensWithEvents_8 {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "QueensWithEvents_8: (".to_owned();
+        result += &format!("_get_queens: {}, ", self._get_queens());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl QueensWithEvents_8 {
 
     pub fn new() -> QueensWithEvents_8 {
@@ -41,32 +51,32 @@ impl QueensWithEvents_8 {
         return m;
     }
     fn init(&mut self) {
-        self.n = BInteger::new(4);
+        self.n = BInteger::new(8);
         self.interval = BSet::<BInteger>::interval(&BInteger::new(1), &self.n);
         self.allFields = BRelation::cartesianProduct(&self.interval, &self.interval).pow();
         self.queens = BRelation::new(vec![]).clone().clone();
     }
 
-    pub fn get_n(&self) -> BInteger {
+    pub fn _get_n(&self) -> BInteger {
         return self.n.clone();
     }
 
-    pub fn get_interval(&self) -> BSet<BInteger> {
+    pub fn _get_interval(&self) -> BSet<BInteger> {
         return self.interval.clone();
     }
 
-    pub fn get_allFields(&self) -> BSet<BRelation<BInteger, BInteger>> {
+    pub fn _get_allFields(&self) -> BSet<BRelation<BInteger, BInteger>> {
         return self.allFields.clone();
     }
 
-    pub fn get_queens(&self) -> BRelation<BInteger, BInteger> {
+    pub fn _get_queens(&self) -> BRelation<BInteger, BInteger> {
         return self.queens.clone();
     }
 
     pub fn Solve(&mut self, mut solution: BRelation<BInteger, BInteger>) -> () {
         //quantified_predicate
         let mut _ic_boolean_1 = BBoolean::new(true);
-        if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).booleanValue() {
+        if (solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)).booleanValue() {
             for _ic_x_1 in self.interval.clone().iter().cloned() {
                 for _ic_y_1 in self.interval.clone().iter().cloned() {
                     //quantified_predicate
@@ -90,10 +100,10 @@ impl QueensWithEvents_8 {
 
         //quantified_predicate
         let mut _ic_boolean_2 = BBoolean::new(true);
-        if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).booleanValue() {
+        if ((solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)) && _ic_boolean_1).booleanValue() {
             for _ic_q1_1 in self.interval.clone().iter().cloned() {
                 for _ic_q2_1 in self.interval.difference(&BSet::new(vec![BInteger::new(1)])).clone().iter().cloned() {
-                    if !(_ic_q2_1.greater(&_ic_q1_1).implies(&solution.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1)).and(&solution.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1))))).booleanValue() {
+                    if !(_ic_q2_1.greater(&_ic_q1_1).implies(&(solution.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1)) && solution.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&solution.functionCall(&_ic_q2_1))))).booleanValue() {
                         _ic_boolean_2 = BBoolean::new(false);
                         break;
                     }
@@ -104,7 +114,7 @@ impl QueensWithEvents_8 {
 
         //quantified_predicate
         let mut _ic_boolean_3 = BBoolean::new(true);
-        if solution.domain().equal(&self.interval).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).and(&_ic_boolean_2).booleanValue() {
+        if (((solution.domain().equal(&self.interval) && solution.range().equal(&self.interval)) && _ic_boolean_1) && _ic_boolean_2).booleanValue() {
             for _ic_x_1 in self.queens.domain().clone().iter().cloned() {
                 if !(solution.functionCall(&_ic_x_1).equal(&self.queens.functionCall(&_ic_x_1))).booleanValue() {
                     _ic_boolean_3 = BBoolean::new(false);
@@ -114,7 +124,7 @@ impl QueensWithEvents_8 {
             }
         }
 
-        if (self.allFields.elementOf(&solution).and(&solution.domain().equal(&self.interval)).and(&solution.range().equal(&self.interval)).and(&_ic_boolean_1).and(&_ic_boolean_2).and(&_ic_boolean_3)).booleanValue() {
+        if ((((((self.allFields.elementOf(&solution) && solution.domain().equal(&self.interval)) && solution.range().equal(&self.interval)) && _ic_boolean_1) && _ic_boolean_2) && _ic_boolean_3)).booleanValue() {
             self.queens = solution.clone().clone();
         } else {
             panic!("ERROR: called SELECT-function with incompatible parameters!");
@@ -129,7 +139,7 @@ impl QueensWithEvents_8 {
             for _ic_solution_1 in self.allFields.clone().iter().cloned() {
                 //quantified_predicate
                 let mut _ic_boolean_5 = BBoolean::new(true);
-                if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).booleanValue() {
+                if (_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)).booleanValue() {
                     for _ic_x_1 in self.interval.clone().iter().cloned() {
                         for _ic_y_1 in self.interval.clone().iter().cloned() {
                             //quantified_predicate
@@ -152,10 +162,10 @@ impl QueensWithEvents_8 {
                 }
                 //quantified_predicate
                 let mut _ic_boolean_6 = BBoolean::new(true);
-                if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).booleanValue() {
+                if ((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5).booleanValue() {
                     for _ic_q1_1 in self.interval.clone().iter().cloned() {
                         for _ic_q2_1 in self.interval.difference(&BSet::new(vec![BInteger::new(1)])).clone().iter().cloned() {
-                            if !(_ic_q2_1.greater(&_ic_q1_1).implies(&_ic_solution_1.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1)).and(&_ic_solution_1.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1))))).booleanValue() {
+                            if !(_ic_q2_1.greater(&_ic_q1_1).implies(&(_ic_solution_1.functionCall(&_ic_q1_1).plus(&_ic_q2_1).minus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1)) && _ic_solution_1.functionCall(&_ic_q1_1).minus(&_ic_q2_1).plus(&_ic_q1_1).unequal(&_ic_solution_1.functionCall(&_ic_q2_1))))).booleanValue() {
                                 _ic_boolean_6 = BBoolean::new(false);
                                 break;
                             }
@@ -165,7 +175,7 @@ impl QueensWithEvents_8 {
                 }
                 //quantified_predicate
                 let mut _ic_boolean_7 = BBoolean::new(true);
-                if _ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).and(&_ic_boolean_6).booleanValue() {
+                if (((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5) && _ic_boolean_6).booleanValue() {
                     for _ic_x_1 in self.queens.domain().clone().iter().cloned() {
                         if !(_ic_solution_1.functionCall(&_ic_x_1).equal(&self.queens.functionCall(&_ic_x_1))).booleanValue() {
                             _ic_boolean_7 = BBoolean::new(false);
@@ -175,7 +185,7 @@ impl QueensWithEvents_8 {
                     }
                 }
 
-                if (_ic_solution_1.domain().equal(&self.interval).and(&_ic_solution_1.range().equal(&self.interval)).and(&_ic_boolean_5).and(&_ic_boolean_6).and(&_ic_boolean_7)).booleanValue() {
+                if (((((_ic_solution_1.domain().equal(&self.interval) && _ic_solution_1.range().equal(&self.interval)) && _ic_boolean_5) && _ic_boolean_6) && _ic_boolean_7)).booleanValue() {
                     _ic_set_4 = _ic_set_4._union(&BSet::new(vec![_ic_solution_1]));
                 }
 
@@ -192,11 +202,10 @@ impl QueensWithEvents_8 {
         return self.queens.checkDomain(&self.interval).and(&self.queens.checkRange(&self.interval)).and(&self.queens.isFunction()).and(&self.queens.isPartial(&self.interval)).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_Solve" => {self._tr_Solve(false);},
                 _ => {},
             }
@@ -206,78 +215,38 @@ impl QueensWithEvents_8 {
     //model_check_next_states
     fn generateNextStates(state: &mut QueensWithEvents_8,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<QueensWithEvents_8, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_guard_m: Arc<Mutex<HashMap<QueensWithEvents_8, HashSet<&str>>>>,
-                          guardCache: Arc<Mutex<HashMap<QueensWithEvents_8, PersistentHashMap<&str, bool>>>>,
-                          parents_m: Arc<Mutex<HashMap<QueensWithEvents_8, QueensWithEvents_8>>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<QueensWithEvents_8> {
-        let mut result = HashSet::<QueensWithEvents_8>::new();
-        if isCaching {
-            let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned());
-            let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() };
-            //model_check_transition
-            let mut _trid_1 = state._tr_Solve(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.Solve(_tmp_1);
-                match guard_dependency.get("Solve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("Solve").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("Solve").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
+                          transitions: Arc<AtomicU64>) -> HashSet<(QueensWithEvents_8, &'static str)> {
+        let mut result = HashSet::<(QueensWithEvents_8, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        let mut _trid_1 = state._tr_Solve(isCaching);
+        for param in _trid_1.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.Solve(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("Solve")); }
+            result.insert((copiedState, "Solve"));
+            evaluated_transitions += 1;
+        }
 
-            guardCache.lock().unwrap().insert(state.clone(), newCache);
-        } else {
-            //model_check_transition
-            let mut _trid_1 = state._tr_Solve(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.Solve(_tmp_1);
-                match guard_dependency.get("Solve") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
 
-        }
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &QueensWithEvents_8,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<QueensWithEvents_8, HashSet<&str>>>> ) -> bool {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &QueensWithEvents_8, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
@@ -287,16 +256,14 @@ impl QueensWithEvents_8 {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<QueensWithEvents_8>>>, mc_type: MC_TYPE) -> QueensWithEvents_8 {
+    fn next(collection_m: Arc<Mutex<LinkedList<(QueensWithEvents_8, &'static str)>>>, mc_type: MC_TYPE) -> (QueensWithEvents_8, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -305,72 +272,60 @@ impl QueensWithEvents_8 {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = QueensWithEvents_8::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
+            //model_check_init_static
+            "Solve" => vec!["_tr_Solve"],
+            _ => vec![],
+        }
+    }
 
-        if !machine._check_inv_1() {
-            invariant_violated.store(true, Ordering::Release);
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
+            //model_check_init_static
+            "Solve" => vec!["_check_inv_1"],
+            _ => vec![],
         }
+    }
 
-        let mut states = HashSet::<QueensWithEvents_8>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = QueensWithEvents_8::new();
 
-        let collection_m = Arc::new(Mutex::new(LinkedList::<QueensWithEvents_8>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
+        let mut all_states = HashSet::<QueensWithEvents_8>::new();
+        all_states.insert(machine.clone());
 
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, HashSet<&str>>::new()));
-        let mut guard_cache = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, QueensWithEvents_8>::new()));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(QueensWithEvents_8, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("Solve", HashSet::from(["_check_inv_1"]));
-            //model_check_init_static
-            guardDependency.insert("Solve", HashSet::from(["_tr_Solve"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let transitions = Arc::new(AtomicI64::new(0));
+        let mut stop_threads = false;
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions));
-
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
 
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -378,107 +333,66 @@ impl QueensWithEvents_8 {
 
         let machine = QueensWithEvents_8::new();
 
+        let all_states = Arc::new(DashSet::<QueensWithEvents_8>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
-
-        if !machine._check_inv_1() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
-
-        let states_m = Arc::new(Mutex::new(HashSet::<QueensWithEvents_8>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<QueensWithEvents_8>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, HashSet<&str>>::new()));
-        let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<QueensWithEvents_8, QueensWithEvents_8>::new()));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(QueensWithEvents_8, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("Solve", HashSet::from(["_check_inv_1"]));
-            //model_check_init_static
-            guardDependency.insert("Solve", HashSet::from(["_tr_Solve"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
-            let dependent_guard_m2 = Arc::clone(&dependent_guard_m);
-            let parents_m2 = Arc::clone(&parents_m);
-            let guard_cache = Arc::clone(&guard_cache_b);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
 
-                //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                //println!("Thread {:?} executing", thread::current().id());
+                next_states.into_iter()
+                    .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                    .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                        Ok(_) => finished_tasks += 1,
+                        Err(msg) => { println!("{}", msg); stop_threads = true; },
+                    },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/benchmarks/model_checking/Rust/Train1_Lukas_POR_v3.rs b/benchmarks/model_checking/Rust/Train1_Lukas_POR_v3.rs
index f0674fe69405ad9c6a0a67e26bc2d2ea74b64846..52284d90848b429bfabb17488bac0f9601df55da 100644
--- a/benchmarks/model_checking/Rust/Train1_Lukas_POR_v3.rs
+++ b/benchmarks/model_checking/Rust/Train1_Lukas_POR_v3.rs
@@ -1,16 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::bboolean::BBoolean;
 use btypes::brelation::BRelation;
 use btypes::bset::BSet;
@@ -23,14 +24,14 @@ pub enum MC_TYPE { BFS, DFS, MIXED }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum BLOCKS {
-    A,
-    B,
-    C,
-    D,
-    E,
-    F,
-    G,
-    H,
+    A, 
+    B, 
+    C, 
+    D, 
+    E, 
+    F, 
+    G, 
+    H, 
     I
 }
 impl BLOCKS {
@@ -43,29 +44,29 @@ impl Default for BLOCKS {
 }
 impl fmt::Display for BLOCKS {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            BLOCKS::A => write!(f, "A"),
-            BLOCKS::B => write!(f, "B"),
-            BLOCKS::C => write!(f, "C"),
-            BLOCKS::D => write!(f, "D"),
-            BLOCKS::E => write!(f, "E"),
-            BLOCKS::F => write!(f, "F"),
-            BLOCKS::G => write!(f, "G"),
-            BLOCKS::H => write!(f, "H"),
-            BLOCKS::I => write!(f, "I"),
-        }
+       match *self {
+           BLOCKS::A => write!(f, "A"),
+           BLOCKS::B => write!(f, "B"),
+           BLOCKS::C => write!(f, "C"),
+           BLOCKS::D => write!(f, "D"),
+           BLOCKS::E => write!(f, "E"),
+           BLOCKS::F => write!(f, "F"),
+           BLOCKS::G => write!(f, "G"),
+           BLOCKS::H => write!(f, "H"),
+           BLOCKS::I => write!(f, "I"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum ROUTES {
-    R1,
-    R2,
-    R3,
-    R4,
-    R5,
-    R6,
-    R7,
+    R1, 
+    R2, 
+    R3, 
+    R4, 
+    R5, 
+    R6, 
+    R7, 
     R8
 }
 impl ROUTES {
@@ -78,16 +79,16 @@ impl Default for ROUTES {
 }
 impl fmt::Display for ROUTES {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            ROUTES::R1 => write!(f, "R1"),
-            ROUTES::R2 => write!(f, "R2"),
-            ROUTES::R3 => write!(f, "R3"),
-            ROUTES::R4 => write!(f, "R4"),
-            ROUTES::R5 => write!(f, "R5"),
-            ROUTES::R6 => write!(f, "R6"),
-            ROUTES::R7 => write!(f, "R7"),
-            ROUTES::R8 => write!(f, "R8"),
-        }
+       match *self {
+           ROUTES::R1 => write!(f, "R1"),
+           ROUTES::R2 => write!(f, "R2"),
+           ROUTES::R3 => write!(f, "R3"),
+           ROUTES::R4 => write!(f, "R4"),
+           ROUTES::R5 => write!(f, "R5"),
+           ROUTES::R6 => write!(f, "R6"),
+           ROUTES::R7 => write!(f, "R7"),
+           ROUTES::R8 => write!(f, "R8"),
+       }
     }
 }
 
@@ -124,6 +125,21 @@ pub struct Train1_Lukas_POR_v3 {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_route_formation: Option<BSet<ROUTES>>,}
 
+impl fmt::Display for Train1_Lukas_POR_v3 {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "Train1_Lukas_POR_v3: (".to_owned();
+        result += &format!("_get_LBT: {}, ", self._get_LBT());
+        result += &format!("_get_TRK: {}, ", self._get_TRK());
+        result += &format!("_get_frm: {}, ", self._get_frm());
+        result += &format!("_get_OCC: {}, ", self._get_OCC());
+        result += &format!("_get_resbl: {}, ", self._get_resbl());
+        result += &format!("_get_resrt: {}, ", self._get_resrt());
+        result += &format!("_get_rsrtbl: {}, ", self._get_rsrtbl());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl Train1_Lukas_POR_v3 {
 
     pub fn new() -> Train1_Lukas_POR_v3 {
@@ -133,12 +149,12 @@ impl Train1_Lukas_POR_v3 {
         return m;
     }
     fn init(&mut self) {
+        self._BLOCKS = BSet::new(vec![BLOCKS::A, BLOCKS::B, BLOCKS::C, BLOCKS::D, BLOCKS::E, BLOCKS::F, BLOCKS::G, BLOCKS::H, BLOCKS::I]);
+        self._ROUTES = BSet::new(vec![ROUTES::R1, ROUTES::R2, ROUTES::R3, ROUTES::R4, ROUTES::R5, ROUTES::R6, ROUTES::R7, ROUTES::R8]);
         self.nxt = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::C)])), BTuple::from_refs(&ROUTES::R2, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::F)])), BTuple::from_refs(&ROUTES::R3, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::H, &BLOCKS::G), BTuple::from_refs(&BLOCKS::G, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::F)])), BTuple::from_refs(&ROUTES::R4, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::I, &BLOCKS::G), BTuple::from_refs(&BLOCKS::G, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::F)])), BTuple::from_refs(&ROUTES::R5, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::C, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A)])), BTuple::from_refs(&ROUTES::R6, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::F, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A)])), BTuple::from_refs(&ROUTES::R7, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::F, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::G), BTuple::from_refs(&BLOCKS::G, &BLOCKS::H)])), BTuple::from_refs(&ROUTES::R8, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::F, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::G), BTuple::from_refs(&BLOCKS::G, &BLOCKS::I)]))]);
         self.fst = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BLOCKS::A), BTuple::from_refs(&ROUTES::R2, &BLOCKS::A), BTuple::from_refs(&ROUTES::R3, &BLOCKS::H), BTuple::from_refs(&ROUTES::R4, &BLOCKS::I), BTuple::from_refs(&ROUTES::R5, &BLOCKS::C), BTuple::from_refs(&ROUTES::R6, &BLOCKS::F), BTuple::from_refs(&ROUTES::R7, &BLOCKS::F), BTuple::from_refs(&ROUTES::R8, &BLOCKS::F)]);
         self.lst = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BLOCKS::C), BTuple::from_refs(&ROUTES::R2, &BLOCKS::F), BTuple::from_refs(&ROUTES::R3, &BLOCKS::F), BTuple::from_refs(&ROUTES::R4, &BLOCKS::F), BTuple::from_refs(&ROUTES::R5, &BLOCKS::A), BTuple::from_refs(&ROUTES::R6, &BLOCKS::A), BTuple::from_refs(&ROUTES::R7, &BLOCKS::H), BTuple::from_refs(&ROUTES::R8, &BLOCKS::I)]);
         self.rtbl = BRelation::new(vec![BTuple::from_refs(&BLOCKS::A, &ROUTES::R1), BTuple::from_refs(&BLOCKS::A, &ROUTES::R2), BTuple::from_refs(&BLOCKS::A, &ROUTES::R5), BTuple::from_refs(&BLOCKS::A, &ROUTES::R6), BTuple::from_refs(&BLOCKS::B, &ROUTES::R1), BTuple::from_refs(&BLOCKS::B, &ROUTES::R2), BTuple::from_refs(&BLOCKS::B, &ROUTES::R5), BTuple::from_refs(&BLOCKS::B, &ROUTES::R6), BTuple::from_refs(&BLOCKS::C, &ROUTES::R1), BTuple::from_refs(&BLOCKS::C, &ROUTES::R5), BTuple::from_refs(&BLOCKS::D, &ROUTES::R2), BTuple::from_refs(&BLOCKS::D, &ROUTES::R6), BTuple::from_refs(&BLOCKS::E, &ROUTES::R2), BTuple::from_refs(&BLOCKS::E, &ROUTES::R3), BTuple::from_refs(&BLOCKS::E, &ROUTES::R4), BTuple::from_refs(&BLOCKS::E, &ROUTES::R6), BTuple::from_refs(&BLOCKS::E, &ROUTES::R7), BTuple::from_refs(&BLOCKS::E, &ROUTES::R8), BTuple::from_refs(&BLOCKS::F, &ROUTES::R2), BTuple::from_refs(&BLOCKS::F, &ROUTES::R3), BTuple::from_refs(&BLOCKS::F, &ROUTES::R4), BTuple::from_refs(&BLOCKS::F, &ROUTES::R6), BTuple::from_refs(&BLOCKS::F, &ROUTES::R7), BTuple::from_refs(&BLOCKS::F, &ROUTES::R8), BTuple::from_refs(&BLOCKS::G, &ROUTES::R3), BTuple::from_refs(&BLOCKS::G, &ROUTES::R4), BTuple::from_refs(&BLOCKS::G, &ROUTES::R4), BTuple::from_refs(&BLOCKS::G, &ROUTES::R7), BTuple::from_refs(&BLOCKS::G, &ROUTES::R8), BTuple::from_refs(&BLOCKS::H, &ROUTES::R3), BTuple::from_refs(&BLOCKS::H, &ROUTES::R7), BTuple::from_refs(&BLOCKS::I, &ROUTES::R4), BTuple::from_refs(&BLOCKS::I, &ROUTES::R8)]);
-        self._BLOCKS = BSet::new(vec![BLOCKS::A, BLOCKS::B, BLOCKS::C, BLOCKS::D, BLOCKS::E, BLOCKS::F, BLOCKS::G, BLOCKS::H, BLOCKS::I]);
-        self._ROUTES = BSet::new(vec![ROUTES::R1, ROUTES::R2, ROUTES::R3, ROUTES::R4, ROUTES::R5, ROUTES::R6, ROUTES::R7, ROUTES::R8]);
         self.resrt = BSet::new(vec![]).clone().clone();
         self.resbl = BSet::new(vec![]).clone().clone();
         self.rsrtbl = BRelation::new(vec![]).clone().clone();
@@ -148,55 +164,55 @@ impl Train1_Lukas_POR_v3 {
         self.LBT = BSet::new(vec![]).clone().clone();
     }
 
-    pub fn get_fst(&self) -> BRelation<ROUTES, BLOCKS> {
+    pub fn _get_fst(&self) -> BRelation<ROUTES, BLOCKS> {
         return self.fst.clone();
     }
 
-    pub fn get_lst(&self) -> BRelation<ROUTES, BLOCKS> {
+    pub fn _get_lst(&self) -> BRelation<ROUTES, BLOCKS> {
         return self.lst.clone();
     }
 
-    pub fn get_nxt(&self) -> BRelation<ROUTES, BRelation<BLOCKS, BLOCKS>> {
+    pub fn _get_nxt(&self) -> BRelation<ROUTES, BRelation<BLOCKS, BLOCKS>> {
         return self.nxt.clone();
     }
 
-    pub fn get_rtbl(&self) -> BRelation<BLOCKS, ROUTES> {
+    pub fn _get_rtbl(&self) -> BRelation<BLOCKS, ROUTES> {
         return self.rtbl.clone();
     }
 
-    pub fn get_LBT(&self) -> BSet<BLOCKS> {
+    pub fn _get_LBT(&self) -> BSet<BLOCKS> {
         return self.LBT.clone();
     }
 
-    pub fn get_TRK(&self) -> BRelation<BLOCKS, BLOCKS> {
+    pub fn _get_TRK(&self) -> BRelation<BLOCKS, BLOCKS> {
         return self.TRK.clone();
     }
 
-    pub fn get_frm(&self) -> BSet<ROUTES> {
+    pub fn _get_frm(&self) -> BSet<ROUTES> {
         return self.frm.clone();
     }
 
-    pub fn get_OCC(&self) -> BSet<BLOCKS> {
+    pub fn _get_OCC(&self) -> BSet<BLOCKS> {
         return self.OCC.clone();
     }
 
-    pub fn get_resbl(&self) -> BSet<BLOCKS> {
+    pub fn _get_resbl(&self) -> BSet<BLOCKS> {
         return self.resbl.clone();
     }
 
-    pub fn get_resrt(&self) -> BSet<ROUTES> {
+    pub fn _get_resrt(&self) -> BSet<ROUTES> {
         return self.resrt.clone();
     }
 
-    pub fn get_rsrtbl(&self) -> BRelation<BLOCKS, ROUTES> {
+    pub fn _get_rsrtbl(&self) -> BRelation<BLOCKS, ROUTES> {
         return self.rsrtbl.clone();
     }
 
-    pub fn get__BLOCKS(&self) -> BSet<BLOCKS> {
+    pub fn _get__BLOCKS(&self) -> BSet<BLOCKS> {
         return self._BLOCKS.clone();
     }
 
-    pub fn get__ROUTES(&self) -> BSet<ROUTES> {
+    pub fn _get__ROUTES(&self) -> BSet<ROUTES> {
         return self._ROUTES.clone();
     }
 
@@ -277,8 +293,9 @@ impl Train1_Lukas_POR_v3 {
         //transition
         if !is_caching || self._tr_cache_route_reservation.is_none() {
             let mut _ic_set_0: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self._ROUTES.difference(&self.resrt).clone().iter().cloned() {
-                if (self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).intersect(&self.resbl).equal(&BSet::new(vec![])).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
+                if ((self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).intersect(&self.resbl).equal(&BSet::new(vec![])) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
                     _ic_set_0 = _ic_set_0._union(&BSet::new(vec![_ic_r_1]));
                 }
 
@@ -294,6 +311,7 @@ impl Train1_Lukas_POR_v3 {
         //transition
         if !is_caching || self._tr_cache_route_freeing.is_none() {
             let mut _ic_set_1: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self.resrt.difference(&self.rsrtbl.range()).clone().iter().cloned() {
                 _ic_set_1 = _ic_set_1._union(&BSet::new(vec![_ic_r_1]));
 
@@ -309,8 +327,9 @@ impl Train1_Lukas_POR_v3 {
         //transition
         if !is_caching || self._tr_cache_FRONT_MOVE_1.is_none() {
             let mut _ic_set_2: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self.frm.clone().iter().cloned() {
-                if (self.resbl.difference(&self.OCC).elementOf(&self.fst.functionCall(&_ic_r_1)).and(&_ic_r_1.equal(&self.rsrtbl.functionCall(&self.fst.functionCall(&_ic_r_1)))).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
+                if (((self.resbl.difference(&self.OCC).elementOf(&self.fst.functionCall(&_ic_r_1)) && _ic_r_1.equal(&self.rsrtbl.functionCall(&self.fst.functionCall(&_ic_r_1)))) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
                     _ic_set_2 = _ic_set_2._union(&BSet::new(vec![_ic_r_1]));
                 }
 
@@ -326,8 +345,9 @@ impl Train1_Lukas_POR_v3 {
         //transition
         if !is_caching || self._tr_cache_FRONT_MOVE_2.is_none() {
             let mut _ic_set_3: BSet<BLOCKS> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_b_1 in self.OCC.intersect(&self.TRK.domain()).clone().iter().cloned() {
-                if (self.OCC.notElementOf(&self.TRK.functionCall(&_ic_b_1)).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
+                if ((self.OCC.notElementOf(&self.TRK.functionCall(&_ic_b_1)) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
                     _ic_set_3 = _ic_set_3._union(&BSet::new(vec![_ic_b_1]));
                 }
 
@@ -343,6 +363,7 @@ impl Train1_Lukas_POR_v3 {
         //transition
         if !is_caching || self._tr_cache_BACK_MOVE_1.is_none() {
             let mut _ic_set_4: BSet<BLOCKS> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_b_1 in self.LBT.difference(&self.TRK.domain()).clone().iter().cloned() {
                 if (BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range()))).booleanValue() {
                     _ic_set_4 = _ic_set_4._union(&BSet::new(vec![_ic_b_1]));
@@ -360,8 +381,9 @@ impl Train1_Lukas_POR_v3 {
         //transition
         if !is_caching || self._tr_cache_BACK_MOVE_2.is_none() {
             let mut _ic_set_5: BSet<BLOCKS> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_b_1 in self.LBT.intersect(&self.TRK.domain()).clone().iter().cloned() {
-                if (self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
+                if ((self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
                     _ic_set_5 = _ic_set_5._union(&BSet::new(vec![_ic_b_1]));
                 }
 
@@ -377,6 +399,7 @@ impl Train1_Lukas_POR_v3 {
         //transition
         if !is_caching || self._tr_cache_point_positionning.is_none() {
             let mut _ic_set_6: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() {
                 if (BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range()))).booleanValue() {
                     _ic_set_6 = _ic_set_6._union(&BSet::new(vec![_ic_r_1]));
@@ -394,8 +417,9 @@ impl Train1_Lukas_POR_v3 {
         //transition
         if !is_caching || self._tr_cache_route_formation.is_none() {
             let mut _ic_set_7: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() {
-                if (self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]))).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])))).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
+                if ((self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]))).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])))) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
                     _ic_set_7 = _ic_set_7._union(&BSet::new(vec![_ic_r_1]));
                 }
 
@@ -414,6 +438,7 @@ impl Train1_Lukas_POR_v3 {
 
     pub fn _check_inv_2(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_8 = BBoolean::new(true);
         for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() {
             {
@@ -425,14 +450,17 @@ impl Train1_Lukas_POR_v3 {
 
             }
         }
+
         return _ic_boolean_8.booleanValue();
     }
 
     pub fn _check_inv_3(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_10 = BBoolean::new(true);
         for _ic_x_1 in self.TRK.domain().clone().iter().cloned() {
             for _ic_y_1 in self.TRK.relationImage(&BSet::new(vec![_ic_x_1])).clone().iter().cloned() {
+                //quantified_predicate
                 let mut _ic_boolean_9 = BBoolean::new(false);
                 for _ic_r_1 in self._ROUTES.clone().iter().cloned() {
                     if (self.nxt.functionCall(&_ic_r_1).elementOf(&BTuple::from_refs(&_ic_x_1, &_ic_y_1))).booleanValue() {
@@ -441,6 +469,7 @@ impl Train1_Lukas_POR_v3 {
                     }
 
                 }
+
                 if !(_ic_boolean_9).booleanValue() {
                     _ic_boolean_10 = BBoolean::new(false);
                     break;
@@ -448,11 +477,13 @@ impl Train1_Lukas_POR_v3 {
 
             }
         }
+
         return _ic_boolean_10.booleanValue();
     }
 
     pub fn _check_inv_4(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_11 = BBoolean::new(true);
         for _ic_r_1 in self.frm.clone().iter().cloned() {
             {
@@ -464,6 +495,7 @@ impl Train1_Lukas_POR_v3 {
 
             }
         }
+
         return _ic_boolean_11.booleanValue();
     }
 
@@ -474,6 +506,7 @@ impl Train1_Lukas_POR_v3 {
 
     pub fn _check_inv_6(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_12 = BBoolean::new(true);
         for _ic_a_1 in self.rsrtbl.domain().clone().iter().cloned() {
             for _ic_b_1 in self.LBT.clone().iter().cloned() {
@@ -481,7 +514,7 @@ impl Train1_Lukas_POR_v3 {
                     let mut _ic_c_1 = self.rsrtbl.functionCall(&_ic_b_1);
                     {
                         let mut _ic_d_1 = self.nxt.functionCall(&_ic_c_1);
-                        if !(_ic_d_1.range().elementOf(&_ic_b_1).and(&_ic_a_1.equal(&_ic_d_1.inverse().functionCall(&_ic_b_1))).implies(&self.rsrtbl.functionCall(&_ic_a_1).unequal(&_ic_c_1))).booleanValue() {
+                        if !((_ic_d_1.range().elementOf(&_ic_b_1) && _ic_a_1.equal(&_ic_d_1.inverse().functionCall(&_ic_b_1))).implies(&self.rsrtbl.functionCall(&_ic_a_1).unequal(&_ic_c_1))).booleanValue() {
                             _ic_boolean_12 = BBoolean::new(false);
                             break;
                         }
@@ -490,6 +523,7 @@ impl Train1_Lukas_POR_v3 {
                 }
             }
         }
+
         return _ic_boolean_12.booleanValue();
     }
 
@@ -510,6 +544,7 @@ impl Train1_Lukas_POR_v3 {
 
     pub fn _check_inv_10(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_13 = BBoolean::new(true);
         for _ic_r_1 in self._ROUTES.clone().iter().cloned() {
             {
@@ -518,7 +553,7 @@ impl Train1_Lukas_POR_v3 {
                     let mut _ic_b_1 = self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]));
                     {
                         let mut _ic_c_1 = _ic_b_1.difference(&self.OCC);
-                        if !(_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&BSet::new(vec![])).and(&_ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)).and(&_ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1))).booleanValue() {
+                        if !(((_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&BSet::new(vec![])) && _ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)) && _ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1))).booleanValue() {
                             _ic_boolean_13 = BBoolean::new(false);
                             break;
                         }
@@ -527,6 +562,7 @@ impl Train1_Lukas_POR_v3 {
                 }
             }
         }
+
         return _ic_boolean_13.booleanValue();
     }
 
@@ -540,11 +576,10 @@ impl Train1_Lukas_POR_v3 {
         return self.rsrtbl.relationImage(&self.OCC).subset(&self.frm).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_route_reservation" => {self._tr_route_reservation(false);},
                 "_tr_route_freeing" => {self._tr_route_freeing(false);},
                 "_tr_FRONT_MOVE_1" => {self._tr_FRONT_MOVE_1(false);},
@@ -561,431 +596,206 @@ impl Train1_Lukas_POR_v3 {
     //model_check_next_states
     fn generateNextStates(state: &mut Train1_Lukas_POR_v3,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_guard_m: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, HashSet<&str>>>>,
-                          guardCache: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, PersistentHashMap<&str, bool>>>>,
-                          parents_m: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, Train1_Lukas_POR_v3>>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<Train1_Lukas_POR_v3> {
-        let mut result = HashSet::<Train1_Lukas_POR_v3>::new();
-        if isCaching {
-            let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned());
-            let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() };
-            //model_check_transition
-            let mut _trid_1 = state._tr_route_reservation(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_reservation(_tmp_1);
-                match guard_dependency.get("route_reservation") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("route_reservation").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_reservation").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_route_freeing(isCaching);
-            for param in _trid_2.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_freeing(_tmp_1);
-                match guard_dependency.get("route_freeing") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("route_freeing").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_freeing").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.FRONT_MOVE_1(_tmp_1);
-                match guard_dependency.get("FRONT_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("FRONT_MOVE_1").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("FRONT_MOVE_1").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.FRONT_MOVE_2(_tmp_1);
-                match guard_dependency.get("FRONT_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("FRONT_MOVE_2").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("FRONT_MOVE_2").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching);
-            for param in _trid_5.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.BACK_MOVE_1(_tmp_1);
-                match guard_dependency.get("BACK_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("BACK_MOVE_1").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("BACK_MOVE_1").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.BACK_MOVE_2(_tmp_1);
-                match guard_dependency.get("BACK_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("BACK_MOVE_2").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("BACK_MOVE_2").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_7 = state._tr_point_positionning(isCaching);
-            for param in _trid_7.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.point_positionning(_tmp_1);
-                match guard_dependency.get("point_positionning") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("point_positionning").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("point_positionning").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_8 = state._tr_route_formation(isCaching);
-            for param in _trid_8.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_formation(_tmp_1);
-                match guard_dependency.get("route_formation") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("route_formation").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_formation").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
+                          transitions: Arc<AtomicU64>) -> HashSet<(Train1_Lukas_POR_v3, &'static str)> {
+        let mut result = HashSet::<(Train1_Lukas_POR_v3, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        let mut _trid_1 = state._tr_route_reservation(isCaching);
+        for param in _trid_1.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.route_reservation(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_reservation")); }
+            result.insert((copiedState, "route_reservation"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_2 = state._tr_route_freeing(isCaching);
+        for param in _trid_2.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.route_freeing(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_freeing")); }
+            result.insert((copiedState, "route_freeing"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching);
+        for param in _trid_3.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.FRONT_MOVE_1(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("FRONT_MOVE_1")); }
+            result.insert((copiedState, "FRONT_MOVE_1"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching);
+        for param in _trid_4.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.FRONT_MOVE_2(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("FRONT_MOVE_2")); }
+            result.insert((copiedState, "FRONT_MOVE_2"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching);
+        for param in _trid_5.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.BACK_MOVE_1(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("BACK_MOVE_1")); }
+            result.insert((copiedState, "BACK_MOVE_1"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching);
+        for param in _trid_6.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.BACK_MOVE_2(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("BACK_MOVE_2")); }
+            result.insert((copiedState, "BACK_MOVE_2"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_7 = state._tr_point_positionning(isCaching);
+        for param in _trid_7.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.point_positionning(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("point_positionning")); }
+            result.insert((copiedState, "point_positionning"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_8 = state._tr_route_formation(isCaching);
+        for param in _trid_8.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.route_formation(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_formation")); }
+            result.insert((copiedState, "route_formation"));
+            evaluated_transitions += 1;
+        }
 
-            guardCache.lock().unwrap().insert(state.clone(), newCache);
-        } else {
-            //model_check_transition
-            let mut _trid_1 = state._tr_route_reservation(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_reservation(_tmp_1);
-                match guard_dependency.get("route_reservation") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_route_freeing(isCaching);
-            for param in _trid_2.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_freeing(_tmp_1);
-                match guard_dependency.get("route_freeing") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.FRONT_MOVE_1(_tmp_1);
-                match guard_dependency.get("FRONT_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.FRONT_MOVE_2(_tmp_1);
-                match guard_dependency.get("FRONT_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching);
-            for param in _trid_5.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.BACK_MOVE_1(_tmp_1);
-                match guard_dependency.get("BACK_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.BACK_MOVE_2(_tmp_1);
-                match guard_dependency.get("BACK_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_7 = state._tr_point_positionning(isCaching);
-            for param in _trid_7.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.point_positionning(_tmp_1);
-                match guard_dependency.get("point_positionning") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_8 = state._tr_route_formation(isCaching);
-            for param in _trid_8.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_formation(_tmp_1);
-                match guard_dependency.get("route_formation") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
 
-        }
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &Train1_Lukas_POR_v3,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<Train1_Lukas_POR_v3, HashSet<&str>>>> ) -> bool {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &Train1_Lukas_POR_v3, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_2") {
+            if dependent_invariants_of_state.contains(&"_check_inv_2") {
                 if !state._check_inv_2() {
+                    println!("_check_inv_2 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_3") {
+            if dependent_invariants_of_state.contains(&"_check_inv_3") {
                 if !state._check_inv_3() {
+                    println!("_check_inv_3 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_4") {
+            if dependent_invariants_of_state.contains(&"_check_inv_4") {
                 if !state._check_inv_4() {
+                    println!("_check_inv_4 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_5") {
+            if dependent_invariants_of_state.contains(&"_check_inv_5") {
                 if !state._check_inv_5() {
+                    println!("_check_inv_5 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_6") {
+            if dependent_invariants_of_state.contains(&"_check_inv_6") {
                 if !state._check_inv_6() {
+                    println!("_check_inv_6 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_7") {
+            if dependent_invariants_of_state.contains(&"_check_inv_7") {
                 if !state._check_inv_7() {
+                    println!("_check_inv_7 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_8") {
+            if dependent_invariants_of_state.contains(&"_check_inv_8") {
                 if !state._check_inv_8() {
+                    println!("_check_inv_8 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_9") {
+            if dependent_invariants_of_state.contains(&"_check_inv_9") {
                 if !state._check_inv_9() {
+                    println!("_check_inv_9 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_10") {
+            if dependent_invariants_of_state.contains(&"_check_inv_10") {
                 if !state._check_inv_10() {
+                    println!("_check_inv_10 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_11") {
+            if dependent_invariants_of_state.contains(&"_check_inv_11") {
                 if !state._check_inv_11() {
+                    println!("_check_inv_11 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_12") {
+            if dependent_invariants_of_state.contains(&"_check_inv_12") {
                 if !state._check_inv_12() {
+                    println!("_check_inv_12 failed!");
                     return false;
                 }
             }
@@ -995,16 +805,14 @@ impl Train1_Lukas_POR_v3 {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<Train1_Lukas_POR_v3>>>, mc_type: MC_TYPE) -> Train1_Lukas_POR_v3 {
+    fn next(collection_m: Arc<Mutex<LinkedList<(Train1_Lukas_POR_v3, &'static str)>>>, mc_type: MC_TYPE) -> (Train1_Lukas_POR_v3, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -1013,100 +821,88 @@ impl Train1_Lukas_POR_v3 {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = Train1_Lukas_POR_v3::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() {
-            invariant_violated.store(true, Ordering::Release);
-        }
-
-        let mut states = HashSet::<Train1_Lukas_POR_v3>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<Train1_Lukas_POR_v3>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, HashSet<&str>>::new()));
-        let mut guard_cache = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, Train1_Lukas_POR_v3>::new()));
-
-        if is_caching {
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            invariantDependency.insert("point_positionning", HashSet::from(["_check_inv_3", "_check_inv_1", "_check_inv_4"]));
+            "point_positionning" => vec!["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("route_reservation", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"]));
+            "route_reservation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("FRONT_MOVE_1", HashSet::from(["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"]));
+            "FRONT_MOVE_1" => vec!["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("BACK_MOVE_1", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
+            "BACK_MOVE_1" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("FRONT_MOVE_2", HashSet::from(["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"]));
+            "FRONT_MOVE_2" => vec!["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("route_formation", HashSet::from(["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"]));
+            "route_formation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"],
             //model_check_init_static
-            invariantDependency.insert("route_freeing", HashSet::from(["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"]));
+            "route_freeing" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("BACK_MOVE_2", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
+            "BACK_MOVE_2" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
+            _ => vec![],
+        }
+    }
+
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            guardDependency.insert("point_positionning", HashSet::from(["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "point_positionning" => vec!["_check_inv_3", "_check_inv_1", "_check_inv_4"],
             //model_check_init_static
-            guardDependency.insert("route_reservation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "route_reservation" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("FRONT_MOVE_1", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "FRONT_MOVE_1" => vec!["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("BACK_MOVE_1", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "BACK_MOVE_1" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("FRONT_MOVE_2", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "FRONT_MOVE_2" => vec!["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("route_formation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"]));
+            "route_formation" => vec!["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("route_freeing", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "route_freeing" => vec!["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("BACK_MOVE_2", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
+            "BACK_MOVE_2" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"],
+            _ => vec![],
         }
+    }
 
-        let transitions = Arc::new(AtomicI64::new(0));
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = Train1_Lukas_POR_v3::new();
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        let mut all_states = HashSet::<Train1_Lukas_POR_v3>::new();
+        all_states.insert(machine.clone());
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Train1_Lukas_POR_v3, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
+        let mut stop_threads = false;
+
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
+
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                       .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                       .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -1114,135 +910,66 @@ impl Train1_Lukas_POR_v3 {
 
         let machine = Train1_Lukas_POR_v3::new();
 
+        let all_states = Arc::new(DashSet::<Train1_Lukas_POR_v3>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
-
-        let states_m = Arc::new(Mutex::new(HashSet::<Train1_Lukas_POR_v3>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Train1_Lukas_POR_v3, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        let collection_m = Arc::new(Mutex::new(LinkedList::<Train1_Lukas_POR_v3>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, HashSet<&str>>::new()));
-        let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<Train1_Lukas_POR_v3, Train1_Lukas_POR_v3>::new()));
-
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("point_positionning", HashSet::from(["_check_inv_3", "_check_inv_1", "_check_inv_4"]));
-            //model_check_init_static
-            invariantDependency.insert("route_reservation", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("FRONT_MOVE_1", HashSet::from(["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("BACK_MOVE_1", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("FRONT_MOVE_2", HashSet::from(["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("route_formation", HashSet::from(["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("route_freeing", HashSet::from(["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("BACK_MOVE_2", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
-            //model_check_init_static
-            guardDependency.insert("point_positionning", HashSet::from(["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("route_reservation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("FRONT_MOVE_1", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("BACK_MOVE_1", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("FRONT_MOVE_2", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("route_formation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"]));
-            //model_check_init_static
-            guardDependency.insert("route_freeing", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("BACK_MOVE_2", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
-
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
-            let dependent_guard_m2 = Arc::clone(&dependent_guard_m);
-            let parents_m2 = Arc::clone(&parents_m);
-            let guard_cache = Arc::clone(&guard_cache_b);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
 
-                //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                //println!("Thread {:?} executing", thread::current().id());
+                next_states.into_iter()
+                           .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                           .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                            Ok(_) => finished_tasks += 1,
+                            Err(msg) => { println!("{}", msg); stop_threads = true; },
+                        },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/benchmarks/model_checking/Rust/Train_1_beebook_deterministic_MC_POR_v2.rs b/benchmarks/model_checking/Rust/Train_1_beebook_deterministic_MC_POR_v2.rs
index 9460794f2f66d49a4f939825975f203dc3dc8993..b74c92f7d41671bae902e106caef881648b1e5bf 100644
--- a/benchmarks/model_checking/Rust/Train_1_beebook_deterministic_MC_POR_v2.rs
+++ b/benchmarks/model_checking/Rust/Train_1_beebook_deterministic_MC_POR_v2.rs
@@ -1,16 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::bboolean::BBoolean;
 use btypes::brelation::BRelation;
 use btypes::bset::BSet;
@@ -23,19 +24,19 @@ pub enum MC_TYPE { BFS, DFS, MIXED }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum BLOCKS {
-    A,
-    B,
-    C,
-    D,
-    E,
-    F,
-    G,
-    H,
-    I,
-    J,
-    K,
-    L,
-    M,
+    A, 
+    B, 
+    C, 
+    D, 
+    E, 
+    F, 
+    G, 
+    H, 
+    I, 
+    J, 
+    K, 
+    L, 
+    M, 
     N
 }
 impl BLOCKS {
@@ -48,36 +49,36 @@ impl Default for BLOCKS {
 }
 impl fmt::Display for BLOCKS {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            BLOCKS::A => write!(f, "A"),
-            BLOCKS::B => write!(f, "B"),
-            BLOCKS::C => write!(f, "C"),
-            BLOCKS::D => write!(f, "D"),
-            BLOCKS::E => write!(f, "E"),
-            BLOCKS::F => write!(f, "F"),
-            BLOCKS::G => write!(f, "G"),
-            BLOCKS::H => write!(f, "H"),
-            BLOCKS::I => write!(f, "I"),
-            BLOCKS::J => write!(f, "J"),
-            BLOCKS::K => write!(f, "K"),
-            BLOCKS::L => write!(f, "L"),
-            BLOCKS::M => write!(f, "M"),
-            BLOCKS::N => write!(f, "N"),
-        }
+       match *self {
+           BLOCKS::A => write!(f, "A"),
+           BLOCKS::B => write!(f, "B"),
+           BLOCKS::C => write!(f, "C"),
+           BLOCKS::D => write!(f, "D"),
+           BLOCKS::E => write!(f, "E"),
+           BLOCKS::F => write!(f, "F"),
+           BLOCKS::G => write!(f, "G"),
+           BLOCKS::H => write!(f, "H"),
+           BLOCKS::I => write!(f, "I"),
+           BLOCKS::J => write!(f, "J"),
+           BLOCKS::K => write!(f, "K"),
+           BLOCKS::L => write!(f, "L"),
+           BLOCKS::M => write!(f, "M"),
+           BLOCKS::N => write!(f, "N"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum ROUTES {
-    R1,
-    R2,
-    R3,
-    R4,
-    R5,
-    R6,
-    R7,
-    R8,
-    R9,
+    R1, 
+    R2, 
+    R3, 
+    R4, 
+    R5, 
+    R6, 
+    R7, 
+    R8, 
+    R9, 
     R10
 }
 impl ROUTES {
@@ -90,18 +91,18 @@ impl Default for ROUTES {
 }
 impl fmt::Display for ROUTES {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            ROUTES::R1 => write!(f, "R1"),
-            ROUTES::R2 => write!(f, "R2"),
-            ROUTES::R3 => write!(f, "R3"),
-            ROUTES::R4 => write!(f, "R4"),
-            ROUTES::R5 => write!(f, "R5"),
-            ROUTES::R6 => write!(f, "R6"),
-            ROUTES::R7 => write!(f, "R7"),
-            ROUTES::R8 => write!(f, "R8"),
-            ROUTES::R9 => write!(f, "R9"),
-            ROUTES::R10 => write!(f, "R10"),
-        }
+       match *self {
+           ROUTES::R1 => write!(f, "R1"),
+           ROUTES::R2 => write!(f, "R2"),
+           ROUTES::R3 => write!(f, "R3"),
+           ROUTES::R4 => write!(f, "R4"),
+           ROUTES::R5 => write!(f, "R5"),
+           ROUTES::R6 => write!(f, "R6"),
+           ROUTES::R7 => write!(f, "R7"),
+           ROUTES::R8 => write!(f, "R8"),
+           ROUTES::R9 => write!(f, "R9"),
+           ROUTES::R10 => write!(f, "R10"),
+       }
     }
 }
 
@@ -138,6 +139,21 @@ pub struct Train_1_beebook_deterministic_MC_POR_v2 {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_route_formation: Option<BSet<ROUTES>>,}
 
+impl fmt::Display for Train_1_beebook_deterministic_MC_POR_v2 {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "Train_1_beebook_deterministic_MC_POR_v2: (".to_owned();
+        result += &format!("_get_LBT: {}, ", self._get_LBT());
+        result += &format!("_get_TRK: {}, ", self._get_TRK());
+        result += &format!("_get_frm: {}, ", self._get_frm());
+        result += &format!("_get_OCC: {}, ", self._get_OCC());
+        result += &format!("_get_resbl: {}, ", self._get_resbl());
+        result += &format!("_get_resrt: {}, ", self._get_resrt());
+        result += &format!("_get_rsrtbl: {}, ", self._get_rsrtbl());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl Train_1_beebook_deterministic_MC_POR_v2 {
 
     pub fn new() -> Train_1_beebook_deterministic_MC_POR_v2 {
@@ -147,21 +163,21 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         return m;
     }
     fn init(&mut self) {
+        self._BLOCKS = BSet::new(vec![BLOCKS::A, BLOCKS::B, BLOCKS::C, BLOCKS::D, BLOCKS::E, BLOCKS::F, BLOCKS::G, BLOCKS::H, BLOCKS::I, BLOCKS::J, BLOCKS::K, BLOCKS::L, BLOCKS::M, BLOCKS::N]);
+        self._ROUTES = BSet::new(vec![ROUTES::R1, ROUTES::R2, ROUTES::R3, ROUTES::R4, ROUTES::R5, ROUTES::R6, ROUTES::R7, ROUTES::R8, ROUTES::R9, ROUTES::R10]);
         self.nxt = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::L, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::C)])), BTuple::from_refs(&ROUTES::R2, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::L, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::F), BTuple::from_refs(&BLOCKS::F, &BLOCKS::G)])), BTuple::from_refs(&ROUTES::R3, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::L, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::K), BTuple::from_refs(&BLOCKS::K, &BLOCKS::J), BTuple::from_refs(&BLOCKS::J, &BLOCKS::N)])), BTuple::from_refs(&ROUTES::R4, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::M, &BLOCKS::H), BTuple::from_refs(&BLOCKS::H, &BLOCKS::I), BTuple::from_refs(&BLOCKS::I, &BLOCKS::K), BTuple::from_refs(&BLOCKS::K, &BLOCKS::F), BTuple::from_refs(&BLOCKS::F, &BLOCKS::G)])), BTuple::from_refs(&ROUTES::R5, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::M, &BLOCKS::H), BTuple::from_refs(&BLOCKS::H, &BLOCKS::I), BTuple::from_refs(&BLOCKS::I, &BLOCKS::J), BTuple::from_refs(&BLOCKS::J, &BLOCKS::N)])), BTuple::from_refs(&ROUTES::R6, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::C, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::L)])), BTuple::from_refs(&ROUTES::R7, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::G, &BLOCKS::F), BTuple::from_refs(&BLOCKS::F, &BLOCKS::E), BTuple::from_refs(&BLOCKS::E, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::L)])), BTuple::from_refs(&ROUTES::R8, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::N, &BLOCKS::J), BTuple::from_refs(&BLOCKS::J, &BLOCKS::K), BTuple::from_refs(&BLOCKS::K, &BLOCKS::D), BTuple::from_refs(&BLOCKS::D, &BLOCKS::B), BTuple::from_refs(&BLOCKS::B, &BLOCKS::A), BTuple::from_refs(&BLOCKS::A, &BLOCKS::L)])), BTuple::from_refs(&ROUTES::R9, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::G, &BLOCKS::F), BTuple::from_refs(&BLOCKS::F, &BLOCKS::K), BTuple::from_refs(&BLOCKS::K, &BLOCKS::I), BTuple::from_refs(&BLOCKS::I, &BLOCKS::H), BTuple::from_refs(&BLOCKS::H, &BLOCKS::M)])), BTuple::from_refs(&ROUTES::R10, &BRelation::new(vec![BTuple::from_refs(&BLOCKS::N, &BLOCKS::J), BTuple::from_refs(&BLOCKS::J, &BLOCKS::I), BTuple::from_refs(&BLOCKS::I, &BLOCKS::H), BTuple::from_refs(&BLOCKS::H, &BLOCKS::M)]))]);
         self.fst = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BLOCKS::L), BTuple::from_refs(&ROUTES::R2, &BLOCKS::L), BTuple::from_refs(&ROUTES::R3, &BLOCKS::L), BTuple::from_refs(&ROUTES::R4, &BLOCKS::M), BTuple::from_refs(&ROUTES::R5, &BLOCKS::M), BTuple::from_refs(&ROUTES::R6, &BLOCKS::C), BTuple::from_refs(&ROUTES::R7, &BLOCKS::G), BTuple::from_refs(&ROUTES::R8, &BLOCKS::N), BTuple::from_refs(&ROUTES::R9, &BLOCKS::G), BTuple::from_refs(&ROUTES::R10, &BLOCKS::N)]);
         self.lst = BRelation::new(vec![BTuple::from_refs(&ROUTES::R1, &BLOCKS::C), BTuple::from_refs(&ROUTES::R2, &BLOCKS::G), BTuple::from_refs(&ROUTES::R3, &BLOCKS::N), BTuple::from_refs(&ROUTES::R4, &BLOCKS::G), BTuple::from_refs(&ROUTES::R5, &BLOCKS::N), BTuple::from_refs(&ROUTES::R6, &BLOCKS::L), BTuple::from_refs(&ROUTES::R7, &BLOCKS::L), BTuple::from_refs(&ROUTES::R8, &BLOCKS::L), BTuple::from_refs(&ROUTES::R9, &BLOCKS::M), BTuple::from_refs(&ROUTES::R10, &BLOCKS::M)]);
         let mut _ic_set_0 = BRelation::<BLOCKS, ROUTES>::new(vec![]);
         for _ic_b_1 in self._BLOCKS.clone().iter().cloned() {
             for _ic_r_1 in self._ROUTES.clone().iter().cloned() {
-                if (self.nxt.domain().elementOf(&_ic_r_1).and(&self.nxt.functionCall(&_ic_r_1).domain().elementOf(&_ic_b_1).or(&self.nxt.functionCall(&_ic_r_1).range().elementOf(&_ic_b_1)))).booleanValue() {
+                if ((self.nxt.domain().elementOf(&_ic_r_1) && (self.nxt.functionCall(&_ic_r_1).domain().elementOf(&_ic_b_1) || self.nxt.functionCall(&_ic_r_1).range().elementOf(&_ic_b_1)))).booleanValue() {
                     _ic_set_0 = _ic_set_0._union(&BRelation::<BLOCKS, ROUTES>::new(vec![BTuple::from_refs(&_ic_b_1, &_ic_r_1)]));
                 }
 
             }
         }
         self.rtbl = _ic_set_0;
-        self._BLOCKS = BSet::new(vec![BLOCKS::A, BLOCKS::B, BLOCKS::C, BLOCKS::D, BLOCKS::E, BLOCKS::F, BLOCKS::G, BLOCKS::H, BLOCKS::I, BLOCKS::J, BLOCKS::K, BLOCKS::L, BLOCKS::M, BLOCKS::N]);
-        self._ROUTES = BSet::new(vec![ROUTES::R1, ROUTES::R2, ROUTES::R3, ROUTES::R4, ROUTES::R5, ROUTES::R6, ROUTES::R7, ROUTES::R8, ROUTES::R9, ROUTES::R10]);
         self.resrt = BSet::new(vec![]).clone().clone();
         self.resbl = BSet::new(vec![]).clone().clone();
         self.rsrtbl = BRelation::new(vec![]).clone().clone();
@@ -171,55 +187,55 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         self.LBT = BSet::new(vec![]).clone().clone();
     }
 
-    pub fn get_fst(&self) -> BRelation<ROUTES, BLOCKS> {
+    pub fn _get_fst(&self) -> BRelation<ROUTES, BLOCKS> {
         return self.fst.clone();
     }
 
-    pub fn get_lst(&self) -> BRelation<ROUTES, BLOCKS> {
+    pub fn _get_lst(&self) -> BRelation<ROUTES, BLOCKS> {
         return self.lst.clone();
     }
 
-    pub fn get_nxt(&self) -> BRelation<ROUTES, BRelation<BLOCKS, BLOCKS>> {
+    pub fn _get_nxt(&self) -> BRelation<ROUTES, BRelation<BLOCKS, BLOCKS>> {
         return self.nxt.clone();
     }
 
-    pub fn get_rtbl(&self) -> BRelation<BLOCKS, ROUTES> {
+    pub fn _get_rtbl(&self) -> BRelation<BLOCKS, ROUTES> {
         return self.rtbl.clone();
     }
 
-    pub fn get_LBT(&self) -> BSet<BLOCKS> {
+    pub fn _get_LBT(&self) -> BSet<BLOCKS> {
         return self.LBT.clone();
     }
 
-    pub fn get_TRK(&self) -> BRelation<BLOCKS, BLOCKS> {
+    pub fn _get_TRK(&self) -> BRelation<BLOCKS, BLOCKS> {
         return self.TRK.clone();
     }
 
-    pub fn get_frm(&self) -> BSet<ROUTES> {
+    pub fn _get_frm(&self) -> BSet<ROUTES> {
         return self.frm.clone();
     }
 
-    pub fn get_OCC(&self) -> BSet<BLOCKS> {
+    pub fn _get_OCC(&self) -> BSet<BLOCKS> {
         return self.OCC.clone();
     }
 
-    pub fn get_resbl(&self) -> BSet<BLOCKS> {
+    pub fn _get_resbl(&self) -> BSet<BLOCKS> {
         return self.resbl.clone();
     }
 
-    pub fn get_resrt(&self) -> BSet<ROUTES> {
+    pub fn _get_resrt(&self) -> BSet<ROUTES> {
         return self.resrt.clone();
     }
 
-    pub fn get_rsrtbl(&self) -> BRelation<BLOCKS, ROUTES> {
+    pub fn _get_rsrtbl(&self) -> BRelation<BLOCKS, ROUTES> {
         return self.rsrtbl.clone();
     }
 
-    pub fn get__BLOCKS(&self) -> BSet<BLOCKS> {
+    pub fn _get__BLOCKS(&self) -> BSet<BLOCKS> {
         return self._BLOCKS.clone();
     }
 
-    pub fn get__ROUTES(&self) -> BSet<ROUTES> {
+    pub fn _get__ROUTES(&self) -> BSet<ROUTES> {
         return self._ROUTES.clone();
     }
 
@@ -300,8 +316,9 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         //transition
         if !is_caching || self._tr_cache_route_reservation.is_none() {
             let mut _ic_set_1: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self._ROUTES.difference(&self.resrt).clone().iter().cloned() {
-                if (self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).intersect(&self.resbl).equal(&BSet::new(vec![])).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
+                if ((self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).intersect(&self.resbl).equal(&BSet::new(vec![])) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
                     _ic_set_1 = _ic_set_1._union(&BSet::new(vec![_ic_r_1]));
                 }
 
@@ -317,6 +334,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         //transition
         if !is_caching || self._tr_cache_route_freeing.is_none() {
             let mut _ic_set_2: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self.resrt.difference(&self.rsrtbl.range()).clone().iter().cloned() {
                 _ic_set_2 = _ic_set_2._union(&BSet::new(vec![_ic_r_1]));
 
@@ -332,8 +350,9 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         //transition
         if !is_caching || self._tr_cache_FRONT_MOVE_1.is_none() {
             let mut _ic_set_3: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self.frm.clone().iter().cloned() {
-                if (self.resbl.difference(&self.OCC).elementOf(&self.fst.functionCall(&_ic_r_1)).and(&_ic_r_1.equal(&self.rsrtbl.functionCall(&self.fst.functionCall(&_ic_r_1)))).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
+                if (((self.resbl.difference(&self.OCC).elementOf(&self.fst.functionCall(&_ic_r_1)) && _ic_r_1.equal(&self.rsrtbl.functionCall(&self.fst.functionCall(&_ic_r_1)))) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
                     _ic_set_3 = _ic_set_3._union(&BSet::new(vec![_ic_r_1]));
                 }
 
@@ -349,6 +368,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         //transition
         if !is_caching || self._tr_cache_FRONT_MOVE_2.is_none() {
             let mut _ic_set_4: BSet<BLOCKS> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_b_1 in self.OCC.intersect(&self.TRK.domain()).clone().iter().cloned() {
                 if (self.OCC.notElementOf(&self.TRK.functionCall(&_ic_b_1))).booleanValue() {
                     _ic_set_4 = _ic_set_4._union(&BSet::new(vec![_ic_b_1]));
@@ -366,6 +386,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         //transition
         if !is_caching || self._tr_cache_BACK_MOVE_1.is_none() {
             let mut _ic_set_5: BSet<BLOCKS> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_b_1 in self.LBT.difference(&self.TRK.domain()).clone().iter().cloned() {
                 if (BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range()))).booleanValue() {
                     _ic_set_5 = _ic_set_5._union(&BSet::new(vec![_ic_b_1]));
@@ -383,8 +404,9 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         //transition
         if !is_caching || self._tr_cache_BACK_MOVE_2.is_none() {
             let mut _ic_set_6: BSet<BLOCKS> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_b_1 in self.LBT.intersect(&self.TRK.domain()).clone().iter().cloned() {
-                if (self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
+                if ((self.OCC.elementOf(&self.TRK.functionCall(&_ic_b_1)) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
                     _ic_set_6 = _ic_set_6._union(&BSet::new(vec![_ic_b_1]));
                 }
 
@@ -400,6 +422,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         //transition
         if !is_caching || self._tr_cache_point_positionning.is_none() {
             let mut _ic_set_7: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() {
                 if (BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range()))).booleanValue() {
                     _ic_set_7 = _ic_set_7._union(&BSet::new(vec![_ic_r_1]));
@@ -417,8 +440,9 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         //transition
         if !is_caching || self._tr_cache_route_formation.is_none() {
             let mut _ic_set_8: BSet<ROUTES> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() {
-                if (self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]))).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])))).and(&BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
+                if ((self.nxt.functionCall(&_ic_r_1).domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]))).equal(&self.TRK.domainRestriction(&self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])))) && BSet::new(vec![]).equal(&self.resrt.difference(&self.rsrtbl.range())))).booleanValue() {
                     _ic_set_8 = _ic_set_8._union(&BSet::new(vec![_ic_r_1]));
                 }
 
@@ -437,6 +461,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
 
     pub fn _check_inv_2(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_9 = BBoolean::new(true);
         for _ic_r_1 in self.resrt.difference(&self.frm).clone().iter().cloned() {
             {
@@ -448,14 +473,17 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
 
             }
         }
+
         return _ic_boolean_9.booleanValue();
     }
 
     pub fn _check_inv_3(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_11 = BBoolean::new(true);
         for _ic_x_1 in self.TRK.domain().clone().iter().cloned() {
             for _ic_y_1 in self.TRK.relationImage(&BSet::new(vec![_ic_x_1])).clone().iter().cloned() {
+                //quantified_predicate
                 let mut _ic_boolean_10 = BBoolean::new(false);
                 for _ic_r_1 in self._ROUTES.clone().iter().cloned() {
                     if (self.nxt.functionCall(&_ic_r_1).elementOf(&BTuple::from_refs(&_ic_x_1, &_ic_y_1))).booleanValue() {
@@ -464,6 +492,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
                     }
 
                 }
+
                 if !(_ic_boolean_10).booleanValue() {
                     _ic_boolean_11 = BBoolean::new(false);
                     break;
@@ -471,11 +500,13 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
 
             }
         }
+
         return _ic_boolean_11.booleanValue();
     }
 
     pub fn _check_inv_4(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_12 = BBoolean::new(true);
         for _ic_r_1 in self.frm.clone().iter().cloned() {
             {
@@ -487,6 +518,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
 
             }
         }
+
         return _ic_boolean_12.booleanValue();
     }
 
@@ -497,6 +529,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
 
     pub fn _check_inv_6(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_13 = BBoolean::new(true);
         for _ic_a_1 in self.rsrtbl.domain().clone().iter().cloned() {
             for _ic_b_1 in self.LBT.clone().iter().cloned() {
@@ -504,7 +537,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
                     let mut _ic_c_1 = self.rsrtbl.functionCall(&_ic_b_1);
                     {
                         let mut _ic_d_1 = self.nxt.functionCall(&_ic_c_1);
-                        if !(_ic_d_1.range().elementOf(&_ic_b_1).and(&_ic_a_1.equal(&_ic_d_1.inverse().functionCall(&_ic_b_1))).implies(&self.rsrtbl.functionCall(&_ic_a_1).unequal(&_ic_c_1))).booleanValue() {
+                        if !((_ic_d_1.range().elementOf(&_ic_b_1) && _ic_a_1.equal(&_ic_d_1.inverse().functionCall(&_ic_b_1))).implies(&self.rsrtbl.functionCall(&_ic_a_1).unequal(&_ic_c_1))).booleanValue() {
                             _ic_boolean_13 = BBoolean::new(false);
                             break;
                         }
@@ -513,6 +546,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
                 }
             }
         }
+
         return _ic_boolean_13.booleanValue();
     }
 
@@ -533,6 +567,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
 
     pub fn _check_inv_10(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_14 = BBoolean::new(true);
         for _ic_r_1 in self._ROUTES.clone().iter().cloned() {
             {
@@ -541,7 +576,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
                     let mut _ic_b_1 = self.rsrtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1]));
                     {
                         let mut _ic_c_1 = _ic_b_1.difference(&self.OCC);
-                        if !(_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&BSet::new(vec![])).and(&_ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)).and(&_ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1))).booleanValue() {
+                        if !(((_ic_a_1.relationImage(&self.rtbl.inverse().relationImage(&BSet::new(vec![_ic_r_1])).difference(&_ic_b_1)).intersect(&_ic_c_1).equal(&BSet::new(vec![])) && _ic_a_1.relationImage(&_ic_b_1).subset(&_ic_b_1)) && _ic_a_1.relationImage(&_ic_c_1).subset(&_ic_c_1))).booleanValue() {
                             _ic_boolean_14 = BBoolean::new(false);
                             break;
                         }
@@ -550,6 +585,7 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
                 }
             }
         }
+
         return _ic_boolean_14.booleanValue();
     }
 
@@ -563,11 +599,10 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         return self.rsrtbl.relationImage(&self.OCC).subset(&self.frm).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_route_reservation" => {self._tr_route_reservation(false);},
                 "_tr_route_freeing" => {self._tr_route_freeing(false);},
                 "_tr_FRONT_MOVE_1" => {self._tr_FRONT_MOVE_1(false);},
@@ -584,431 +619,206 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
     //model_check_next_states
     fn generateNextStates(state: &mut Train_1_beebook_deterministic_MC_POR_v2,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_guard_m: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>>>,
-                          guardCache: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, PersistentHashMap<&str, bool>>>>,
-                          parents_m: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, Train_1_beebook_deterministic_MC_POR_v2>>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<Train_1_beebook_deterministic_MC_POR_v2> {
-        let mut result = HashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new();
-        if isCaching {
-            let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned());
-            let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() };
-            //model_check_transition
-            let mut _trid_1 = state._tr_route_reservation(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_reservation(_tmp_1);
-                match guard_dependency.get("route_reservation") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("route_reservation").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_reservation").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_route_freeing(isCaching);
-            for param in _trid_2.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_freeing(_tmp_1);
-                match guard_dependency.get("route_freeing") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("route_freeing").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_freeing").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.FRONT_MOVE_1(_tmp_1);
-                match guard_dependency.get("FRONT_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("FRONT_MOVE_1").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("FRONT_MOVE_1").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.FRONT_MOVE_2(_tmp_1);
-                match guard_dependency.get("FRONT_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("FRONT_MOVE_2").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("FRONT_MOVE_2").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching);
-            for param in _trid_5.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.BACK_MOVE_1(_tmp_1);
-                match guard_dependency.get("BACK_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("BACK_MOVE_1").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("BACK_MOVE_1").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.BACK_MOVE_2(_tmp_1);
-                match guard_dependency.get("BACK_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("BACK_MOVE_2").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("BACK_MOVE_2").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_7 = state._tr_point_positionning(isCaching);
-            for param in _trid_7.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.point_positionning(_tmp_1);
-                match guard_dependency.get("point_positionning") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("point_positionning").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("point_positionning").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_8 = state._tr_route_formation(isCaching);
-            for param in _trid_8.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_formation(_tmp_1);
-                match guard_dependency.get("route_formation") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("route_formation").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("route_formation").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
+                          transitions: Arc<AtomicU64>) -> HashSet<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)> {
+        let mut result = HashSet::<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        let mut _trid_1 = state._tr_route_reservation(isCaching);
+        for param in _trid_1.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.route_reservation(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_reservation")); }
+            result.insert((copiedState, "route_reservation"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_2 = state._tr_route_freeing(isCaching);
+        for param in _trid_2.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.route_freeing(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_freeing")); }
+            result.insert((copiedState, "route_freeing"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching);
+        for param in _trid_3.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.FRONT_MOVE_1(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("FRONT_MOVE_1")); }
+            result.insert((copiedState, "FRONT_MOVE_1"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching);
+        for param in _trid_4.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.FRONT_MOVE_2(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("FRONT_MOVE_2")); }
+            result.insert((copiedState, "FRONT_MOVE_2"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching);
+        for param in _trid_5.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.BACK_MOVE_1(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("BACK_MOVE_1")); }
+            result.insert((copiedState, "BACK_MOVE_1"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching);
+        for param in _trid_6.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.BACK_MOVE_2(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("BACK_MOVE_2")); }
+            result.insert((copiedState, "BACK_MOVE_2"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_7 = state._tr_point_positionning(isCaching);
+        for param in _trid_7.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.point_positionning(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("point_positionning")); }
+            result.insert((copiedState, "point_positionning"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_8 = state._tr_route_formation(isCaching);
+        for param in _trid_8.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.route_formation(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("route_formation")); }
+            result.insert((copiedState, "route_formation"));
+            evaluated_transitions += 1;
+        }
 
-            guardCache.lock().unwrap().insert(state.clone(), newCache);
-        } else {
-            //model_check_transition
-            let mut _trid_1 = state._tr_route_reservation(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_reservation(_tmp_1);
-                match guard_dependency.get("route_reservation") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_route_freeing(isCaching);
-            for param in _trid_2.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_freeing(_tmp_1);
-                match guard_dependency.get("route_freeing") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_FRONT_MOVE_1(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.FRONT_MOVE_1(_tmp_1);
-                match guard_dependency.get("FRONT_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_FRONT_MOVE_2(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.FRONT_MOVE_2(_tmp_1);
-                match guard_dependency.get("FRONT_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_5 = state._tr_BACK_MOVE_1(isCaching);
-            for param in _trid_5.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.BACK_MOVE_1(_tmp_1);
-                match guard_dependency.get("BACK_MOVE_1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_BACK_MOVE_2(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.BACK_MOVE_2(_tmp_1);
-                match guard_dependency.get("BACK_MOVE_2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_7 = state._tr_point_positionning(isCaching);
-            for param in _trid_7.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.point_positionning(_tmp_1);
-                match guard_dependency.get("point_positionning") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_8 = state._tr_route_formation(isCaching);
-            for param in _trid_8.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.route_formation(_tmp_1);
-                match guard_dependency.get("route_formation") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
 
-        }
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &Train_1_beebook_deterministic_MC_POR_v2,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>>> ) -> bool {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &Train_1_beebook_deterministic_MC_POR_v2, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_2") {
+            if dependent_invariants_of_state.contains(&"_check_inv_2") {
                 if !state._check_inv_2() {
+                    println!("_check_inv_2 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_3") {
+            if dependent_invariants_of_state.contains(&"_check_inv_3") {
                 if !state._check_inv_3() {
+                    println!("_check_inv_3 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_4") {
+            if dependent_invariants_of_state.contains(&"_check_inv_4") {
                 if !state._check_inv_4() {
+                    println!("_check_inv_4 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_5") {
+            if dependent_invariants_of_state.contains(&"_check_inv_5") {
                 if !state._check_inv_5() {
+                    println!("_check_inv_5 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_6") {
+            if dependent_invariants_of_state.contains(&"_check_inv_6") {
                 if !state._check_inv_6() {
+                    println!("_check_inv_6 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_7") {
+            if dependent_invariants_of_state.contains(&"_check_inv_7") {
                 if !state._check_inv_7() {
+                    println!("_check_inv_7 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_8") {
+            if dependent_invariants_of_state.contains(&"_check_inv_8") {
                 if !state._check_inv_8() {
+                    println!("_check_inv_8 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_9") {
+            if dependent_invariants_of_state.contains(&"_check_inv_9") {
                 if !state._check_inv_9() {
+                    println!("_check_inv_9 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_10") {
+            if dependent_invariants_of_state.contains(&"_check_inv_10") {
                 if !state._check_inv_10() {
+                    println!("_check_inv_10 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_11") {
+            if dependent_invariants_of_state.contains(&"_check_inv_11") {
                 if !state._check_inv_11() {
+                    println!("_check_inv_11 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_12") {
+            if dependent_invariants_of_state.contains(&"_check_inv_12") {
                 if !state._check_inv_12() {
+                    println!("_check_inv_12 failed!");
                     return false;
                 }
             }
@@ -1018,16 +828,14 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<Train_1_beebook_deterministic_MC_POR_v2>>>, mc_type: MC_TYPE) -> Train_1_beebook_deterministic_MC_POR_v2 {
+    fn next(collection_m: Arc<Mutex<LinkedList<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)>>>, mc_type: MC_TYPE) -> (Train_1_beebook_deterministic_MC_POR_v2, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -1036,100 +844,88 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = Train_1_beebook_deterministic_MC_POR_v2::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() {
-            invariant_violated.store(true, Ordering::Release);
-        }
-
-        let mut states = HashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<Train_1_beebook_deterministic_MC_POR_v2>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>::new()));
-        let mut guard_cache = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, Train_1_beebook_deterministic_MC_POR_v2>::new()));
-
-        if is_caching {
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            invariantDependency.insert("point_positionning", HashSet::from(["_check_inv_3", "_check_inv_1", "_check_inv_4"]));
+            "point_positionning" => vec!["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("route_reservation", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"]));
+            "route_reservation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("FRONT_MOVE_1", HashSet::from(["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"]));
+            "FRONT_MOVE_1" => vec!["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("BACK_MOVE_1", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
+            "BACK_MOVE_1" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("FRONT_MOVE_2", HashSet::from(["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"]));
+            "FRONT_MOVE_2" => vec!["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("route_formation", HashSet::from(["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"]));
+            "route_formation" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"],
             //model_check_init_static
-            invariantDependency.insert("route_freeing", HashSet::from(["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"]));
+            "route_freeing" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"],
             //model_check_init_static
-            invariantDependency.insert("BACK_MOVE_2", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
+            "BACK_MOVE_2" => vec!["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"],
+            _ => vec![],
+        }
+    }
+
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            guardDependency.insert("point_positionning", HashSet::from(["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "point_positionning" => vec!["_check_inv_3", "_check_inv_1", "_check_inv_4"],
             //model_check_init_static
-            guardDependency.insert("route_reservation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"]));
+            "route_reservation" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("FRONT_MOVE_1", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "FRONT_MOVE_1" => vec!["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("BACK_MOVE_1", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "BACK_MOVE_1" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("FRONT_MOVE_2", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
+            "FRONT_MOVE_2" => vec!["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("route_formation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"]));
+            "route_formation" => vec!["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("route_freeing", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"]));
+            "route_freeing" => vec!["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("BACK_MOVE_2", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
+            "BACK_MOVE_2" => vec!["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"],
+            _ => vec![],
         }
+    }
 
-        let transitions = Arc::new(AtomicI64::new(0));
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = Train_1_beebook_deterministic_MC_POR_v2::new();
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        let mut all_states = HashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new();
+        all_states.insert(machine.clone());
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
+        let mut stop_threads = false;
+
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
+
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                       .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                       .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -1137,135 +933,66 @@ impl Train_1_beebook_deterministic_MC_POR_v2 {
 
         let machine = Train_1_beebook_deterministic_MC_POR_v2::new();
 
+        let all_states = Arc::new(DashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
-
-        let states_m = Arc::new(Mutex::new(HashSet::<Train_1_beebook_deterministic_MC_POR_v2>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(Train_1_beebook_deterministic_MC_POR_v2, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        let collection_m = Arc::new(Mutex::new(LinkedList::<Train_1_beebook_deterministic_MC_POR_v2>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, HashSet<&str>>::new()));
-        let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<Train_1_beebook_deterministic_MC_POR_v2, Train_1_beebook_deterministic_MC_POR_v2>::new()));
-
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("point_positionning", HashSet::from(["_check_inv_3", "_check_inv_1", "_check_inv_4"]));
-            //model_check_init_static
-            invariantDependency.insert("route_reservation", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_8", "_check_inv_12", "_check_inv_9", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("FRONT_MOVE_1", HashSet::from(["_check_inv_6", "_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("BACK_MOVE_1", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("FRONT_MOVE_2", HashSet::from(["_check_inv_10", "_check_inv_5", "_check_inv_12", "_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("route_formation", HashSet::from(["_check_inv_2", "_check_inv_4", "_check_inv_12", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("route_freeing", HashSet::from(["_check_inv_2", "_check_inv_7", "_check_inv_4", "_check_inv_12", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("BACK_MOVE_2", HashSet::from(["_check_inv_2", "_check_inv_6", "_check_inv_10", "_check_inv_7", "_check_inv_4", "_check_inv_5", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
-            //model_check_init_static
-            guardDependency.insert("point_positionning", HashSet::from(["_tr_route_formation", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("route_reservation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("FRONT_MOVE_1", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_BACK_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("BACK_MOVE_1", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("FRONT_MOVE_2", HashSet::from(["_tr_FRONT_MOVE_1", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("route_formation", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_point_positionning"]));
-            //model_check_init_static
-            guardDependency.insert("route_freeing", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_BACK_MOVE_2"]));
-            //model_check_init_static
-            guardDependency.insert("BACK_MOVE_2", HashSet::from(["_tr_route_formation", "_tr_FRONT_MOVE_1", "_tr_route_reservation", "_tr_route_freeing", "_tr_BACK_MOVE_1", "_tr_point_positionning", "_tr_FRONT_MOVE_2", "_tr_BACK_MOVE_2"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
-
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
-            let dependent_guard_m2 = Arc::clone(&dependent_guard_m);
-            let parents_m2 = Arc::clone(&parents_m);
-            let guard_cache = Arc::clone(&guard_cache_b);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
 
-                //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                //println!("Thread {:?} executing", thread::current().id());
+                next_states.into_iter()
+                           .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                           .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                            Ok(_) => finished_tasks += 1,
+                            Err(msg) => { println!("{}", msg); stop_threads = true; },
+                        },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/benchmarks/model_checking/Rust/nota_v2.rs b/benchmarks/model_checking/Rust/nota_v2.rs
index 326000b96f82db5469dcc99f9be83cbc5e34bc52..e4be01aa8806f081bb2e82ecdd48c11871f6c6c7 100644
--- a/benchmarks/model_checking/Rust/nota_v2.rs
+++ b/benchmarks/model_checking/Rust/nota_v2.rs
@@ -1,16 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments, unused ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::bboolean::BBoolean;
 use btypes::binteger::BInteger;
 use btypes::brelation::BRelation;
@@ -62,7 +63,8 @@ impl _Struct5 {
     }
 
 
-    pub fn equal(&self, other: &_Struct5) -> BBoolean {
+    pub fn equal(
+    &self, other: &_Struct5) -> BBoolean {
         return BBoolean::new(self.soc == other.soc && self.err == other.err);
     }
 
@@ -73,23 +75,23 @@ impl _Struct5 {
 }
 
 #[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
-pub struct _Struct3 {
+pub struct _Struct1 {
     sid: BSet<SID>,
-    err: IN_ERROR_CODES,
+    err: RM_ERROR_CODES,
 }
 
-impl fmt::Display for _Struct3 {
+impl fmt::Display for _Struct1 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "sid: {},err: {}", self.sid ,self.err)
     }
 }
 
-impl BObject for _Struct3 {}
-impl BStruct for _Struct3 {}
+impl BObject for _Struct1 {}
+impl BStruct for _Struct1 {}
 
-impl _Struct3 {
-    pub fn new(mut sid: BSet<SID>, mut err: IN_ERROR_CODES) -> _Struct3 {
-        let mut m: _Struct3 = Default::default();
+impl _Struct1 {
+    pub fn new(mut sid: BSet<SID>, mut err: RM_ERROR_CODES) -> _Struct1 {
+        let mut m: _Struct1 = Default::default();
         m.sid = sid;m.err = err;
         return m;
     }
@@ -98,48 +100,49 @@ impl _Struct3 {
         return self.sid.clone();
     }
 
-    pub fn get_err(&self) -> IN_ERROR_CODES {
+    pub fn get_err(&self) -> RM_ERROR_CODES {
         return self.err.clone();
     }
 
-    pub fn override_sid(&self, sid: BSet<SID>) -> _Struct3 {
-        return _Struct3::new(sid.clone(), self.err.clone());
+    pub fn override_sid(&self, sid: BSet<SID>) -> _Struct1 {
+        return _Struct1::new(sid.clone(), self.err.clone());
     }
 
 
-    pub fn override_err(&self, err: IN_ERROR_CODES) -> _Struct3 {
-        return _Struct3::new(self.sid.clone(), err.clone());
+    pub fn override_err(&self, err: RM_ERROR_CODES) -> _Struct1 {
+        return _Struct1::new(self.sid.clone(), err.clone());
     }
 
 
-    pub fn equal(&self, other: &_Struct3) -> BBoolean {
+    pub fn equal(
+    &self, other: &_Struct1) -> BBoolean {
         return BBoolean::new(self.sid == other.sid && self.err == other.err);
     }
 
-    pub fn unequal(&self, other: &_Struct3) -> BBoolean {
+    pub fn unequal(&self, other: &_Struct1) -> BBoolean {
         return BBoolean::new(self.sid != other.sid || self.err != other.err);
     }
 
 }
 
 #[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
-pub struct _Struct1 {
+pub struct _Struct3 {
     sid: BSet<SID>,
-    err: RM_ERROR_CODES,
+    err: IN_ERROR_CODES,
 }
 
-impl fmt::Display for _Struct1 {
+impl fmt::Display for _Struct3 {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
         write!(f, "sid: {},err: {}", self.sid ,self.err)
     }
 }
 
-impl BObject for _Struct1 {}
-impl BStruct for _Struct1 {}
+impl BObject for _Struct3 {}
+impl BStruct for _Struct3 {}
 
-impl _Struct1 {
-    pub fn new(mut sid: BSet<SID>, mut err: RM_ERROR_CODES) -> _Struct1 {
-        let mut m: _Struct1 = Default::default();
+impl _Struct3 {
+    pub fn new(mut sid: BSet<SID>, mut err: IN_ERROR_CODES) -> _Struct3 {
+        let mut m: _Struct3 = Default::default();
         m.sid = sid;m.err = err;
         return m;
     }
@@ -148,25 +151,26 @@ impl _Struct1 {
         return self.sid.clone();
     }
 
-    pub fn get_err(&self) -> RM_ERROR_CODES {
+    pub fn get_err(&self) -> IN_ERROR_CODES {
         return self.err.clone();
     }
 
-    pub fn override_sid(&self, sid: BSet<SID>) -> _Struct1 {
-        return _Struct1::new(sid.clone(), self.err.clone());
+    pub fn override_sid(&self, sid: BSet<SID>) -> _Struct3 {
+        return _Struct3::new(sid.clone(), self.err.clone());
     }
 
 
-    pub fn override_err(&self, err: RM_ERROR_CODES) -> _Struct1 {
-        return _Struct1::new(self.sid.clone(), err.clone());
+    pub fn override_err(&self, err: IN_ERROR_CODES) -> _Struct3 {
+        return _Struct3::new(self.sid.clone(), err.clone());
     }
 
 
-    pub fn equal(&self, other: &_Struct1) -> BBoolean {
+    pub fn equal(
+    &self, other: &_Struct3) -> BBoolean {
         return BBoolean::new(self.sid == other.sid && self.err == other.err);
     }
 
-    pub fn unequal(&self, other: &_Struct1) -> BBoolean {
+    pub fn unequal(&self, other: &_Struct3) -> BBoolean {
         return BBoolean::new(self.sid != other.sid || self.err != other.err);
     }
 
@@ -174,7 +178,7 @@ impl _Struct1 {
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum INTERCONNECTNODE {
-    node1,
+    node1, 
     node2
 }
 impl INTERCONNECTNODE {
@@ -187,16 +191,16 @@ impl Default for INTERCONNECTNODE {
 }
 impl fmt::Display for INTERCONNECTNODE {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            INTERCONNECTNODE::node1 => write!(f, "node1"),
-            INTERCONNECTNODE::node2 => write!(f, "node2"),
-        }
+       match *self {
+           INTERCONNECTNODE::node1 => write!(f, "node1"),
+           INTERCONNECTNODE::node2 => write!(f, "node2"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum SOCKET {
-    socket1,
+    socket1, 
     socket2
 }
 impl SOCKET {
@@ -209,16 +213,16 @@ impl Default for SOCKET {
 }
 impl fmt::Display for SOCKET {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            SOCKET::socket1 => write!(f, "socket1"),
-            SOCKET::socket2 => write!(f, "socket2"),
-        }
+       match *self {
+           SOCKET::socket1 => write!(f, "socket1"),
+           SOCKET::socket2 => write!(f, "socket2"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum SERVICE {
-    service1,
+    service1, 
     service2
 }
 impl SERVICE {
@@ -231,16 +235,16 @@ impl Default for SERVICE {
 }
 impl fmt::Display for SERVICE {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            SERVICE::service1 => write!(f, "service1"),
-            SERVICE::service2 => write!(f, "service2"),
-        }
+       match *self {
+           SERVICE::service1 => write!(f, "service1"),
+           SERVICE::service2 => write!(f, "service2"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum RESOURCEMANAGER {
-    resource1,
+    resource1, 
     resource2
 }
 impl RESOURCEMANAGER {
@@ -253,16 +257,16 @@ impl Default for RESOURCEMANAGER {
 }
 impl fmt::Display for RESOURCEMANAGER {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            RESOURCEMANAGER::resource1 => write!(f, "resource1"),
-            RESOURCEMANAGER::resource2 => write!(f, "resource2"),
-        }
+       match *self {
+           RESOURCEMANAGER::resource1 => write!(f, "resource1"),
+           RESOURCEMANAGER::resource2 => write!(f, "resource2"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum SID {
-    SID1,
+    SID1, 
     SID2
 }
 impl SID {
@@ -275,16 +279,16 @@ impl Default for SID {
 }
 impl fmt::Display for SID {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            SID::SID1 => write!(f, "SID1"),
-            SID::SID2 => write!(f, "SID2"),
-        }
+       match *self {
+           SID::SID1 => write!(f, "SID1"),
+           SID::SID2 => write!(f, "SID2"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum RM_ERROR_CODES {
-    RM_SERVICE_FOUND,
+    RM_SERVICE_FOUND, 
     RM_SERVICE_NOT_FOUND
 }
 impl RM_ERROR_CODES {
@@ -297,24 +301,24 @@ impl Default for RM_ERROR_CODES {
 }
 impl fmt::Display for RM_ERROR_CODES {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            RM_ERROR_CODES::RM_SERVICE_FOUND => write!(f, "RM_SERVICE_FOUND"),
-            RM_ERROR_CODES::RM_SERVICE_NOT_FOUND => write!(f, "RM_SERVICE_NOT_FOUND"),
-        }
+       match *self {
+           RM_ERROR_CODES::RM_SERVICE_FOUND => write!(f, "RM_SERVICE_FOUND"),
+           RM_ERROR_CODES::RM_SERVICE_NOT_FOUND => write!(f, "RM_SERVICE_NOT_FOUND"),
+       }
     }
 }
 
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
 pub enum IN_ERROR_CODES {
-    IN_REGISTRATION_OK,
-    IN_REGISTRATION_FAILED,
-    IN_DEREGISTRATION_OK,
-    IN_DEREGISTRATION_FAILED,
-    IN_NO_SOCKET_CONNECTION,
-    IN_SOCKET_CONNECTION_OK,
-    IN_NO_AVAILABLE_SERVICE,
-    IN_SERVICE_AVAILABLE,
-    IN_TARGET_SOCKET_GRANTED,
+    IN_REGISTRATION_OK, 
+    IN_REGISTRATION_FAILED, 
+    IN_DEREGISTRATION_OK, 
+    IN_DEREGISTRATION_FAILED, 
+    IN_NO_SOCKET_CONNECTION, 
+    IN_SOCKET_CONNECTION_OK, 
+    IN_NO_AVAILABLE_SERVICE, 
+    IN_SERVICE_AVAILABLE, 
+    IN_TARGET_SOCKET_GRANTED, 
     IN_TARGET_SOCKET_NOT_GRANTED
 }
 impl IN_ERROR_CODES {
@@ -327,18 +331,18 @@ impl Default for IN_ERROR_CODES {
 }
 impl fmt::Display for IN_ERROR_CODES {
     fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
-        match *self {
-            IN_ERROR_CODES::IN_REGISTRATION_OK => write!(f, "IN_REGISTRATION_OK"),
-            IN_ERROR_CODES::IN_REGISTRATION_FAILED => write!(f, "IN_REGISTRATION_FAILED"),
-            IN_ERROR_CODES::IN_DEREGISTRATION_OK => write!(f, "IN_DEREGISTRATION_OK"),
-            IN_ERROR_CODES::IN_DEREGISTRATION_FAILED => write!(f, "IN_DEREGISTRATION_FAILED"),
-            IN_ERROR_CODES::IN_NO_SOCKET_CONNECTION => write!(f, "IN_NO_SOCKET_CONNECTION"),
-            IN_ERROR_CODES::IN_SOCKET_CONNECTION_OK => write!(f, "IN_SOCKET_CONNECTION_OK"),
-            IN_ERROR_CODES::IN_NO_AVAILABLE_SERVICE => write!(f, "IN_NO_AVAILABLE_SERVICE"),
-            IN_ERROR_CODES::IN_SERVICE_AVAILABLE => write!(f, "IN_SERVICE_AVAILABLE"),
-            IN_ERROR_CODES::IN_TARGET_SOCKET_GRANTED => write!(f, "IN_TARGET_SOCKET_GRANTED"),
-            IN_ERROR_CODES::IN_TARGET_SOCKET_NOT_GRANTED => write!(f, "IN_TARGET_SOCKET_NOT_GRANTED"),
-        }
+       match *self {
+           IN_ERROR_CODES::IN_REGISTRATION_OK => write!(f, "IN_REGISTRATION_OK"),
+           IN_ERROR_CODES::IN_REGISTRATION_FAILED => write!(f, "IN_REGISTRATION_FAILED"),
+           IN_ERROR_CODES::IN_DEREGISTRATION_OK => write!(f, "IN_DEREGISTRATION_OK"),
+           IN_ERROR_CODES::IN_DEREGISTRATION_FAILED => write!(f, "IN_DEREGISTRATION_FAILED"),
+           IN_ERROR_CODES::IN_NO_SOCKET_CONNECTION => write!(f, "IN_NO_SOCKET_CONNECTION"),
+           IN_ERROR_CODES::IN_SOCKET_CONNECTION_OK => write!(f, "IN_SOCKET_CONNECTION_OK"),
+           IN_ERROR_CODES::IN_NO_AVAILABLE_SERVICE => write!(f, "IN_NO_AVAILABLE_SERVICE"),
+           IN_ERROR_CODES::IN_SERVICE_AVAILABLE => write!(f, "IN_SERVICE_AVAILABLE"),
+           IN_ERROR_CODES::IN_TARGET_SOCKET_GRANTED => write!(f, "IN_TARGET_SOCKET_GRANTED"),
+           IN_ERROR_CODES::IN_TARGET_SOCKET_NOT_GRANTED => write!(f, "IN_TARGET_SOCKET_NOT_GRANTED"),
+       }
     }
 }
 
@@ -397,6 +401,30 @@ pub struct nota_v2 {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_svc_register: Option<BSet<SERVICE>>,}
 
+impl fmt::Display for nota_v2 {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "nota_v2: (".to_owned();
+        result += &format!("_get_interconnectNodes: {}, ", self._get_interconnectNodes());
+        result += &format!("_get_sockets: {}, ", self._get_sockets());
+        result += &format!("_get_services: {}, ", self._get_services());
+        result += &format!("_get_resourceManagers: {}, ", self._get_resourceManagers());
+        result += &format!("_get_sids: {}, ", self._get_sids());
+        result += &format!("_get_rm_services: {}, ", self._get_rm_services());
+        result += &format!("_get_rm_sids: {}, ", self._get_rm_sids());
+        result += &format!("_get_in_localServices: {}, ", self._get_in_localServices());
+        result += &format!("_get_in_sockets: {}, ", self._get_in_sockets());
+        result += &format!("_get_in_resourceManager: {}, ", self._get_in_resourceManager());
+        result += &format!("_get_soc_to: {}, ", self._get_soc_to());
+        result += &format!("_get_soc_from: {}, ", self._get_soc_from());
+        result += &format!("_get_svc_serviceID: {}, ", self._get_svc_serviceID());
+        result += &format!("_get_svc_sockets: {}, ", self._get_svc_sockets());
+        result += &format!("_get_svc_ICNode: {}, ", self._get_svc_ICNode());
+        result += &format!("_get_svc_registered: {}, ", self._get_svc_registered());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl nota_v2 {
 
     pub fn new() -> nota_v2 {
@@ -431,95 +459,95 @@ impl nota_v2 {
         self.svc_registered = BRelation::new(vec![]).clone().clone();
     }
 
-    pub fn get_interconnectNodes(&self) -> BSet<INTERCONNECTNODE> {
+    pub fn _get_interconnectNodes(&self) -> BSet<INTERCONNECTNODE> {
         return self.interconnectNodes.clone();
     }
 
-    pub fn get_sockets(&self) -> BSet<SOCKET> {
+    pub fn _get_sockets(&self) -> BSet<SOCKET> {
         return self.sockets.clone();
     }
 
-    pub fn get_services(&self) -> BSet<SERVICE> {
+    pub fn _get_services(&self) -> BSet<SERVICE> {
         return self.services.clone();
     }
 
-    pub fn get_resourceManagers(&self) -> BSet<RESOURCEMANAGER> {
+    pub fn _get_resourceManagers(&self) -> BSet<RESOURCEMANAGER> {
         return self.resourceManagers.clone();
     }
 
-    pub fn get_sids(&self) -> BSet<SID> {
+    pub fn _get_sids(&self) -> BSet<SID> {
         return self.sids.clone();
     }
 
-    pub fn get_rm_services(&self) -> BRelation<RESOURCEMANAGER, BSet<SERVICE>> {
+    pub fn _get_rm_services(&self) -> BRelation<RESOURCEMANAGER, BSet<SERVICE>> {
         return self.rm_services.clone();
     }
 
-    pub fn get_rm_sids(&self) -> BRelation<SERVICE, SID> {
+    pub fn _get_rm_sids(&self) -> BRelation<SERVICE, SID> {
         return self.rm_sids.clone();
     }
 
-    pub fn get_in_localServices(&self) -> BRelation<SID, INTERCONNECTNODE> {
+    pub fn _get_in_localServices(&self) -> BRelation<SID, INTERCONNECTNODE> {
         return self.in_localServices.clone();
     }
 
-    pub fn get_in_sockets(&self) -> BRelation<SOCKET, INTERCONNECTNODE> {
+    pub fn _get_in_sockets(&self) -> BRelation<SOCKET, INTERCONNECTNODE> {
         return self.in_sockets.clone();
     }
 
-    pub fn get_in_resourceManager(&self) -> BRelation<INTERCONNECTNODE, BSet<RESOURCEMANAGER>> {
+    pub fn _get_in_resourceManager(&self) -> BRelation<INTERCONNECTNODE, BSet<RESOURCEMANAGER>> {
         return self.in_resourceManager.clone();
     }
 
-    pub fn get_soc_to(&self) -> BRelation<SOCKET, SID> {
+    pub fn _get_soc_to(&self) -> BRelation<SOCKET, SID> {
         return self.soc_to.clone();
     }
 
-    pub fn get_soc_from(&self) -> BRelation<SOCKET, SID> {
+    pub fn _get_soc_from(&self) -> BRelation<SOCKET, SID> {
         return self.soc_from.clone();
     }
 
-    pub fn get_svc_serviceID(&self) -> BRelation<SERVICE, SID> {
+    pub fn _get_svc_serviceID(&self) -> BRelation<SERVICE, SID> {
         return self.svc_serviceID.clone();
     }
 
-    pub fn get_svc_sockets(&self) -> BRelation<SERVICE, BSet<SOCKET>> {
+    pub fn _get_svc_sockets(&self) -> BRelation<SERVICE, BSet<SOCKET>> {
         return self.svc_sockets.clone();
     }
 
-    pub fn get_svc_ICNode(&self) -> BRelation<SERVICE, INTERCONNECTNODE> {
+    pub fn _get_svc_ICNode(&self) -> BRelation<SERVICE, INTERCONNECTNODE> {
         return self.svc_ICNode.clone();
     }
 
-    pub fn get_svc_registered(&self) -> BRelation<SERVICE, BBoolean> {
+    pub fn _get_svc_registered(&self) -> BRelation<SERVICE, BBoolean> {
         return self.svc_registered.clone();
     }
 
-    pub fn get__INTERCONNECTNODE(&self) -> BSet<INTERCONNECTNODE> {
+    pub fn _get__INTERCONNECTNODE(&self) -> BSet<INTERCONNECTNODE> {
         return self._INTERCONNECTNODE.clone();
     }
 
-    pub fn get__SOCKET(&self) -> BSet<SOCKET> {
+    pub fn _get__SOCKET(&self) -> BSet<SOCKET> {
         return self._SOCKET.clone();
     }
 
-    pub fn get__SERVICE(&self) -> BSet<SERVICE> {
+    pub fn _get__SERVICE(&self) -> BSet<SERVICE> {
         return self._SERVICE.clone();
     }
 
-    pub fn get__RESOURCEMANAGER(&self) -> BSet<RESOURCEMANAGER> {
+    pub fn _get__RESOURCEMANAGER(&self) -> BSet<RESOURCEMANAGER> {
         return self._RESOURCEMANAGER.clone();
     }
 
-    pub fn get__SID(&self) -> BSet<SID> {
+    pub fn _get__SID(&self) -> BSet<SID> {
         return self._SID.clone();
     }
 
-    pub fn get__RM_ERROR_CODES(&self) -> BSet<RM_ERROR_CODES> {
+    pub fn _get__RM_ERROR_CODES(&self) -> BSet<RM_ERROR_CODES> {
         return self._RM_ERROR_CODES.clone();
     }
 
-    pub fn get__IN_ERROR_CODES(&self) -> BSet<IN_ERROR_CODES> {
+    pub fn _get__IN_ERROR_CODES(&self) -> BSet<IN_ERROR_CODES> {
         return self._IN_ERROR_CODES.clone();
     }
 
@@ -671,6 +699,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_constructor_interconnectNode.is_none() {
             let mut _ic_set_0: BSet<INTERCONNECTNODE> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_newic_1 in self._INTERCONNECTNODE.difference(&self.interconnectNodes).clone().iter().cloned() {
                 _ic_set_0 = _ic_set_0._union(&BSet::new(vec![_ic_newic_1]));
 
@@ -686,8 +715,9 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_constructor_resourceManager.is_none() {
             let mut _ic_set_1: BSet<RESOURCEMANAGER> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_newrm_1 in self._RESOURCEMANAGER.difference(&self.resourceManagers).clone().iter().cloned() {
-                if (self.rm_services.domain().notElementOf(&_ic_newrm_1).and(&self.resourceManagers.equal(&BSet::new(vec![])))).booleanValue() {
+                if ((self.rm_services.domain().notElementOf(&_ic_newrm_1) && self.resourceManagers.equal(&BSet::new(vec![])))).booleanValue() {
                     _ic_set_1 = _ic_set_1._union(&BSet::new(vec![_ic_newrm_1]));
                 }
 
@@ -703,6 +733,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_constructor_service.is_none() {
             let mut _ic_set_2: BSet<BTuple<INTERCONNECTNODE, SERVICE>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() {
                 for _ic_newsvc_1 in self._SERVICE.difference(&self.services).clone().iter().cloned() {
                     _ic_set_2 = _ic_set_2._union(&BSet::new(vec![BTuple::from_refs(&_ic_ii_1, &_ic_newsvc_1)]));
@@ -720,6 +751,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_constructor_socket.is_none() {
             let mut _ic_set_3: BSet<BTuple<BTuple<BTuple<INTERCONNECTNODE, SID>, SID>, SOCKET>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() {
                 for _ic_srcsid_1 in self.sids.clone().iter().cloned() {
                     for _ic_targsid_1 in self.sids.clone().iter().cloned() {
@@ -741,6 +773,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_rm_register.is_none() {
             let mut _ic_set_4: BSet<BTuple<BTuple<RESOURCEMANAGER, SERVICE>, INTERCONNECTNODE>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.resourceManagers.clone().iter().cloned() {
                 for _ic_ss_1 in self.services.clone().iter().cloned() {
                     for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() {
@@ -760,6 +793,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_rm_deregister.is_none() {
             let mut _ic_set_5: BSet<BTuple<BTuple<RESOURCEMANAGER, SERVICE>, INTERCONNECTNODE>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.resourceManagers.clone().iter().cloned() {
                 for _ic_ss_1 in self.services.clone().iter().cloned() {
                     for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() {
@@ -779,6 +813,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_rm_getSid.is_none() {
             let mut _ic_set_6: BSet<BTuple<RESOURCEMANAGER, SERVICE>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.resourceManagers.clone().iter().cloned() {
                 for _ic_ss_1 in self.services.clone().iter().cloned() {
                     if (self.rm_sids.domain().elementOf(&_ic_ss_1)).booleanValue() {
@@ -798,6 +833,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_rm_getSid_Not_Found.is_none() {
             let mut _ic_set_7: BSet<BTuple<RESOURCEMANAGER, SERVICE>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.resourceManagers.clone().iter().cloned() {
                 for _ic_ss_1 in self.services.clone().iter().cloned() {
                     _ic_set_7 = _ic_set_7._union(&BSet::new(vec![BTuple::from_refs(&_ic_self_1, &_ic_ss_1)]));
@@ -815,6 +851,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_in_announceResourceManager.is_none() {
             let mut _ic_set_8: BSet<BTuple<INTERCONNECTNODE, RESOURCEMANAGER>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() {
                 for _ic_rm_1 in self.resourceManagers.clone().iter().cloned() {
                     if (self.in_resourceManager.functionCall(&_ic_self_1).equal(&BSet::new(vec![]))).booleanValue() {
@@ -834,6 +871,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_in_register_success.is_none() {
             let mut _ic_set_9: BSet<BTuple<BTuple<INTERCONNECTNODE, SERVICE>, SID>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() {
                 for _ic_ss_1 in self.services.clone().iter().cloned() {
                     for _ic_si_1 in self._SID.difference(&self.sids).clone().iter().cloned() {
@@ -855,6 +893,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_in_register_failed.is_none() {
             let mut _ic_set_10: BSet<BTuple<INTERCONNECTNODE, SERVICE>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() {
                 for _ic_ss_1 in self.services.clone().iter().cloned() {
                     _ic_set_10 = _ic_set_10._union(&BSet::new(vec![BTuple::from_refs(&_ic_self_1, &_ic_ss_1)]));
@@ -872,13 +911,14 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_in_requestTargetSocket_Granted.is_none() {
             let mut _ic_set_11: BSet<BTuple<BTuple<BTuple<BTuple<BTuple<INTERCONNECTNODE, INTERCONNECTNODE>, SOCKET>, SID>, SID>, SOCKET>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() {
                 for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() {
                     for _ic_srcsoc_1 in self.sockets.clone().iter().cloned() {
                         for _ic_srcsid_1 in self.sids.clone().iter().cloned() {
                             for _ic_targsid_1 in self.sids.clone().iter().cloned() {
                                 for _ic_newsoc_1 in self._SOCKET.difference(&self.sockets).clone().iter().cloned() {
-                                    if (_ic_self_1.unequal(&_ic_ii_1).and(&self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1))).booleanValue() {
+                                    if ((_ic_self_1.unequal(&_ic_ii_1) && self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1))).booleanValue() {
                                         _ic_set_11 = _ic_set_11._union(&BSet::new(vec![BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&_ic_self_1, &_ic_ii_1), &_ic_srcsoc_1), &_ic_srcsid_1), &_ic_targsid_1), &_ic_newsoc_1)]));
                                     }
 
@@ -899,12 +939,13 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_in_requestTargetSocket_NotGranted.is_none() {
             let mut _ic_set_12: BSet<BTuple<BTuple<BTuple<BTuple<INTERCONNECTNODE, INTERCONNECTNODE>, SOCKET>, SID>, SID>> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.interconnectNodes.clone().iter().cloned() {
                 for _ic_ii_1 in self.interconnectNodes.clone().iter().cloned() {
                     for _ic_srcsoc_1 in self.sockets.clone().iter().cloned() {
                         for _ic_srcsid_1 in self.sids.clone().iter().cloned() {
                             for _ic_targsid_1 in self.sids.clone().iter().cloned() {
-                                if (_ic_self_1.unequal(&_ic_ii_1).and(&self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1))).booleanValue() {
+                                if ((_ic_self_1.unequal(&_ic_ii_1) && self.in_sockets.functionCall(&_ic_srcsoc_1).equal(&_ic_ii_1))).booleanValue() {
                                     _ic_set_12 = _ic_set_12._union(&BSet::new(vec![BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&BTuple::from_refs(&_ic_self_1, &_ic_ii_1), &_ic_srcsoc_1), &_ic_srcsid_1), &_ic_targsid_1)]));
                                 }
 
@@ -924,6 +965,7 @@ impl nota_v2 {
         //transition
         if !is_caching || self._tr_cache_svc_register.is_none() {
             let mut _ic_set_13: BSet<SERVICE> = BSet::new(vec![]);
+            //transition, parameters, no condidtion
             for _ic_self_1 in self.services.clone().iter().cloned() {
                 if (self.svc_registered.functionCall(&_ic_self_1).equal(&BBoolean::new(false))).booleanValue() {
                     _ic_set_13 = _ic_set_13._union(&BSet::new(vec![_ic_self_1]));
@@ -969,6 +1011,7 @@ impl nota_v2 {
 
     pub fn _check_inv_7(&self) -> bool {
         //invariant
+        //quantified_predicate
         let mut _ic_boolean_14 = BBoolean::new(true);
         for _ic_a1_1 in self.rm_services.domain().clone().iter().cloned() {
             for _ic_a2_1 in self.rm_services.domain().clone().iter().cloned() {
@@ -979,6 +1022,7 @@ impl nota_v2 {
 
             }
         }
+
         return _ic_boolean_14.booleanValue();
     }
 
@@ -1037,11 +1081,10 @@ impl nota_v2 {
         return self.resourceManagers.equal(&BSet::new(vec![])).not().implies(&self.resourceManagers.card().equal(&BInteger::new(1))).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_constructor_interconnectNode" => {self._tr_constructor_interconnectNode(false);},
                 "_tr_constructor_resourceManager" => {self._tr_constructor_resourceManager(false);},
                 "_tr_constructor_service" => {self._tr_constructor_service(false);},
@@ -1064,853 +1107,396 @@ impl nota_v2 {
     //model_check_next_states
     fn generateNextStates(state: &mut nota_v2,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<nota_v2, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_guard_m: Arc<Mutex<HashMap<nota_v2, HashSet<&str>>>>,
-                          guardCache: Arc<Mutex<HashMap<nota_v2, PersistentHashMap<&str, bool>>>>,
-                          parents_m: Arc<Mutex<HashMap<nota_v2, nota_v2>>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<nota_v2> {
-        let mut result = HashSet::<nota_v2>::new();
-        if isCaching {
-            let mut parents_guard_o = parents_m.lock().unwrap().get(state).and_then(|p| guardCache.lock().unwrap().get(p).cloned());
-            let mut newCache = if parents_guard_o.is_none() { PersistentHashMap::new() } else { parents_guard_o.as_ref().unwrap().clone() };
-            //model_check_transition
-            let mut _trid_1 = state._tr_constructor_interconnectNode(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.constructor_interconnectNode(_tmp_1);
-                match guard_dependency.get("constructor_interconnectNode") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("constructor_interconnectNode").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("constructor_interconnectNode").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_constructor_resourceManager(isCaching);
-            for param in _trid_2.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.constructor_resourceManager(_tmp_1);
-                match guard_dependency.get("constructor_resourceManager") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("constructor_resourceManager").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("constructor_resourceManager").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_constructor_service(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.constructor_service(_tmp_2, _tmp_1);
-                match guard_dependency.get("constructor_service") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("constructor_service").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("constructor_service").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_constructor_socket(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_5 = _tmp_4.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_6 = _tmp_4.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.constructor_socket(_tmp_6, _tmp_5, _tmp_3, _tmp_1);
-                match guard_dependency.get("constructor_socket") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("constructor_socket").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("constructor_socket").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_5 = state._tr_rm_register(isCaching);
-            for param in _trid_5.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.rm_register(_tmp_4, _tmp_3, _tmp_1);
-                match guard_dependency.get("rm_register") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("rm_register").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("rm_register").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_rm_deregister(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.rm_deregister(_tmp_4, _tmp_3, _tmp_1);
-                match guard_dependency.get("rm_deregister") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("rm_deregister").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("rm_deregister").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_7 = state._tr_rm_getSid(isCaching);
-            for param in _trid_7.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.rm_getSid(_tmp_2, _tmp_1);
-                match guard_dependency.get("rm_getSid") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("rm_getSid").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("rm_getSid").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_8 = state._tr_rm_getSid_Not_Found(isCaching);
-            for param in _trid_8.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.rm_getSid_Not_Found(_tmp_2, _tmp_1);
-                match guard_dependency.get("rm_getSid_Not_Found") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("rm_getSid_Not_Found").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("rm_getSid_Not_Found").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_9 = state._tr_in_announceResourceManager(isCaching);
-            for param in _trid_9.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_announceResourceManager(_tmp_2, _tmp_1);
-                match guard_dependency.get("in_announceResourceManager") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("in_announceResourceManager").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_announceResourceManager").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_10 = state._tr_in_register_success(isCaching);
-            for param in _trid_10.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_register_success(_tmp_4, _tmp_3, _tmp_1);
-                match guard_dependency.get("in_register_success") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("in_register_success").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_register_success").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_11 = state._tr_in_register_failed(isCaching);
-            for param in _trid_11.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_register_failed(_tmp_2, _tmp_1);
-                match guard_dependency.get("in_register_failed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("in_register_failed").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_register_failed").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_12 = state._tr_in_requestTargetSocket_Granted(isCaching);
-            for param in _trid_12.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_5 = _tmp_4.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_6 = _tmp_4.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_7 = _tmp_6.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_8 = _tmp_6.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_9 = _tmp_8.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_10 = _tmp_8.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_requestTargetSocket_Granted(_tmp_10, _tmp_9, _tmp_7, _tmp_5, _tmp_3, _tmp_1);
-                match guard_dependency.get("in_requestTargetSocket_Granted") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("in_requestTargetSocket_Granted").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_requestTargetSocket_Granted").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_13 = state._tr_in_requestTargetSocket_NotGranted(isCaching);
-            for param in _trid_13.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_5 = _tmp_4.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_6 = _tmp_4.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_7 = _tmp_6.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_8 = _tmp_6.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_requestTargetSocket_NotGranted(_tmp_8, _tmp_7, _tmp_5, _tmp_3, _tmp_1);
-                match guard_dependency.get("in_requestTargetSocket_NotGranted") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("in_requestTargetSocket_NotGranted").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("in_requestTargetSocket_NotGranted").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_14 = state._tr_svc_register(isCaching);
-            for param in _trid_14.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.svc_register(_tmp_1);
-                match guard_dependency.get("svc_register") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-                    let mut dependent_guard = dependent_guard_m.lock().unwrap();
-                    let mut parents = parents_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("svc_register").unwrap().clone());
-                    }
-                    if !dependent_guard.contains_key(&copiedState) {
-                        dependent_guard.insert(copiedState.clone(), guard_dependency.get("svc_register").unwrap().clone());
-                    }
-                    if !parents.contains_key(&copiedState) {
-                        parents.insert(copiedState.clone(), state.clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
+                          transitions: Arc<AtomicU64>) -> HashSet<(nota_v2, &'static str)> {
+        let mut result = HashSet::<(nota_v2, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        let mut _trid_1 = state._tr_constructor_interconnectNode(isCaching);
+        for param in _trid_1.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.constructor_interconnectNode(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("constructor_interconnectNode")); }
+            result.insert((copiedState, "constructor_interconnectNode"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_2 = state._tr_constructor_resourceManager(isCaching);
+        for param in _trid_2.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.constructor_resourceManager(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("constructor_resourceManager")); }
+            result.insert((copiedState, "constructor_resourceManager"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_3 = state._tr_constructor_service(isCaching);
+        for param in _trid_3.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.constructor_service(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("constructor_service")); }
+            result.insert((copiedState, "constructor_service"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_4 = state._tr_constructor_socket(isCaching);
+        for param in _trid_4.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_3 = _tmp_2.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_4 = _tmp_2.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_5 = _tmp_4.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_6 = _tmp_4.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.constructor_socket(_tmp_6, _tmp_5, _tmp_3, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("constructor_socket")); }
+            result.insert((copiedState, "constructor_socket"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_5 = state._tr_rm_register(isCaching);
+        for param in _trid_5.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_3 = _tmp_2.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_4 = _tmp_2.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.rm_register(_tmp_4, _tmp_3, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("rm_register")); }
+            result.insert((copiedState, "rm_register"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_6 = state._tr_rm_deregister(isCaching);
+        for param in _trid_6.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_3 = _tmp_2.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_4 = _tmp_2.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.rm_deregister(_tmp_4, _tmp_3, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("rm_deregister")); }
+            result.insert((copiedState, "rm_deregister"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_7 = state._tr_rm_getSid(isCaching);
+        for param in _trid_7.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.rm_getSid(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("rm_getSid")); }
+            result.insert((copiedState, "rm_getSid"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_8 = state._tr_rm_getSid_Not_Found(isCaching);
+        for param in _trid_8.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.rm_getSid_Not_Found(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("rm_getSid_Not_Found")); }
+            result.insert((copiedState, "rm_getSid_Not_Found"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_9 = state._tr_in_announceResourceManager(isCaching);
+        for param in _trid_9.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.in_announceResourceManager(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_announceResourceManager")); }
+            result.insert((copiedState, "in_announceResourceManager"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_10 = state._tr_in_register_success(isCaching);
+        for param in _trid_10.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_3 = _tmp_2.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_4 = _tmp_2.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.in_register_success(_tmp_4, _tmp_3, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_register_success")); }
+            result.insert((copiedState, "in_register_success"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_11 = state._tr_in_register_failed(isCaching);
+        for param in _trid_11.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.in_register_failed(_tmp_2, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_register_failed")); }
+            result.insert((copiedState, "in_register_failed"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_12 = state._tr_in_requestTargetSocket_Granted(isCaching);
+        for param in _trid_12.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_3 = _tmp_2.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_4 = _tmp_2.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_5 = _tmp_4.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_6 = _tmp_4.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_7 = _tmp_6.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_8 = _tmp_6.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_9 = _tmp_8.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_10 = _tmp_8.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.in_requestTargetSocket_Granted(_tmp_10, _tmp_9, _tmp_7, _tmp_5, _tmp_3, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_requestTargetSocket_Granted")); }
+            result.insert((copiedState, "in_requestTargetSocket_Granted"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_13 = state._tr_in_requestTargetSocket_NotGranted(isCaching);
+        for param in _trid_13.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_2 = param.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_3 = _tmp_2.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_4 = _tmp_2.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_5 = _tmp_4.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_6 = _tmp_4.projection1();
+            //model_check_transition_param_assignment
+            let mut _tmp_7 = _tmp_6.projection2();
+            //model_check_transition_param_assignment
+            let mut _tmp_8 = _tmp_6.projection1();
+
+            let mut copiedState = state.clone();
+            copiedState.in_requestTargetSocket_NotGranted(_tmp_8, _tmp_7, _tmp_5, _tmp_3, _tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("in_requestTargetSocket_NotGranted")); }
+            result.insert((copiedState, "in_requestTargetSocket_NotGranted"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        let mut _trid_14 = state._tr_svc_register(isCaching);
+        for param in _trid_14.iter().cloned() {
+            //model_check_transition_body
+            //model_check_transition_param_assignment
+            let mut _tmp_1 = param;
+
+            let mut copiedState = state.clone();
+            copiedState.svc_register(_tmp_1);
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("svc_register")); }
+            result.insert((copiedState, "svc_register"));
+            evaluated_transitions += 1;
+        }
 
-            guardCache.lock().unwrap().insert(state.clone(), newCache);
-        } else {
-            //model_check_transition
-            let mut _trid_1 = state._tr_constructor_interconnectNode(isCaching);
-            for param in _trid_1.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.constructor_interconnectNode(_tmp_1);
-                match guard_dependency.get("constructor_interconnectNode") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_constructor_resourceManager(isCaching);
-            for param in _trid_2.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.constructor_resourceManager(_tmp_1);
-                match guard_dependency.get("constructor_resourceManager") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_constructor_service(isCaching);
-            for param in _trid_3.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.constructor_service(_tmp_2, _tmp_1);
-                match guard_dependency.get("constructor_service") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_constructor_socket(isCaching);
-            for param in _trid_4.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_5 = _tmp_4.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_6 = _tmp_4.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.constructor_socket(_tmp_6, _tmp_5, _tmp_3, _tmp_1);
-                match guard_dependency.get("constructor_socket") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_5 = state._tr_rm_register(isCaching);
-            for param in _trid_5.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.rm_register(_tmp_4, _tmp_3, _tmp_1);
-                match guard_dependency.get("rm_register") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_6 = state._tr_rm_deregister(isCaching);
-            for param in _trid_6.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.rm_deregister(_tmp_4, _tmp_3, _tmp_1);
-                match guard_dependency.get("rm_deregister") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_7 = state._tr_rm_getSid(isCaching);
-            for param in _trid_7.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.rm_getSid(_tmp_2, _tmp_1);
-                match guard_dependency.get("rm_getSid") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_8 = state._tr_rm_getSid_Not_Found(isCaching);
-            for param in _trid_8.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.rm_getSid_Not_Found(_tmp_2, _tmp_1);
-                match guard_dependency.get("rm_getSid_Not_Found") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_9 = state._tr_in_announceResourceManager(isCaching);
-            for param in _trid_9.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_announceResourceManager(_tmp_2, _tmp_1);
-                match guard_dependency.get("in_announceResourceManager") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_10 = state._tr_in_register_success(isCaching);
-            for param in _trid_10.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_register_success(_tmp_4, _tmp_3, _tmp_1);
-                match guard_dependency.get("in_register_success") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_11 = state._tr_in_register_failed(isCaching);
-            for param in _trid_11.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_register_failed(_tmp_2, _tmp_1);
-                match guard_dependency.get("in_register_failed") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_12 = state._tr_in_requestTargetSocket_Granted(isCaching);
-            for param in _trid_12.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_5 = _tmp_4.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_6 = _tmp_4.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_7 = _tmp_6.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_8 = _tmp_6.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_9 = _tmp_8.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_10 = _tmp_8.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_requestTargetSocket_Granted(_tmp_10, _tmp_9, _tmp_7, _tmp_5, _tmp_3, _tmp_1);
-                match guard_dependency.get("in_requestTargetSocket_Granted") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_13 = state._tr_in_requestTargetSocket_NotGranted(isCaching);
-            for param in _trid_13.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_2 = param.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_3 = _tmp_2.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_4 = _tmp_2.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_5 = _tmp_4.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_6 = _tmp_4.projection1();
-                //model_check_transition_param_assignment
-                let mut _tmp_7 = _tmp_6.projection2();
-                //model_check_transition_param_assignment
-                let mut _tmp_8 = _tmp_6.projection1();
-
-                let mut copiedState = state.clone();
-                copiedState.in_requestTargetSocket_NotGranted(_tmp_8, _tmp_7, _tmp_5, _tmp_3, _tmp_1);
-                match guard_dependency.get("in_requestTargetSocket_NotGranted") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_14 = state._tr_svc_register(isCaching);
-            for param in _trid_14.iter().cloned() {
-                //model_check_transition_body
-                //model_check_transition_param_assignment
-                let mut _tmp_1 = param;
-
-                let mut copiedState = state.clone();
-                copiedState.svc_register(_tmp_1);
-                match guard_dependency.get("svc_register") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
 
-        }
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &nota_v2,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<nota_v2, HashSet<&str>>>> ) -> bool {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &nota_v2, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_2") {
+            if dependent_invariants_of_state.contains(&"_check_inv_2") {
                 if !state._check_inv_2() {
+                    println!("_check_inv_2 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_3") {
+            if dependent_invariants_of_state.contains(&"_check_inv_3") {
                 if !state._check_inv_3() {
+                    println!("_check_inv_3 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_4") {
+            if dependent_invariants_of_state.contains(&"_check_inv_4") {
                 if !state._check_inv_4() {
+                    println!("_check_inv_4 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_5") {
+            if dependent_invariants_of_state.contains(&"_check_inv_5") {
                 if !state._check_inv_5() {
+                    println!("_check_inv_5 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_6") {
+            if dependent_invariants_of_state.contains(&"_check_inv_6") {
                 if !state._check_inv_6() {
+                    println!("_check_inv_6 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_7") {
+            if dependent_invariants_of_state.contains(&"_check_inv_7") {
                 if !state._check_inv_7() {
+                    println!("_check_inv_7 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_8") {
+            if dependent_invariants_of_state.contains(&"_check_inv_8") {
                 if !state._check_inv_8() {
+                    println!("_check_inv_8 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_9") {
+            if dependent_invariants_of_state.contains(&"_check_inv_9") {
                 if !state._check_inv_9() {
+                    println!("_check_inv_9 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_10") {
+            if dependent_invariants_of_state.contains(&"_check_inv_10") {
                 if !state._check_inv_10() {
+                    println!("_check_inv_10 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_11") {
+            if dependent_invariants_of_state.contains(&"_check_inv_11") {
                 if !state._check_inv_11() {
+                    println!("_check_inv_11 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_12") {
+            if dependent_invariants_of_state.contains(&"_check_inv_12") {
                 if !state._check_inv_12() {
+                    println!("_check_inv_12 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_13") {
+            if dependent_invariants_of_state.contains(&"_check_inv_13") {
                 if !state._check_inv_13() {
+                    println!("_check_inv_13 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_14") {
+            if dependent_invariants_of_state.contains(&"_check_inv_14") {
                 if !state._check_inv_14() {
+                    println!("_check_inv_14 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_15") {
+            if dependent_invariants_of_state.contains(&"_check_inv_15") {
                 if !state._check_inv_15() {
+                    println!("_check_inv_15 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_16") {
+            if dependent_invariants_of_state.contains(&"_check_inv_16") {
                 if !state._check_inv_16() {
+                    println!("_check_inv_16 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_17") {
+            if dependent_invariants_of_state.contains(&"_check_inv_17") {
                 if !state._check_inv_17() {
+                    println!("_check_inv_17 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_18") {
+            if dependent_invariants_of_state.contains(&"_check_inv_18") {
                 if !state._check_inv_18() {
+                    println!("_check_inv_18 failed!");
                     return false;
                 }
             }
@@ -1920,16 +1506,14 @@ impl nota_v2 {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<nota_v2>>>, mc_type: MC_TYPE) -> nota_v2 {
+    fn next(collection_m: Arc<Mutex<LinkedList<(nota_v2, &'static str)>>>, mc_type: MC_TYPE) -> (nota_v2, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -1938,124 +1522,112 @@ impl nota_v2 {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = nota_v2::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() {
-            invariant_violated.store(true, Ordering::Release);
-        }
-
-        let mut states = HashSet::<nota_v2>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<nota_v2>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<nota_v2, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<nota_v2, HashSet<&str>>::new()));
-        let mut guard_cache = Arc::new(Mutex::new(HashMap::<nota_v2, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<nota_v2, nota_v2>::new()));
-
-        if is_caching {
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            invariantDependency.insert("in_register_success", HashSet::from(["_check_inv_5", "_check_inv_14", "_check_inv_13", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
+            "in_register_success" => vec!["_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"],
             //model_check_init_static
-            invariantDependency.insert("in_announceResourceManager", HashSet::from(["_check_inv_11"]));
+            "in_announceResourceManager" => vec!["_tr_in_announceResourceManager"],
             //model_check_init_static
-            invariantDependency.insert("in_requestTargetSocket_Granted", HashSet::from(["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"]));
+            "in_requestTargetSocket_Granted" => vec!["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"],
             //model_check_init_static
-            invariantDependency.insert("constructor_service", HashSet::from(["_check_inv_17", "_check_inv_16", "_check_inv_15", "_check_inv_3", "_check_inv_6", "_check_inv_14", "_check_inv_8"]));
+            "constructor_service" => vec!["_tr_constructor_service", "_tr_rm_getSid", "_tr_in_register_success", "_tr_svc_register", "_tr_in_register_failed", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister"],
             //model_check_init_static
-            invariantDependency.insert("constructor_socket", HashSet::from(["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"]));
+            "constructor_socket" => vec!["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"],
             //model_check_init_static
-            invariantDependency.insert("in_requestTargetSocket_NotGranted", HashSet::from([]));
+            "in_requestTargetSocket_NotGranted" => vec![],
             //model_check_init_static
-            invariantDependency.insert("constructor_interconnectNode", HashSet::from(["_check_inv_16", "_check_inv_1", "_check_inv_10", "_check_inv_9", "_check_inv_11"]));
+            "constructor_interconnectNode" => vec!["_tr_constructor_service", "_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_register_failed", "_tr_rm_register", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket", "_tr_rm_deregister", "_tr_constructor_interconnectNode", "_tr_in_announceResourceManager"],
             //model_check_init_static
-            invariantDependency.insert("rm_getSid", HashSet::from([]));
+            "rm_getSid" => vec![],
             //model_check_init_static
-            invariantDependency.insert("rm_deregister", HashSet::from([]));
+            "rm_deregister" => vec![],
             //model_check_init_static
-            invariantDependency.insert("constructor_resourceManager", HashSet::from(["_check_inv_18", "_check_inv_6", "_check_inv_7", "_check_inv_4", "_check_inv_11"]));
+            "constructor_resourceManager" => vec!["_tr_rm_getSid", "_tr_constructor_resourceManager", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister", "_tr_in_announceResourceManager"],
             //model_check_init_static
-            invariantDependency.insert("in_register_failed", HashSet::from([]));
+            "in_register_failed" => vec![],
             //model_check_init_static
-            invariantDependency.insert("rm_register", HashSet::from([]));
+            "rm_register" => vec![],
             //model_check_init_static
-            invariantDependency.insert("rm_getSid_Not_Found", HashSet::from([]));
+            "rm_getSid_Not_Found" => vec![],
             //model_check_init_static
-            invariantDependency.insert("svc_register", HashSet::from(["_check_inv_17"]));
+            "svc_register" => vec!["_tr_svc_register"],
+            _ => vec![],
+        }
+    }
+
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            guardDependency.insert("in_register_success", HashSet::from(["_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"]));
+            "in_register_success" => vec!["_check_inv_5", "_check_inv_14", "_check_inv_13", "_check_inv_8", "_check_inv_12", "_check_inv_9"],
             //model_check_init_static
-            guardDependency.insert("in_announceResourceManager", HashSet::from(["_tr_in_announceResourceManager"]));
+            "in_announceResourceManager" => vec!["_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("in_requestTargetSocket_Granted", HashSet::from(["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"]));
+            "in_requestTargetSocket_Granted" => vec!["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"],
             //model_check_init_static
-            guardDependency.insert("constructor_service", HashSet::from(["_tr_constructor_service", "_tr_rm_getSid", "_tr_in_register_success", "_tr_svc_register", "_tr_in_register_failed", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister"]));
+            "constructor_service" => vec!["_check_inv_17", "_check_inv_16", "_check_inv_15", "_check_inv_3", "_check_inv_6", "_check_inv_14", "_check_inv_8"],
             //model_check_init_static
-            guardDependency.insert("constructor_socket", HashSet::from(["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"]));
+            "constructor_socket" => vec!["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"],
             //model_check_init_static
-            guardDependency.insert("in_requestTargetSocket_NotGranted", HashSet::from([]));
+            "in_requestTargetSocket_NotGranted" => vec![],
             //model_check_init_static
-            guardDependency.insert("constructor_interconnectNode", HashSet::from(["_tr_constructor_service", "_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_register_failed", "_tr_rm_register", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket", "_tr_rm_deregister", "_tr_constructor_interconnectNode", "_tr_in_announceResourceManager"]));
+            "constructor_interconnectNode" => vec!["_check_inv_16", "_check_inv_1", "_check_inv_10", "_check_inv_9", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("rm_getSid", HashSet::from([]));
+            "rm_getSid" => vec![],
             //model_check_init_static
-            guardDependency.insert("rm_deregister", HashSet::from([]));
+            "rm_deregister" => vec![],
             //model_check_init_static
-            guardDependency.insert("constructor_resourceManager", HashSet::from(["_tr_rm_getSid", "_tr_constructor_resourceManager", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister", "_tr_in_announceResourceManager"]));
+            "constructor_resourceManager" => vec!["_check_inv_18", "_check_inv_6", "_check_inv_7", "_check_inv_4", "_check_inv_11"],
             //model_check_init_static
-            guardDependency.insert("in_register_failed", HashSet::from([]));
+            "in_register_failed" => vec![],
             //model_check_init_static
-            guardDependency.insert("rm_register", HashSet::from([]));
+            "rm_register" => vec![],
             //model_check_init_static
-            guardDependency.insert("rm_getSid_Not_Found", HashSet::from([]));
+            "rm_getSid_Not_Found" => vec![],
             //model_check_init_static
-            guardDependency.insert("svc_register", HashSet::from(["_tr_svc_register"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
+            "svc_register" => vec!["_check_inv_17"],
+            _ => vec![],
         }
+    }
+
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = nota_v2::new();
 
-        let transitions = Arc::new(AtomicI64::new(0));
+        let mut all_states = HashSet::<nota_v2>::new();
+        all_states.insert(machine.clone());
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(nota_v2, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&dependent_guard_m), Arc::clone(&guard_cache), Arc::clone(&parents_m), Arc::clone(&transitions));
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+        let mut stop_threads = false;
 
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
+
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                       .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                       .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -2063,159 +1635,66 @@ impl nota_v2 {
 
         let machine = nota_v2::new();
 
+        let all_states = Arc::new(DashSet::<nota_v2>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() || !machine._check_inv_7() || !machine._check_inv_8() || !machine._check_inv_9() || !machine._check_inv_10() || !machine._check_inv_11() || !machine._check_inv_12() || !machine._check_inv_13() || !machine._check_inv_14() || !machine._check_inv_15() || !machine._check_inv_16() || !machine._check_inv_17() || !machine._check_inv_18() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
-
-        let states_m = Arc::new(Mutex::new(HashSet::<nota_v2>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<nota_v2>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(nota_v2, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<nota_v2, HashSet<&str>>::new()));
-        let mut dependent_guard_m = Arc::new(Mutex::new(HashMap::<nota_v2, HashSet<&str>>::new()));
-        let mut guard_cache_b = Arc::new(Mutex::new(HashMap::<nota_v2, PersistentHashMap<&'static str, bool>>::new()));
-        let mut parents_m = Arc::new(Mutex::new(HashMap::<nota_v2, nota_v2>::new()));
-
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("in_register_success", HashSet::from(["_check_inv_5", "_check_inv_14", "_check_inv_13", "_check_inv_8", "_check_inv_12", "_check_inv_9"]));
-            //model_check_init_static
-            invariantDependency.insert("in_announceResourceManager", HashSet::from(["_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("in_requestTargetSocket_Granted", HashSet::from(["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"]));
-            //model_check_init_static
-            invariantDependency.insert("constructor_service", HashSet::from(["_check_inv_17", "_check_inv_16", "_check_inv_15", "_check_inv_3", "_check_inv_6", "_check_inv_14", "_check_inv_8"]));
-            //model_check_init_static
-            invariantDependency.insert("constructor_socket", HashSet::from(["_check_inv_15", "_check_inv_2", "_check_inv_10", "_check_inv_13", "_check_inv_12"]));
-            //model_check_init_static
-            invariantDependency.insert("in_requestTargetSocket_NotGranted", HashSet::from([]));
-            //model_check_init_static
-            invariantDependency.insert("constructor_interconnectNode", HashSet::from(["_check_inv_16", "_check_inv_1", "_check_inv_10", "_check_inv_9", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("rm_getSid", HashSet::from([]));
-            //model_check_init_static
-            invariantDependency.insert("rm_deregister", HashSet::from([]));
-            //model_check_init_static
-            invariantDependency.insert("constructor_resourceManager", HashSet::from(["_check_inv_18", "_check_inv_6", "_check_inv_7", "_check_inv_4", "_check_inv_11"]));
-            //model_check_init_static
-            invariantDependency.insert("in_register_failed", HashSet::from([]));
-            //model_check_init_static
-            invariantDependency.insert("rm_register", HashSet::from([]));
-            //model_check_init_static
-            invariantDependency.insert("rm_getSid_Not_Found", HashSet::from([]));
-            //model_check_init_static
-            invariantDependency.insert("svc_register", HashSet::from(["_check_inv_17"]));
-            //model_check_init_static
-            guardDependency.insert("in_register_success", HashSet::from(["_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"]));
-            //model_check_init_static
-            guardDependency.insert("in_announceResourceManager", HashSet::from(["_tr_in_announceResourceManager"]));
-            //model_check_init_static
-            guardDependency.insert("in_requestTargetSocket_Granted", HashSet::from(["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"]));
-            //model_check_init_static
-            guardDependency.insert("constructor_service", HashSet::from(["_tr_constructor_service", "_tr_rm_getSid", "_tr_in_register_success", "_tr_svc_register", "_tr_in_register_failed", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister"]));
-            //model_check_init_static
-            guardDependency.insert("constructor_socket", HashSet::from(["_tr_in_requestTargetSocket_Granted", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket"]));
-            //model_check_init_static
-            guardDependency.insert("in_requestTargetSocket_NotGranted", HashSet::from([]));
-            //model_check_init_static
-            guardDependency.insert("constructor_interconnectNode", HashSet::from(["_tr_constructor_service", "_tr_in_register_success", "_tr_in_requestTargetSocket_Granted", "_tr_in_register_failed", "_tr_rm_register", "_tr_in_requestTargetSocket_NotGranted", "_tr_constructor_socket", "_tr_rm_deregister", "_tr_constructor_interconnectNode", "_tr_in_announceResourceManager"]));
-            //model_check_init_static
-            guardDependency.insert("rm_getSid", HashSet::from([]));
-            //model_check_init_static
-            guardDependency.insert("rm_deregister", HashSet::from([]));
-            //model_check_init_static
-            guardDependency.insert("constructor_resourceManager", HashSet::from(["_tr_rm_getSid", "_tr_constructor_resourceManager", "_tr_rm_register", "_tr_rm_getSid_Not_Found", "_tr_rm_deregister", "_tr_in_announceResourceManager"]));
-            //model_check_init_static
-            guardDependency.insert("in_register_failed", HashSet::from([]));
-            //model_check_init_static
-            guardDependency.insert("rm_register", HashSet::from([]));
-            //model_check_init_static
-            guardDependency.insert("rm_getSid_Not_Found", HashSet::from([]));
-            //model_check_init_static
-            guardDependency.insert("svc_register", HashSet::from(["_tr_svc_register"]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-            parents_m.lock().unwrap().remove(&machine);
-        }
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
-            let dependent_guard_m2 = Arc::clone(&dependent_guard_m);
-            let parents_m2 = Arc::clone(&parents_m);
-            let guard_cache = Arc::clone(&guard_cache_b);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, dependent_guard_m2, guard_cache, parents_m2, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
 
-                //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                //println!("Thread {:?} executing", thread::current().id());
+                next_states.into_iter()
+                           .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                           .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                            Ok(_) => finished_tasks += 1,
+                            Err(msg) => { println!("{}", msg); stop_threads = true; },
+                        },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs b/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs
index bc8cc4dd755e5ab00183959d4befe3b4449a4966..73fe42acfa8168b695363fadb0193e6783041433 100644
--- a/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs
+++ b/benchmarks/model_checking/Rust/sort_m2_data1000_MC.rs
@@ -1,17 +1,17 @@
-#![ allow( dead_code, unused_imports, unused_mut, non_snake_case, non_camel_case_types, unused_assignments ) ]
+#![ allow( dead_code, unused, non_snake_case, non_camel_case_types, unused_assignments ) ]
 use std::env;
-use std::sync::atomic::{AtomicI32, AtomicI64, AtomicBool, Ordering};
-use std::sync::{Arc, Mutex};
-use std::thread;
-use std::collections::{HashMap, HashSet, LinkedList};
-use im::HashMap as PersistentHashMap;
+use std::sync::atomic::{AtomicU64, Ordering};
+use std::sync::{Arc, mpsc, Mutex};
+use std::collections::{HashSet, LinkedList};
+use dashmap::DashSet;
 use threadpool::ThreadPool;
 use std::sync::mpsc::channel;
 use derivative::Derivative;
+use std::time::{Duration};
 use std::fmt;
 use rand::{thread_rng, Rng};
 use btypes::butils;
-use btypes::bboolean::IntoBool;
+use btypes::bboolean::{IntoBool, BBooleanT};
 use btypes::binteger::BInteger;
 use btypes::bboolean::BBoolean;
 use btypes::brelation::BRelation;
@@ -41,6 +41,18 @@ pub struct sort_m2_data1000_MC {
     #[derivative(Hash="ignore", PartialEq="ignore")]
     _tr_cache_final_evt: Option<bool>,}
 
+impl fmt::Display for sort_m2_data1000_MC {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        let mut result = "sort_m2_data1000_MC: (".to_owned();
+        result += &format!("_get_j: {}, ", self._get_j());
+        result += &format!("_get_k: {}, ", self._get_k());
+        result += &format!("_get_l: {}, ", self._get_l());
+        result += &format!("_get_g: {}, ", self._get_g());
+        result = result + ")";
+        return write!(f, "{}", result);
+    }
+}
+
 impl sort_m2_data1000_MC {
 
     pub fn new() -> sort_m2_data1000_MC {
@@ -50,7 +62,7 @@ impl sort_m2_data1000_MC {
         return m;
     }
     fn init(&mut self) {
-        self.n = BInteger::new(300);
+        self.n = BInteger::new(1000);
         let mut _ic_set_0 = BRelation::<BInteger, BInteger>::new(vec![]);
         for _ic_i_1 in BSet::<BInteger>::interval(&BInteger::new(1), &self.n).clone().iter().cloned() {
             _ic_set_0 = _ic_set_0._union(&BRelation::<BInteger, BInteger>::new(vec![BTuple::new(_ic_i_1, BInteger::new(15000).minus(&_ic_i_1))]));
@@ -63,32 +75,32 @@ impl sort_m2_data1000_MC {
         self.j = BInteger::new(1);
     }
 
-    pub fn get_n(&self) -> BInteger {
+    pub fn _get_n(&self) -> BInteger {
         return self.n.clone();
     }
 
-    pub fn get_f(&self) -> BRelation<BInteger, BInteger> {
+    pub fn _get_f(&self) -> BRelation<BInteger, BInteger> {
         return self.f.clone();
     }
 
-    pub fn get_j(&self) -> BInteger {
+    pub fn _get_j(&self) -> BInteger {
         return self.j.clone();
     }
 
-    pub fn get_k(&self) -> BInteger {
+    pub fn _get_k(&self) -> BInteger {
         return self.k.clone();
     }
 
-    pub fn get_l(&self) -> BInteger {
+    pub fn _get_l(&self) -> BInteger {
         return self.l.clone();
     }
 
-    pub fn get_g(&self) -> BRelation<BInteger, BInteger> {
+    pub fn _get_g(&self) -> BRelation<BInteger, BInteger> {
         return self.g.clone();
     }
 
     pub fn progress(&mut self) -> () {
-        if (self.k.unequal(&self.n).booleanValue() && self.j.equal(&self.n).booleanValue()).booleanValue() {
+        if ((self.k.unequal(&self.n) && self.j.equal(&self.n))).booleanValue() {
             let mut _ld_g = self.g.clone();
             let mut _ld_k = self.k.clone();
             let mut _ld_l = self.l.clone();
@@ -102,7 +114,7 @@ impl sort_m2_data1000_MC {
     }
 
     pub fn prog1(&mut self) -> () {
-        if (self.k.unequal(&self.n).booleanValue() && self.j.unequal(&self.n).booleanValue().booleanValue() && self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))).booleanValue()).booleanValue() {
+        if (((self.k.unequal(&self.n) && self.j.unequal(&self.n)) && self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))))).booleanValue() {
             let mut _ld_j = self.j.clone();
             let mut _ld_l = self.l.clone();
             self.l = _ld_l;
@@ -113,7 +125,7 @@ impl sort_m2_data1000_MC {
     }
 
     pub fn prog2(&mut self) -> () {
-        if (self.k.unequal(&self.n).booleanValue() && self.j.unequal(&self.n).booleanValue().booleanValue() && self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))).booleanValue()).booleanValue() {
+        if (((self.k.unequal(&self.n) && self.j.unequal(&self.n)) && self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))))).booleanValue() {
             let mut _ld_j = self.j.clone();
             self.j = _ld_j.plus(&BInteger::new(1));
             self.l = _ld_j.plus(&BInteger::new(1));
@@ -132,7 +144,7 @@ impl sort_m2_data1000_MC {
     pub fn _tr_progress(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_progress.is_none() {
-            let mut __tmp__val__ = self.k.unequal(&self.n).booleanValue() && self.j.equal(&self.n).booleanValue().booleanValue();
+            let mut __tmp__val__ = (self.k.unequal(&self.n) && self.j.equal(&self.n)).booleanValue();
             self._tr_cache_progress = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -143,7 +155,7 @@ impl sort_m2_data1000_MC {
     pub fn _tr_prog1(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_prog1.is_none() {
-            let mut __tmp__val__ = self.k.unequal(&self.n).booleanValue() && self.j.unequal(&self.n).booleanValue().booleanValue() && self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))).booleanValue().booleanValue();
+            let mut __tmp__val__ = ((self.k.unequal(&self.n) && self.j.unequal(&self.n)) && self.g.functionCall(&self.l).lessEqual(&self.g.functionCall(&self.j.plus(&BInteger::new(1))))).booleanValue();
             self._tr_cache_prog1 = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -154,7 +166,7 @@ impl sort_m2_data1000_MC {
     pub fn _tr_prog2(&mut self, is_caching: bool) -> bool {
         //transition
         if !is_caching || self._tr_cache_prog2.is_none() {
-            let mut __tmp__val__ = self.k.unequal(&self.n).booleanValue() && self.j.unequal(&self.n).booleanValue().booleanValue() && self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1)))).booleanValue().booleanValue();
+            let mut __tmp__val__ = ((self.k.unequal(&self.n) && self.j.unequal(&self.n)) && self.g.functionCall(&self.l).greater(&self.g.functionCall(&self.j.plus(&BInteger::new(1))))).booleanValue();
             self._tr_cache_prog2 = Option::Some(__tmp__val__);
             return __tmp__val__;
         } else {
@@ -203,11 +215,10 @@ impl sort_m2_data1000_MC {
         return self.g.checkDomain(&BSet::<BInteger>::interval(&BInteger::new(1), &self.n)).and(&self.g.checkRangeNatural()).and(&self.g.isFunction()).and(&self.g.isTotal(&BSet::<BInteger>::interval(&BInteger::new(1), &self.n))).booleanValue();
     }
 
-    fn invalidate_caches(&mut self, to_invalidate: &HashSet<&'static str>) {
+    fn invalidate_caches(&mut self, to_invalidate: Vec<&'static str>) {
         //calling the given functions without caching will recalculate them and cache them afterwards
-        //if caching is enabled globally, this will just prefill those, if caching is
-        for trans in to_invalidate.iter() {
-            match *trans {
+        for trans in to_invalidate {
+            match trans {
                 "_tr_progress" => {self._tr_progress(false);},
                 "_tr_prog1" => {self._tr_prog1(false);},
                 "_tr_prog2" => {self._tr_prog2(false);},
@@ -220,165 +231,96 @@ impl sort_m2_data1000_MC {
     //model_check_next_states
     fn generateNextStates(state: &mut sort_m2_data1000_MC,
                           isCaching: bool,
-                          invariant_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          dependent_invariant_m: Arc<Mutex<HashMap<sort_m2_data1000_MC, HashSet<&str>>>>,
-                          guard_dependency: &HashMap<&str, HashSet<&'static str>>,
-                          transitions: Arc<AtomicI64>) -> HashSet<sort_m2_data1000_MC> {
-        let mut result = HashSet::<sort_m2_data1000_MC>::new();
-        if isCaching {
-            //model_check_transition
-            let mut _trid_1 = state._tr_progress(isCaching);
-            if _trid_1 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.progress();
-                match guard_dependency.get("progress") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("progress").unwrap().clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_2 = state._tr_prog1(isCaching);
-            if _trid_2 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.prog1();
-                match guard_dependency.get("prog1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("prog1").unwrap().clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_3 = state._tr_prog2(isCaching);
-            if _trid_3 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.prog2();
-                match guard_dependency.get("prog2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("prog2").unwrap().clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            let mut _trid_4 = state._tr_final_evt(isCaching);
-            if _trid_4 {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.final_evt();
-                match guard_dependency.get("final_evt") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                {
-                    let mut dependent_invariant = dependent_invariant_m.lock().unwrap();
-
-                    if !dependent_invariant.contains_key(&copiedState) {
-                        dependent_invariant.insert(copiedState.clone(), invariant_dependency.get("final_evt").unwrap().clone());
-                    }
-                }
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-        } else {
-            //model_check_transition
-            if state._tr_progress(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.progress();
-                match guard_dependency.get("progress") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_prog1(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.prog1();
-                match guard_dependency.get("prog1") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_prog2(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.prog2();
-                match guard_dependency.get("prog2") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-            //model_check_transition
-            if state._tr_final_evt(isCaching) {
-                //model_check_transition_body
-                let mut copiedState = state.clone();
-                copiedState.final_evt();
-                match guard_dependency.get("final_evt") { Some(map) => copiedState.invalidate_caches(map), _ => (),}
-                result.insert(copiedState);
-                transitions.fetch_add(1, Ordering::AcqRel);
-            }
-
+                          transitions: Arc<AtomicU64>) -> HashSet<(sort_m2_data1000_MC, &'static str)> {
+        let mut result = HashSet::<(sort_m2_data1000_MC, &'static str)>::new();
+        let mut evaluated_transitions: u64 = 0;
+        //model_check_transition
+        if state._tr_progress(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.progress();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("progress")); }
+            result.insert((copiedState, "progress"));
+            evaluated_transitions += 1;
         }
+        //model_check_transition
+        if state._tr_prog1(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.prog1();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("prog1")); }
+            result.insert((copiedState, "prog1"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_prog2(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.prog2();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("prog2")); }
+            result.insert((copiedState, "prog2"));
+            evaluated_transitions += 1;
+        }
+        //model_check_transition
+        if state._tr_final_evt(isCaching) {
+            //model_check_transition_body
+            let mut copiedState = state.clone();
+            copiedState.final_evt();
+            if isCaching { copiedState.invalidate_caches(Self::get_guard_dependencies("final_evt")); }
+            result.insert((copiedState, "final_evt"));
+            evaluated_transitions += 1;
+        }
+
+
+        transitions.fetch_add(evaluated_transitions, Ordering::AcqRel);
         return result;
     }
 
     //model_check_evaluate_state
 
     //model_check_invariants
-    pub fn checkInvariants(state: &sort_m2_data1000_MC,
-                           isCaching: bool,
-                           dependent_invariant_m: Arc<Mutex<HashMap<sort_m2_data1000_MC, HashSet<&str>>>> ) -> bool
-    {
-        let cached_invariants = dependent_invariant_m.lock().unwrap().get(&state).cloned();
-        if cached_invariants.is_some() && isCaching {
-            let dependent_invariants_of_state = cached_invariants.unwrap().clone();
+    pub fn checkInvariants(state: &sort_m2_data1000_MC, last_op: &'static str, isCaching: bool) -> bool {
+        if isCaching {
+            let dependent_invariants_of_state = Self::get_invariant_dependencies(last_op);
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_1") {
+            if dependent_invariants_of_state.contains(&"_check_inv_1") {
                 if !state._check_inv_1() {
+                    println!("_check_inv_1 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_2") {
+            if dependent_invariants_of_state.contains(&"_check_inv_2") {
                 if !state._check_inv_2() {
+                    println!("_check_inv_2 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_3") {
+            if dependent_invariants_of_state.contains(&"_check_inv_3") {
                 if !state._check_inv_3() {
+                    println!("_check_inv_3 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_4") {
+            if dependent_invariants_of_state.contains(&"_check_inv_4") {
                 if !state._check_inv_4() {
+                    println!("_check_inv_4 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_5") {
+            if dependent_invariants_of_state.contains(&"_check_inv_5") {
                 if !state._check_inv_5() {
+                    println!("_check_inv_5 failed!");
                     return false;
                 }
             }
             //model_check_invariant
-            if dependent_invariants_of_state.contains("_check_inv_6") {
+            if dependent_invariants_of_state.contains(&"_check_inv_6") {
                 if !state._check_inv_6() {
+                    println!("_check_inv_6 failed!");
                     return false;
                 }
             }
@@ -388,16 +330,14 @@ impl sort_m2_data1000_MC {
     }
 
     //model_check_print
-    fn print_result(states: i64, transitions: i64, deadlock_detected: bool, invariant_violated: bool) {
-        if deadlock_detected { println!("DEADLOCK DETECTED"); }
-        if invariant_violated { println!("INVARIANT VIOLATED"); }
-        if !deadlock_detected && !invariant_violated { println!("MODEL CHECKING SUCCESSFUL"); }
+    fn print_result(states: usize, transitions: u64, error_detected: bool) {
+        if !error_detected { println!("MODEL CHECKING SUCCESSFUL"); }
         println!("Number of States: {}", states);
         println!("Number of Transitions: {}", transitions);
     }
 
     //model_check_main
-    fn next(collection_m: Arc<Mutex<LinkedList<sort_m2_data1000_MC>>>, mc_type: MC_TYPE) -> sort_m2_data1000_MC {
+    fn next(collection_m: Arc<Mutex<LinkedList<(sort_m2_data1000_MC, &'static str)>>>, mc_type: MC_TYPE) -> (sort_m2_data1000_MC, &'static str) {
         let mut collection = collection_m.lock().unwrap();
         return match mc_type {
             MC_TYPE::BFS   => collection.pop_front().unwrap(),
@@ -406,80 +346,72 @@ impl sort_m2_data1000_MC {
         };
     }
 
-    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
-        let mut machine = sort_m2_data1000_MC::new();
-
-        let invariant_violated = AtomicBool::new(false);
-        let deadlock_detected = AtomicBool::new(false);
-        let stop_threads = AtomicBool::new(false);
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() {
-            invariant_violated.store(true, Ordering::Release);
-        }
-
-        let mut states = HashSet::<sort_m2_data1000_MC>::new();
-        states.insert(machine.clone());
-        let number_states = AtomicI64::new(1);
-
-        let collection_m = Arc::new(Mutex::new(LinkedList::<sort_m2_data1000_MC>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, HashSet<&str>>::new()));
-
-        if is_caching {
+    fn get_guard_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            invariantDependency.insert("prog2", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"]));
+            "prog2" => vec!["_tr_progress", "_tr_prog1", "_tr_prog2"],
             //model_check_init_static
-            invariantDependency.insert("prog1", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"]));
+            "prog1" => vec!["_tr_progress", "_tr_prog1", "_tr_prog2"],
             //model_check_init_static
-            invariantDependency.insert("progress", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_6", "_check_inv_4", "_check_inv_5"]));
+            "progress" => vec!["_tr_final_evt", "_tr_progress", "_tr_prog1", "_tr_prog2"],
             //model_check_init_static
-            invariantDependency.insert("final_evt", HashSet::from([]));
+            "final_evt" => vec![],
+            _ => vec![],
+        }
+    }
+
+    fn get_invariant_dependencies(op: &'static str) -> Vec<&str> {
+        return match op {
             //model_check_init_static
-            guardDependency.insert("prog2", HashSet::from(["_tr_progress", "_tr_prog1", "_tr_prog2"]));
+            "prog2" => vec!["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"],
             //model_check_init_static
-            guardDependency.insert("prog1", HashSet::from(["_tr_progress", "_tr_prog1", "_tr_prog2"]));
+            "prog1" => vec!["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"],
             //model_check_init_static
-            guardDependency.insert("progress", HashSet::from(["_tr_final_evt", "_tr_progress", "_tr_prog1", "_tr_prog2"]));
+            "progress" => vec!["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_6", "_check_inv_4", "_check_inv_5"],
             //model_check_init_static
-            guardDependency.insert("final_evt", HashSet::from([]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
+            "final_evt" => vec![],
+            _ => vec![],
         }
+    }
 
-        let transitions = Arc::new(AtomicI64::new(0));
+    fn model_check_single_threaded(mc_type: MC_TYPE, is_caching: bool) {
+        let mut machine = sort_m2_data1000_MC::new();
 
-        while !stop_threads.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
+        let mut all_states = HashSet::<sort_m2_data1000_MC>::new();
+        all_states.insert(machine.clone());
 
-            let next_states = Self::generateNextStates(&mut state, is_caching, &mut invariantDependency, Arc::clone(&dependent_invariant_m), &mut guardDependency, Arc::clone(&transitions));
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(sort_m2_data1000_MC, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine.clone(), ""));
 
-            next_states.iter().cloned().for_each(|next_state| {
-                if !states.contains(&next_state) {
-                    let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                    states.insert(next_state.clone());
-                    collection_m.lock().unwrap().push_back(next_state);
-                    if cnum_states % 50000 == 0 {
-                        println!("VISITED STATES: {}", cnum_states);
-                        println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                        println!("-------------------");
-                    }
-                }
-            });
+        let num_transitions = Arc::new(AtomicU64::new(0));
+
+        let mut stop_threads = false;
+
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let next_states = Self::generateNextStates(&mut state, is_caching, Arc::clone(&num_transitions));
 
+            if !Self::checkInvariants(&state, last_op, is_caching) {
+                println!("INVARIANT VIOLATED");
+                stop_threads = true;
+            }
             if next_states.is_empty() {
-                deadlock_detected.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
+                print!("DEADLOCK DETECTED");
+                stop_threads = true;
             }
 
-            if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m)) {
-                invariant_violated.store(true, Ordering::Release);
-                stop_threads.store(true, Ordering::Release);
-            }
+            next_states.into_iter()
+                       .filter(|(next_state, _)| all_states.insert((*next_state).clone()))
+                       .for_each(|(next_state, last_op)| states_to_process_mutex.lock().unwrap().push_back((next_state, last_op)));
 
+            if all_states.len() % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
         }
-        Self::print_result(number_states.load(Ordering::Acquire), transitions.load(Ordering::Acquire), deadlock_detected.load(Ordering::Acquire), invariant_violated.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
     fn modelCheckMultiThreaded(mc_type: MC_TYPE, threads: usize, is_caching: bool) {
@@ -487,112 +419,66 @@ impl sort_m2_data1000_MC {
 
         let machine = sort_m2_data1000_MC::new();
 
+        let all_states = Arc::new(DashSet::<sort_m2_data1000_MC>::new());
+        all_states.insert(machine.clone());
 
-        let invariant_violated_b = Arc::new(AtomicBool::new(false));
-        let deadlock_detected_b = Arc::new(AtomicBool::new(false));
-        let stop_threads_b = Arc::new(AtomicBool::new(false));
-        let possible_queue_changes_b = Arc::new(AtomicI32::new(0));
-
-        if !machine._check_inv_1() || !machine._check_inv_2() || !machine._check_inv_3() || !machine._check_inv_4() || !machine._check_inv_5() || !machine._check_inv_6() {
-            invariant_violated_b.store(true, Ordering::Release);
-        }
+        let states_to_process_mutex = Arc::new(Mutex::new(LinkedList::<(sort_m2_data1000_MC, &'static str)>::new()));
+        states_to_process_mutex.lock().unwrap().push_back((machine, ""));
 
-        let states_m = Arc::new(Mutex::new(HashSet::<sort_m2_data1000_MC>::new()));
-        states_m.lock().unwrap().insert(machine.clone());
-        let number_states_arc = Arc::new(AtomicI64::new(1));
+        let num_transitions = Arc::new(AtomicU64::new(0));
 
-        let collection_m = Arc::new(Mutex::new(LinkedList::<sort_m2_data1000_MC>::new()));
-        collection_m.lock().unwrap().push_back(machine.clone());
-
-        let mut invariantDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut guardDependency = HashMap::<&str, HashSet<&'static str>>::new();
-        let mut dependent_invariant_m = Arc::new(Mutex::new(HashMap::<sort_m2_data1000_MC, HashSet<&str>>::new()));
-
-        if is_caching {
-            //model_check_init_static
-            invariantDependency.insert("prog2", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"]));
-            //model_check_init_static
-            invariantDependency.insert("prog1", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_4", "_check_inv_5"]));
-            //model_check_init_static
-            invariantDependency.insert("progress", HashSet::from(["_check_inv_2", "_check_inv_3", "_check_inv_1", "_check_inv_6", "_check_inv_4", "_check_inv_5"]));
-            //model_check_init_static
-            invariantDependency.insert("final_evt", HashSet::from([]));
-            //model_check_init_static
-            guardDependency.insert("prog2", HashSet::from(["_tr_progress", "_tr_prog1", "_tr_prog2"]));
-            //model_check_init_static
-            guardDependency.insert("prog1", HashSet::from(["_tr_progress", "_tr_prog1", "_tr_prog2"]));
-            //model_check_init_static
-            guardDependency.insert("progress", HashSet::from(["_tr_final_evt", "_tr_progress", "_tr_prog1", "_tr_prog2"]));
-            //model_check_init_static
-            guardDependency.insert("final_evt", HashSet::from([]));
-            dependent_invariant_m.lock().unwrap().insert(machine.clone(), HashSet::new());
-        }
-
-        let num_transitions = Arc::new(AtomicI64::new(0));
-        let invariant_dependency_arc = Arc::new(invariantDependency);
-        let guard_dependency_arc = Arc::new(guardDependency);
+        let mut stop_threads = false;
+        let mut spawned_tasks: u64 = 0;
+        let mut finished_tasks: u64 = 0;
 
         let (tx, rx) = channel();
         //println!("Thread {:?} starting threads", thread::current().id());
-        while !stop_threads_b.load(Ordering::Acquire) && !collection_m.lock().unwrap().is_empty() {
-            possible_queue_changes_b.fetch_add(1, Ordering::AcqRel);
-            let mut state = Self::next(Arc::clone(&collection_m), mc_type);
-
-            let invariant_violated = Arc::clone(&invariant_violated_b);
-            let deadlock_detected = Arc::clone(&deadlock_detected_b);
-            let stop_threads = Arc::clone(&stop_threads_b);
-            let possible_queue_changes = Arc::clone(&possible_queue_changes_b);
-            let collection_m2 = Arc::clone(&collection_m);
-            let invariant_dependency = Arc::clone(&invariant_dependency_arc);
-            let guard_dependency = Arc::clone(&guard_dependency_arc);
-            let dependent_invariant_m2 = Arc::clone(&dependent_invariant_m);
+        while !stop_threads && !states_to_process_mutex.lock().unwrap().is_empty() {
+            let (mut state, last_op) = Self::next(Arc::clone(&states_to_process_mutex), mc_type);
+
+            let states_to_process = Arc::clone(&states_to_process_mutex);
             let transitions = Arc::clone(&num_transitions);
-            let states_m2 = Arc::clone(&states_m);
-            let number_states = Arc::clone(&number_states_arc);
+            let states = Arc::clone(&all_states);
             let tx = tx.clone();
             //println!("Thread {:?} spawning a thread", thread::current().id());
             threadPool.execute(move|| {
-                let next_states = Self::generateNextStates(&mut state, is_caching, &invariant_dependency, Arc::clone(&dependent_invariant_m2), &guard_dependency, Arc::clone(&transitions));
+                if !Self::checkInvariants(&state, last_op, is_caching) {
+                    let _ = tx.send(Err("INVARIANT VIOLATED"));
+                }
+
+                let next_states = Self::generateNextStates(&mut state, is_caching, transitions);
+                if next_states.is_empty() { let _ = tx.send(Err("DEADLOCK DETECTED")); }
 
                 //println!("Thread {:?} executing", thread::current().id());
-                next_states.iter().cloned().for_each(|next_state| {
-                    {
-                        let mut states = states_m2.lock().unwrap();
-                        let mut collection = collection_m2.lock().unwrap();
-                        if !states.contains(&next_state) {
-                            let cnum_states = number_states.fetch_add(1, Ordering::AcqRel) + 1;
-                            states.insert(next_state.clone());
-                            collection.push_back(next_state);
-                            //println!("Thread {:?}: states in collection {}", thread::current().id(), collection.len());
-                            if cnum_states % 50000 == 0 {
-                                println!("VISITED STATES: {}", cnum_states);
-                                println!("EVALUATED TRANSITIONS: {}", transitions.load(Ordering::Acquire));
-                                println!("-------------------");
-                            }
-                        }
-                    }
-                });
-                possible_queue_changes.fetch_sub(1, Ordering::AcqRel);
-
-                if next_states.is_empty() {
-                    deadlock_detected.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
+                next_states.into_iter()
+                           .filter(|(next_state, _)| states.insert((*next_state).clone()))
+                           .for_each(|(next_state, last_op)| states_to_process.lock().unwrap().push_back((next_state, last_op)));
 
-                if !Self::checkInvariants(&state, is_caching, Arc::clone(&dependent_invariant_m2)) {
-                    invariant_violated.store(true, Ordering::Release);
-                    stop_threads.store(true, Ordering::Release);
-                }
                 //println!("Thread {:?} done", thread::current().id());
-                tx.send(1).expect("");
+                let _ = tx.send(Ok(1));
             });
-            while collection_m.lock().unwrap().is_empty() && possible_queue_changes_b.load(Ordering::Acquire) > 0 {
+
+            spawned_tasks += 1;
+            if spawned_tasks % 50000 == 0 {
+                println!("VISITED STATES: {}", all_states.len());
+                println!("EVALUATED TRANSITIONS: {}", num_transitions.load(Ordering::Acquire));
+                println!("-------------------");
+            }
+
+            while states_to_process_mutex.lock().unwrap().is_empty() && spawned_tasks - finished_tasks > 0 {
                 //println!("Thread {:?} (main) waiting for a thread to finish", thread::current().id());
-                rx.recv().expect("Waiting for a thread to finish: ");
+                match rx.recv_timeout(Duration::from_secs(1)) {
+                    Ok(val)  => match val {
+                            Ok(_) => finished_tasks += 1,
+                            Err(msg) => { println!("{}", msg); stop_threads = true; },
+                        },
+                    Err(_) => (),
+                }
+                if threadPool.panic_count() > 0 { stop_threads = true; }
             }
         }
 
-        Self::print_result(number_states_arc.load(Ordering::Acquire), num_transitions.load(Ordering::Acquire), deadlock_detected_b.load(Ordering::Acquire), invariant_violated_b.load(Ordering::Acquire));
+        Self::print_result(all_states.len(), num_transitions.load(Ordering::Acquire), stop_threads);
     }
 
 }
diff --git a/src/test/resources/de/hhu/stups/codegenerator/sort_m2_data1000_MC.out b/src/test/resources/de/hhu/stups/codegenerator/sort_m2_data1000_MC.out
index cdab9af7d103feaa7f788086a4915c638620e08b..6676f294021b657c18976461533924a4c6b53266 100644
--- a/src/test/resources/de/hhu/stups/codegenerator/sort_m2_data1000_MC.out
+++ b/src/test/resources/de/hhu/stups/codegenerator/sort_m2_data1000_MC.out
@@ -1,3 +1,3 @@
 MODEL CHECKING SUCCESSFUL
-Number of States: 500501
+Number of States: 500500
 Number of Transitions: 500500
\ No newline at end of file