diff --git a/src/HybridKripke.cpp b/src/HybridKripke.cpp
index 62ff0155b9bd882d730611ba019169d543bb1cdb..0836a284b8e43ce03ce0566b15da1b8bbd1d7c1d 100644
--- a/src/HybridKripke.cpp
+++ b/src/HybridKripke.cpp
@@ -10,10 +10,9 @@
 #include "HybridKripke.h"
 #include <map>
 using namespace spot;
-HybridKripke::HybridKripke(const bdd_dict_ptr &dict_ptr,ModelCheckBaseMT *builder): spot::kripke(dict_ptr),m_builder(builder)
+HybridKripke::HybridKripke(const bdd_dict_ptr &dict_ptr): spot::kripke(dict_ptr)
 {
-    HybridKripkeIterator::m_builder=builder;
-    HybridKripkeIterator::m_builder=builder;
+    
     HybridKripkeIterator::m_dict_ptr=&dict_ptr;
     HybridKripkeIterator::m_deadlock.setLDDValue(1);
     HybridKripkeIterator::m_deadlock.setVisited();
@@ -24,7 +23,7 @@ HybridKripke::HybridKripke(const bdd_dict_ptr &dict_ptr,ModelCheckBaseMT *builde
     HybridKripkeIterator::m_div.Successors.push_back(pair<LDDState*,int>(&HybridKripkeIterator::m_div,-1));
 }
 
-HybridKripke::HybridKripke(const spot::bdd_dict_ptr& dict_ptr,ModelCheckBaseMT *builder,set<string> &l_transap,set<string> &l_placeap):HybridKripke(dict_ptr,builder) {
+HybridKripke::HybridKripke(const spot::bdd_dict_ptr& dict_ptr,set<string> &l_transap,set<string> &l_placeap):HybridKripke(dict_ptr) {
 
     for (auto it=l_transap.begin();it!=l_transap.end();it++) {
         register_ap(*it);
@@ -36,8 +35,11 @@ HybridKripke::HybridKripke(const spot::bdd_dict_ptr& dict_ptr,ModelCheckBaseMT *
 
 
 state* HybridKripke::get_init_state() const {
-   LDDState *ss=m_builder->getInitialMetaState();   
-    return new HybridKripkeState(ss);//new SpotSogState();
+    // LDDState *ss=m_builder->getInitialMetaState();   
+    
+    string id;
+    uint16_t p_container;
+    return new HybridKripkeState(id,p_container);//new SpotSogState();
 
 }
 // Allows to print state label representing its id
@@ -78,22 +80,22 @@ bdd HybridKripke::state_condition(const spot::state* s) const
   {
 
     auto ss = static_cast<const HybridKripkeState*>(s);
-    vector<int> marked_place=ss->getLDDState()->getMarkedPlaces(m_builder->getPlaceProposition());
+    //vector<int> marked_place=ss->getLDDState()->getMarkedPlaces(m_builder->getPlaceProposition());
 
 
     bdd result=bddtrue;
     // Marked places
-    for (auto it=marked_place.begin();it!=marked_place.end();it++) {
-    string name=m_builder->getPlace(*it);
+    //for (auto it=marked_place.begin();it!=marked_place.end();it++) {
+    // string name=m_builder->getPlace(*it);
+    //spot::formula f=spot::formula::ap(name);
+    //result&=bdd_ithvar((dict_->var_map.find(f))->second);
+   // }
+    //vector<int> unmarked_place=ss->getLDDState()->getUnmarkedPlaces(m_builder->getPlaceProposition());
+    //for (auto it=unmarked_place.begin();it!=unmarked_place.end();it++) {
+    /*string name=m_builder->getPlace(*it);
     spot::formula f=spot::formula::ap(name);
-    result&=bdd_ithvar((dict_->var_map.find(f))->second);
-    }
-    vector<int> unmarked_place=ss->getLDDState()->getUnmarkedPlaces(m_builder->getPlaceProposition());
-    for (auto it=unmarked_place.begin();it!=unmarked_place.end();it++) {
-    string name=m_builder->getPlace(*it);
-    spot::formula f=spot::formula::ap(name);
-    result&=!bdd_ithvar((dict_->var_map.find(f))->second);
-    }
+    result&=!bdd_ithvar((dict_->var_map.find(f))->second);*/
+    //}
 
   return result;
   }
diff --git a/src/HybridKripke.h b/src/HybridKripke.h
index b9f718120d032c82d5caac5a78d0a3848657c6b3..273fe216e80d70e3dd70ce4e61b489990e65e31c 100644
--- a/src/HybridKripke.h
+++ b/src/HybridKripke.h
@@ -10,15 +10,15 @@
 class HybridKripke: public spot::kripke {
     public:
 
-        HybridKripke(const spot::bdd_dict_ptr& dict_ptr,ModelCheckBaseMT *builder);
-        HybridKripke(const spot::bdd_dict_ptr& dict_ptr,ModelCheckBaseMT *builder,set<string> &l_transap,set<string> &l_placeap);
+        HybridKripke(const spot::bdd_dict_ptr& dict_ptr);
+        HybridKripke(const spot::bdd_dict_ptr& dict_ptr,set<string> &l_transap,set<string> &l_placeap);
         virtual ~HybridKripke();
         spot::state* get_init_state() const override;
         HybridKripkeIterator* succ_iter(const spot::state* s) const override;
         std::string format_state(const spot::state* s) const override;
         bdd state_condition(const spot::state* s) const override;
 
-        ModelCheckBaseMT *m_builder;
+        //ModelCheckBaseMT *m_builder;
 
     protected:
 
diff --git a/src/HybridKripkeIterator.cpp b/src/HybridKripkeIterator.cpp
index 69a4079f5c2783cc64b979145c2c4423d2c5e5b3..7a49bf3509096a3974b3e89b62705d81e3c241f2 100644
--- a/src/HybridKripkeIterator.cpp
+++ b/src/HybridKripkeIterator.cpp
@@ -42,7 +42,11 @@ bool HybridKripkeIterator::done() const {
 HybridKripkeState* HybridKripkeIterator::dst() const
   {
     /*cout<<"Source "<<m_lddstate->getLDDValue()<<"Destination :"<<m_lsucc.at(m_current_edge).first->getLDDValue()<<" in "<<m_lsucc.size()<<" / "<<m_current_edge<<endl;*/
-    return new HybridKripkeState(m_lsucc.at(m_current_edge).first);
+   // return new HybridKripkeState(m_lsucc.at(m_current_edge).first);
+   string id;
+   uint16_t p_container;
+   return new HybridKripkeState(id,p_container);
+   // return new HybridKripkeState(m_lsucc.at(m_current_edge).first);
   }
 
 bdd HybridKripkeIterator::cond()  const {
diff --git a/src/HybridKripkeState.h b/src/HybridKripkeState.h
index 212f0561349662cc8722c93e05c0d6a6387d50af..dbf999d169be47cbeb2b7d8a4f3edc7717397cee 100644
--- a/src/HybridKripkeState.h
+++ b/src/HybridKripkeState.h
@@ -1,22 +1,27 @@
 #ifndef HYBRIDKRIPKESTATETH_H_INCLUDED
 #define HYBRIDKRIPKESTATETH_H_INCLUDED
 
-
+#include <mpi.h>
 #include "LDDState.h"
 #include "ModelCheckBaseMT.h"
-
+#define TAG_ASKSTATE 10
 class HybridKripkeState : public spot::state
 {
 public:
     static ModelCheckBaseMT * m_builder;
-    HybridKripkeState(LDDState *st):m_state(st) {
-            m_builder->buildSucc(st);
+    HybridKripkeState(string &id,uint16_t pcontainer):m_id(id),m_container(pcontainer) {
+        int v=1;
+        MPI_Send( &v, 1, MPI_INT, 0, TAG_ASKSTATE, MPI_COMM_WORLD); 
+                
     };
+    // Constructor for cloning
+    HybridKripkeState(const string &id,uint16_t pcontainer,bool ddiv, bool deadlock):m_id(id),m_container(pcontainer),m_div(ddiv),m_deadlock(deadlock) {
+    }
     virtual ~HybridKripkeState();
 
     HybridKripkeState* clone() const override
     {
-        return new HybridKripkeState(m_state);
+        return new HybridKripkeState(m_id,m_container,m_div,m_deadlock);
     }
     size_t hash() const override
     {
@@ -41,6 +46,10 @@ protected:
 
 private:
     LDDState *m_state;
+    string m_id;
+    bool m_div;
+    bool m_deadlock;
+    uint16_t m_container;
 };
 
 
diff --git a/src/MCHybridSOG.cpp b/src/MCHybridSOG.cpp
index 9c86805b9de6341b0ffa6c8ce1fdff45217f1852..ddb171488f81a5380b74842b0768745f6e6b24b6 100644
--- a/src/MCHybridSOG.cpp
+++ b/src/MCHybridSOG.cpp
@@ -14,10 +14,10 @@ using namespace sylvan;
 #define LENGTH_ID 16
 //#define LENGTH_MSG 180
 #define TAG_STATE 1
-#define TAG_SEND 2
-#define TAG_REC 4
-#define TAG_TERM 8
-#define TAG_ABORT 16
+#define TAG_FINISH 2
+#define TAG_INITIAL 3
+#define TAG_SUCC 4
+#define TAG_AGREGATE 5
 
 
 
@@ -90,8 +90,7 @@ MCHybridSOG::MCHybridSOG(const NewNet &R,MPI_Comm &comm_world, int BOUND,bool in
         {
             adjacentPlace.insert(it->first);
             prec[it->first] = prec[it->first] + it->second;
-            //printf("It first %d \n",it->first);
-            //printf("In prec %d \n",prec[it->first]);
+            
         }
         // arcs post
         for(vector< pair<int,int> >::const_iterator it=t->post.begin(); it!=t->post.end(); it++)
@@ -145,9 +144,6 @@ void *MCHybridSOG::doCompute()
      //   MDD reduced_initialstate=Canonize(Complete_meta_state,0);
 
         convert_wholemdd_stringcpp(Complete_meta_state,*chaine);
-        //DisplayMessage(chaine->c_str());
-        //write_to_dot("normal.dot",Complete_meta_state);
-        //exit(0);
         get_md5(*chaine,Identif);
         //lddmc_getsha(Complete_meta_state, Identif);
         int destination=(int)(Identif[0]%n_tasks);
@@ -455,42 +451,6 @@ void *MCHybridSOG::doCompute()
 
 }
 
-void MCHybridSOG::ReceiveTermSignal()
-{
-
-    int  term=1;
-    MPI_Recv(&term, 1, MPI_INT, task_id==0 ? n_tasks-1 : task_id-1, TAG_TERM, m_comm_world,&m_status);
-    //cout<<"Task id receive terminal message"<<task_id<<endl;
-    if(task_id!=0)
-    {
-        MPI_Send(&term, 1, MPI_INT, (task_id + 1)%n_tasks, TAG_TERM, m_comm_world);
-    }
-    m_Terminated=true;
-}
-
-
-void MCHybridSOG::TermReceivedMsg()
-{
-
-
-    int kkk=0;
-    MPI_Recv(&kkk, 1, MPI_INT, task_id==0 ? n_tasks-1 : task_id-1, TAG_REC, m_comm_world, &m_status);
-    if(task_id!=0)
-    {
-        kkk=kkk+m_nbrecv;
-        MPI_Send( &kkk, 1, MPI_INT, (task_id+1)%n_tasks, TAG_REC, m_comm_world);
-
-    }
-    else if (m_Terminating)
-    {
-        m_total_nb_recv=kkk;
-        // printf("Process 0  total receive %d\n", m_total_nb_recv);
-        MPI_Send( &m_nbsend, 1, MPI_INT, 1, TAG_SEND, m_comm_world);
-        // printf("Process 0  nb send au debut %d\n", m_nbsend);
-    }
-
-}
-
 
 bool MCHybridSOG::isNotTerminated()
 {
@@ -505,20 +465,13 @@ bool MCHybridSOG::isNotTerminated()
 }
 
 
-void MCHybridSOG::AbortTerm()
-{
-    int v=1;
-    m_Terminating=false;
-    MPI_Recv(&v, 1, MPI_INT, m_status.MPI_SOURCE, m_status.MPI_TAG, m_comm_world, &m_status);
-    if (task_id)  MPI_Send( &v, 1, MPI_INT, 0, TAG_ABORT, m_comm_world);
-}
 
 void MCHybridSOG::read_message()
 {
     int flag=0;
 
 
-    MPI_Iprobe(MPI_ANY_SOURCE,MPI_ANY_TAG,m_comm_world,&flag,&m_status); // exist a msg to receiv?
+    MPI_Iprobe(MPI_ANY_SOURCE,MPI_ANY_TAG,MPI_COMM_WORLD,&flag,&m_status); // exist a msg to receiv?
     while (flag!=0)
     {
         switch (m_status.MPI_TAG)
@@ -527,12 +480,12 @@ void MCHybridSOG::read_message()
             //cout<<"TAG STATE received by task "<<task_id<<endl;
             read_state_message();
             break;
-        case TAG_REC :
-            //cout<<"TAG_REC received by task "<<task_id<<endl;
-            AbortTerm();
-            break;
+        case TAG_FINISH : break;
+        case TAG_INITIAL : break;
+        case TAG_SUCC : break;
+        case TAG_AGREGATE : break;
         default :  //cout<<"unknown received "<<status.MPI_TAG<<" by task "<<task_id<<endl;
-            AbortTerm();
+            //AbortTerm();
             break;
             /* int v;
              MPI_Recv(&v, 1, MPI_INT, status.MPI_SOURCE, status.MPI_TAG, MPI_COMM_WORLD, &status);
@@ -556,11 +509,6 @@ void MCHybridSOG::read_state_message()
     MPI_Recv(inmsg, nbytes, MPI_CHAR,m_status.MPI_SOURCE,TAG_STATE,m_comm_world, &m_status);
     m_nbrecv++;
     string *msg_receiv =new string(inmsg,nbytes);
-    /*string nom_file="recept_";
-    nom_file+=to_string(task_id);
-    FILE *fp=fopen(nom_file.c_str(),"a");
-    fprintf(fp,"%s\n",msg_receiv->c_str());
-    fclose(fp);*/
     min_charge=minCharge();
     m_charge[min_charge]++;
     pthread_mutex_lock(&m_spin_msg[min_charge]);
@@ -583,12 +531,7 @@ void MCHybridSOG::send_state_message()
         message_size=s.first->size()+1;
         int destination=s.second;
         read_message();
-        MPI_Send(s.first->c_str(), message_size, MPI_CHAR, destination, TAG_STATE, m_comm_world);
-        /*string nom_file="send_";
-        nom_file+=to_string(task_id);
-    FILE *fp=fopen(nom_file.c_str(),"a");
-    fprintf(fp,"%s\n",s.first->c_str());
-    fclose(fp);*/
+        MPI_Send(s.first->c_str(), message_size, MPI_CHAR, destination, TAG_STATE, m_comm_world);      
         m_nbsend++;
         m_size_mess+=message_size;
         delete s.first;
@@ -599,8 +542,6 @@ void MCHybridSOG::computeDSOG(LDDGraph &g)
 
 {
     m_graph=&g;
-//    MPI_Comm_size(MPI_COMM_WORLD,&n_tasks);
-//    MPI_Comm_rank(MPI_COMM_WORLD,&task_id);
     double tps;
 
     // double  t1=(double)clock() / (double)CLOCKS_PER_SEC;
diff --git a/src/MCHybridSOG.h b/src/MCHybridSOG.h
index ade83246484f4b594484f89a6a558498eea29fc6..6418e3a6d269d5d325d118604a9caaf9fd414097 100644
--- a/src/MCHybridSOG.h
+++ b/src/MCHybridSOG.h
@@ -60,14 +60,7 @@ private:
     MPI_Comm m_comm_world;
     /// \ hash function
     void get_md5(const string &chaine, unsigned char *md_chaine);
-    /// Termination Detection functions
-    inline void ReceiveTermSignal();
-    
-    
-    inline void TermReceivedMsg();
-
-
-
+        
     /// minimum charge function for the load balancing between thread
     inline int minCharge();
     inline bool isNotTerminated();
@@ -100,7 +93,7 @@ private:
     void read_message();
     
     
-    void AbortTerm();
+    
     /// receive state message
     void read_state_message();
     /// send state message
diff --git a/src/main.cpp b/src/main.cpp
index 9e7f9c9fd79f3aa17cae16a70ee5ede916bb2d45..849673fce29d3e2d075f9f45b9c01207729cfcc6 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -28,6 +28,7 @@
 #include "SogKripke.h"
 
 #include "SogKripkeTh.h"
+#include "HybridKripke.h"
 
 
 
@@ -322,12 +323,13 @@ int main(int argc, char** argv)
                         cout<<"N task :"<<n_tasks<<endl;
                         MCHybridSOG DR(R,gprocess, bound,false);
                         LDDGraph g(&DR);
-                        DR.computeDSOG(g);
-                        
+                        DR.computeDSOG(g);                        
                     }
-                    else {
-                        
+                    else {                        
                         cout<<"On the fly Model checker by process "<<task_id<<endl;
+                        auto d = spot::make_bdd_dict();
+                        auto k =
+            std::make_shared<HybridKripke>(d,R.getListTransitionAP(),R.getListPlaceAP());
                     }
                 }