diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index dcc56ac45c9c3e3b04ccff9b5d53e05fe0566395..f4953cc3b80278b1043e7a2978f3cf5f81382792 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -18,7 +18,11 @@ set_target_properties(spot PROPERTIES
   INTERFACE_INCLUDE_DIRECTORIES "/usr/include/spot/"
 )
 
-
+add_library(bddx SHARED IMPORTED) # or STATIC instead of SHARED
+set_target_properties(bddx PROPERTIES
+  IMPORTED_LOCATION "/usr/lib/x86_64-linux-gnu/libbddx.so"
+  INTERFACE_INCLUDE_DIRECTORIES "/usr/include/spot/"
+)
 
 
 
@@ -26,6 +30,10 @@ set_target_properties(spot PROPERTIES
 
 # Hybrid SOG executable
 add_executable(hybrid-sog main.cpp
+  NewNet.cpp
+  NewNet.h
+  CommonSOG.cpp
+  CommonSOG.h
   DistributedSOG.cpp
   DistributedSOG.h
   HybridSOG.cpp
@@ -33,12 +41,22 @@ add_executable(hybrid-sog main.cpp
   threadSOG.cpp
   threadSOG.h
   LDDGraph.cpp
+  LDDGraph.h
   LDDState.cpp
+  LDDState.h
   TransSylvan.cpp
   sylvan_sog.c
+  SpotSogState.cpp
+  SpotSogState.h
+  SpotSogIterator.cpp
+  SpotSogIterator.h
+  SogTwa.cpp
+  SogTwa.h
+
   )
 
 target_link_libraries(hybrid-sog
+  bddx
   spot
   sylvan
   RdP
diff --git a/src/Class_of_state.h b/src/Class_of_state.h
index 38b11a187cfec559d285d766b8d9216f87ec4cad..5c45ea7e9e1cc6d689e69cbcd85a6cff4b301f52 100644
--- a/src/Class_of_state.h
+++ b/src/Class_of_state.h
@@ -1,7 +1,7 @@
 #ifndef CLASS_OF_STATE
 #define CLASS_OF_STATE
 using namespace std;
-#include "bddx.h"
+#include "bdd.h"
 //#include <map.h>
 #include<unordered_map>
 #include <set>
diff --git a/src/CommonSOG.cpp b/src/CommonSOG.cpp
index ead7db62075752e4aacfbc244895e8c095f87bb7..410d9d5b38dbd51487b4a3bed73c50c98e09fc69 100644
--- a/src/CommonSOG.cpp
+++ b/src/CommonSOG.cpp
@@ -172,3 +172,44 @@ unsigned int CommonSOG::getPlacesCount() {
     return m_nbPlaces;
 }
 
+/**** Detect divergence in an agregate ****/
+bool CommonSOG::Set_Div(MDD &M) const
+{
+    if (m_nonObservable.empty())
+    return false;
+	Set::const_iterator i;
+	MDD Reached,From;
+	//cout<<"Ici detect divergence \n";
+	Reached=M;
+	do
+	{
+        From=Reached;
+		for(i=m_nonObservable.begin();!(i==m_nonObservable.end());i++)
+		{
+
+        MDD To= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
+        Reached=lddmc_union_mono(Reached,To);
+				//Reached=To;
+		}
+		if(Reached==From) return true;
+
+	}while(Reached!=lddmc_false && Reached != From);
+   //  cout<<"PAS DE SEQUENCE DIVERGENTE \n";
+	 return false;
+}
+
+/**** Detetc deadlocks ****/
+bool CommonSOG::Set_Bloc(MDD &M) const
+{
+
+   MDD cur=lddmc_true;
+  for(vector<TransSylvan>::const_iterator i = m_tb_relation.begin(); i!=m_tb_relation.end();i++)
+  {
+
+      cur=cur&(TransSylvan(*i).getMinus());
+
+  }
+return ((M&cur)!=lddmc_false);
+	//BLOCAGE
+}
+
diff --git a/src/CommonSOG.h b/src/CommonSOG.h
index 2132dca6f5ac2cc8dbab0d379253cc4993623c3a..8ff04f23577a3cda6a6689f4da05130090b3a513 100644
--- a/src/CommonSOG.h
+++ b/src/CommonSOG.h
@@ -2,7 +2,7 @@
 #define COMMONSOG_H
 #include "LDDGraph.h"
 #include "TransSylvan.h"
-#include "Net.hpp"
+#include "NewNet.h"
 #include <stack>
 
 typedef pair<LDDState *, MDD> couple;
@@ -19,7 +19,7 @@ class CommonSOG
         Set * getNonObservable();
         unsigned int getPlacesCount();
     protected:
-        net m_net;
+        NewNet m_net;
         int m_nbPlaces = 0;
         LDDGraph *m_graph;
         vector<TransSylvan> m_tb_relation;
@@ -28,7 +28,8 @@ class CommonSOG
         Set m_observable;
         Set m_nonObservable;
         Set InterfaceTrans;
-        Set Formula_Trans;
+        Set m_place_proposition;
+
         vector<class Transition> transitions;
 
         MDD Accessible_epsilon(MDD From);
@@ -36,6 +37,8 @@ class CommonSOG
         MDD get_successor(MDD From, int t);
         MDD ImageForward(MDD From);
         MDD Canonize(MDD s, unsigned int level);
+        bool Set_Div(MDD &M) const;
+        bool Set_Bloc(MDD &M) const;
     private:
 };
 
diff --git a/src/DistributedSOG.cpp b/src/DistributedSOG.cpp
index 73832c1ff022f188863bdbb5ec5df39c42417da1..3c5a77cd18cacaaafc41c5963fb336c2a22d4d2f 100644
--- a/src/DistributedSOG.cpp
+++ b/src/DistributedSOG.cpp
@@ -25,13 +25,7 @@ using namespace sylvan;
 /**************************************************/
 
 
-
-
-
-const vector<class Place> *__vplaces = NULL;
-
-
-DistributedSOG::DistributedSOG(const net &R, int BOUND,bool init)
+DistributedSOG::DistributedSOG(const NewNet &R, int BOUND,bool init)
 {
 
 
@@ -47,20 +41,20 @@ DistributedSOG::DistributedSOG(const net &R, int BOUND,bool init)
     m_net=R;
 
     m_init=init;
-    nbPlaces=R.places.size();
+
     int i, domain;
     vector<Place>::const_iterator it_places;
 
     //_______________
     transitions=R.transitions;
-    Observable=R.Observable;
-    NonObservable=R.NonObservable;
-    Formula_Trans=R.Formula_Trans;
-    transitionName=R.transitionName;
+    m_observable=R.Observable;
+    m_nonObservable=R.NonObservable;
+    m_place_proposition=R.m_formula_place;
+    m_transitionName=R.transitionName;
     InterfaceTrans=R.InterfaceTrans;
-    Nb_places=R.places.size();
-    cout<<"Nombre de places : "<<Nb_places<<endl;
-    cout<<"Derniere place : "<<R.places[Nb_places-1].name<<endl;
+    m_nbPlaces=R.places.size();
+    cout<<"Nombre de places : "<<m_nbPlaces<<endl;
+    cout<<"Derniere place : "<<R.places[m_nbPlaces-1].name<<endl;
     // place domain, place bvect, place initial marking and place name
 
 
@@ -72,17 +66,17 @@ DistributedSOG::DistributedSOG(const net &R, int BOUND,bool init)
     M0=lddmc_cube(liste_marques,R.places.size());
     delete []liste_marques;
     // place names
-    __vplaces = &R.places;
+//    __vplaces = &R.places;
 
 
-    uint32_t *prec = new uint32_t[nbPlaces];
-    uint32_t *postc= new uint32_t [nbPlaces];
+    uint32_t *prec = new uint32_t[m_nbPlaces];
+    uint32_t *postc= new uint32_t [m_nbPlaces];
     // Transition relation
     for(vector<Transition>::const_iterator t=R.transitions.begin();
             t!=R.transitions.end(); t++)
     {
         // Initialisation
-        for(i=0; i<nbPlaces; i++)
+        for(i=0; i<m_nbPlaces; i++)
         {
             prec[i]=0;
             postc[i]=0;
@@ -103,8 +97,8 @@ DistributedSOG::DistributedSOG(const net &R, int BOUND,bool init)
             postc[it->first] = postc[it->first] + it->second;
         }
 
-        MDD _minus=lddmc_cube(prec,nbPlaces);
-        MDD _plus=lddmc_cube(postc,nbPlaces);
+        MDD _minus=lddmc_cube(prec,m_nbPlaces);
+        MDD _plus=lddmc_cube(postc,m_nbPlaces);
         m_tb_relation.push_back(TransSylvan(_minus,_plus));
     }
     delete [] prec;
@@ -129,7 +123,7 @@ void *DistributedSOG::doCompute()
 
     Pair S;
 //    pile m_st;
-    unsigned char msg[LENGTH_ID];
+    char msg[LENGTH_ID];
 
     int v_nbmetastate=0;
     int term=0;
@@ -150,7 +144,7 @@ void *DistributedSOG::doCompute()
 
         c->m_lddstate=Complete_meta_state;
 
-    //    lddmc_getsha(Complete_meta_state, msg);
+        lddmc_getsha(Complete_meta_state, msg);
          cout <<"nb task "<<n_tasks<<endl;
         int destination=(int)abs((msg[0])%n_tasks);
 
@@ -158,7 +152,8 @@ void *DistributedSOG::doCompute()
         {
             m_nbmetastate++;
             //m_old_size=lddmc_nodecount(c->m_lddstate);
-            fire=firable_obs(Complete_meta_state);
+
+            Set fire=firable_obs(Complete_meta_state);
             m_st.push(Pair(couple(c,Complete_meta_state),fire));
             m_graph->setInitialState(c);
             m_graph->insert(c);
@@ -204,10 +199,10 @@ void *DistributedSOG::doCompute()
                 reached_class=new LDDState;
 
                 //  lddmc_fprintdot(fp,Complete_meta_state);
-                MDD marking=get_successorMDD(e.first.second,t);
+                MDD marking=get_successor(e.first.second,t);
                 MDD lddmarq=Accessible_epsilon(marking);
                 reached_class->m_lddstate=lddmarq;
-//                lddmc_getsha(lddmarq, msg);
+                lddmc_getsha(lddmarq, msg);
 
                 int destination=(int)abs((msg[0])%n_tasks);
 
@@ -229,7 +224,7 @@ void *DistributedSOG::doCompute()
                         reached_class->Predecessors.insert(reached_class->Predecessors.begin(),LDDEdge(e.first.first,t));
                         m_nbmetastate++;
 
-                        fire=firable_obs(lddmarq);
+                        Set fire=firable_obs(lddmarq);
 
                         m_st.push(Pair(couple(reached_class,lddmarq),fire));
                         nb_success++;
@@ -458,7 +453,7 @@ void DistributedSOG::read_state_message()
         if (!m_graph->find(Agregate))
         {
             m_graph->insert(Agregate);
-            fire=firable_obs(MState);
+            Set fire=firable_obs(MState);
             m_nbmetastate++;
             m_old_size=lddmc_nodecount(Agregate->m_lddstate);
             m_st.push(Pair(couple(Agregate,MState),fire));
@@ -551,70 +546,8 @@ void DistributedSOG::computeDSOG(LDDGraph &g)
 
 
 
-void DistributedSOG::printhandler(ostream &o, int var)
-{
-    o << (*__vplaces)[var/2].name;
-    if (var%2)
-        o << "_p";
-}
-
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-Set DistributedSOG::firable_obs(MDD State)
-{
-    Set res;
-    for(Set::const_iterator i=Observable.begin(); !(i==Observable.end()); i++)
-    {
-
-        //cout<<"firable..."<<endl;
-        MDD succ = lddmc_firing_mono(State,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        if(succ!=lddmc_false)
-        {
-            //cout<<"firable..."<<endl;
-            res.insert(*i);
-        }
-
-    }
-    return res;
-}
-
-MDD DistributedSOG::get_successorMDD(MDD From,int t)
-{
-
-    MDD res=lddmc_firing_mono(From,m_tb_relation[(t)].getMinus(),m_tb_relation[(t)].getPlus());
-    return res;
-}
-
-
-MDD DistributedSOG::Accessible_epsilon(MDD From)
-{
-    MDD M1;
-    MDD M2=From;
-    int it=0;
-    do
-    {
-        M1=M2;
-        for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-        {
-
-            MDD succ= lddmc_firing_mono(M2,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-            M2=lddmc_union_mono(M2,succ);
-            //M2=succ|M2;
-        }
-        //TabMeta[nbmetastate]=M2;
-        //int intsize=sylvan_anodecount(TabMeta,nbmetastate+1);
-        //if(m_MaxIntBdd<intsize)
-        //  m_MaxIntBdd=intsize;
-        it++;
-        //	cout << bdd_nodecount(M2) << endl;
-    }
-    while(M1!=M2);
-    return M2;
-}
-
 
 string to_hex(unsigned char s)
 {
@@ -639,7 +572,7 @@ char * DistributedSOG::concat_string(const char *s1,int longueur1,const char *s2
 }
 
 
-void DistributedSOG::strcpySHA(unsigned char *dest,const unsigned char *source)
+void DistributedSOG::strcpySHA(char *dest,const char *source)
 {
     for (int i=0; i<LENGTH_ID; i++)
     {
@@ -708,15 +641,15 @@ MDD DistributedSOG::decodage_message(char *chaine)
     nb_marq=(nb_marq<<8) | (unsigned char)chaine[0];
 
     unsigned int index=2;
-    uint32_t list_marq[nbPlaces];
+    uint32_t list_marq[m_nbPlaces];
     for (unsigned int i=0; i<nb_marq; i++)
     {
-        for (unsigned int j=0; j<nbPlaces; j++)
+        for (unsigned int j=0; j<m_nbPlaces; j++)
         {
             list_marq[j]=chaine[index];
             index++;
         }
-        MDD N=lddmc_cube(list_marq,nbPlaces);
+        MDD N=lddmc_cube(list_marq,m_nbPlaces);
         M=lddmc_union_mono(M,N);
     }
     return M;
@@ -730,7 +663,7 @@ void DistributedSOG::MarquageString(char *dest,const char *source)
     int index=1;
     for (int nb=0; nb<length; nb++)
     {
-        for (int i=0; i<nbPlaces; i++)
+        for (int i=0; i<m_nbPlaces; i++)
         {
             dest[index]=(unsigned char)source[index]+(unsigned char)'0';
             printf("%d",source[index]);
@@ -742,95 +675,6 @@ void DistributedSOG::MarquageString(char *dest,const char *source)
 }
 
 /******************************************************************************/
-MDD DistributedSOG::ImageForward(MDD From)
-{
-    MDD Res=lddmc_false;
-    for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-    {
-        MDD succ= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-         Res=lddmc_union_mono(Res,succ);
-    }
-    return Res;
-}
-
-
-/*----------------------------------------------CanonizeR()------------------------------------*/
-MDD DistributedSOG::Canonize(MDD s,unsigned int level)
-{
-    if (level>nbPlaces || s==lddmc_false) return lddmc_false;
-    if(isSingleMDD(s))   return s;
-    MDD s0=lddmc_false,s1=lddmc_false;
 
-    bool res=false;
-    do
-    {
-        if (get_mddnbr(s,level)>1)
-        {
-            s0=ldd_divide_rec(s,level);
-            s1=ldd_minus(s,s0);
-            res=true;
-        }
-        else
-            level++;
-    }
-    while(level<nbPlaces && !res);
-
-
-    if (s0==lddmc_false && s1==lddmc_false)
-        return lddmc_false;
-    // if (level==nbPlaces) return lddmc_false;
-    MDD Front,Reach;
-    if (s0!=lddmc_false && s1!=lddmc_false)
-    {
-        Front=s1;
-        Reach=s1;
-        do
-        {
-            // cout<<"premiere boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s0 = ldd_minus(s0,Front);
-        }
-        while((Front!=lddmc_false)&&(s0!=lddmc_false));
-    }
-    if((s0!=lddmc_false)&&(s1!=lddmc_false))
-    {
-        Front=s0;
-        Reach = s0;
-        do
-        {
-            //  cout<<"deuxieme boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s1 = ldd_minus(s1,Front);
-        }
-        while( Front!=lddmc_false && s1!=lddmc_false );
-    }
-
-
-
-    MDD Repr=lddmc_false;
-
-    if (isSingleMDD(s0))
-    {
-        Repr=s0;
-    }
-    else
-    {
-
-        Repr=Canonize(s0,level);
-
-    }
-
-    if (isSingleMDD(s1))
-        Repr=lddmc_union_mono(Repr,s1);
-    else
-        Repr=lddmc_union_mono(Repr,Canonize(s1,level));
-
-
-    return Repr;
-
-
-}
 
 
diff --git a/src/DistributedSOG.h b/src/DistributedSOG.h
index ed845624cee0b7499ac6d6bbec6637fa6d0d3df7..d608110c62b977eabb3e65b0572268e89cff5b48 100644
--- a/src/DistributedSOG.h
+++ b/src/DistributedSOG.h
@@ -3,7 +3,7 @@
 // #include "RdPBDD.h"
 #include <stack>
 #include <vector>
-#include "Net.hpp"
+#include "NewNet.h"
 // #include "MDD.h"
 //#include "MDGraph.h"
 //#include "bvec.h"
@@ -28,11 +28,12 @@
 //#include <boost/serialization/string.hpp>
 //#include <boost/mpi.hpp>
 #include <iostream>
-#include <queue>
+
 #include <string>
 //#include <boost/serialization/string.hpp>
 #include <time.h>
 #include <chrono>
+#include "CommonSOG.h"
 // namespace mpi = boost::mpi;
 
 #define MASTER 0
@@ -40,20 +41,17 @@
 
 extern int n_tasks, task_id;
 
-typedef pair<LDDState *, MDD> couple;
-typedef pair<couple, Set> Pair;
-typedef stack<Pair> pile;
+
 
 // typedef vector<Trans> vec_trans;
-class DistributedSOG {
+class DistributedSOG : public CommonSOG{
  public:
-  DistributedSOG(const net &, int BOUND = 32, bool init = false);
+  DistributedSOG(const NewNet &, int BOUND = 32, bool init = false);
   void buildFromNet(int index);
   void computeDSOG(LDDGraph &g);
   void BuildInitialState(LDDState *m_state, MDD mdd);
   void computeSeqSOG(LDDGraph &g);
   virtual ~DistributedSOG();
-  static void printhandler(ostream &o, int var);
   static void *threadHandler(void *context);
   void *doCompute();
   void NonEmpty();
@@ -61,34 +59,20 @@ class DistributedSOG {
 
  protected:
  private:
-  LDDGraph *m_graph;
-  MDD LDDAccessible_epsilon(MDD *m);
-  MDD Accessible_epsilon(MDD From);
-  Set firable_obs(MDD State);
-  MDD get_successorMDD(MDD From, int t);
+
+
   int minCharge();
   bool isNotTerminated();
   int Terminate();
-  void strcpySHA(unsigned char *dest, const unsigned char *source);
+  void strcpySHA(char *dest, const char *source);
   char *concat_string(const char *s1, int longueur1, const char *s2,
                       int longueur2, char *dest);
   void sha256(LDDState *state, char output[65]);
-  //-----Original defined as members
-  vector<class Transition> transitions;
-  Set Observable;
-  Set NonObservable;
-  map<string, int> transitionName;
-  Set InterfaceTrans;
-  Set Formula_Trans;
-  unsigned int Nb_places;
+
   MDD M0;
-  LDDState m_M0;
+
   MDD currentvar;
-  // vector<TransSylvan> m_relation;
-  //        vec_trans m_tb_relation[16];
 
-  //-----------------
-  vector<TransSylvan> m_tb_relation;
   int m_NbIt;
   int m_itext, m_itint;
   int m_MaxIntBdd;
@@ -109,27 +93,21 @@ class DistributedSOG {
 
   MPI_Request m_request;
 
-  net m_net;
-  int m_bound, m_init;
+
+  int  m_init;
   int tempCanoniz = 0;
   int tempS = 0;
   int tempR = 0;
   long m_sizeMsg = 0;
   long m_sizeMsgCanoniz = 0;
 
-  std::queue<char *> m_queue;  // empty queue
 
-  int nbPlaces;
   void convert_wholemdd_string(MDD cmark, char **result, unsigned int &length);
   MDD decodage_message(char *chaine);
   void read_state_message();
   int nbsend = 0, nbrecv = 0;
   int total_nb_send = 0, total_nb_recv = 0;
-  Set fire;
-  MDD Canonize(MDD s, unsigned int level);
-  MDD ImageForward(MDD From);
 
-  // named_mutex m_initial_mtx{open_or_create, "initial"};
 };
 
 #endif  // DISTRIBUTEDSOG_H
diff --git a/src/HybridSOG.cpp b/src/HybridSOG.cpp
index 02c7b65549189792d66ca85ce12906d03a3dcba5..8ca3114fbe84ef951d22f668db67ba40b54a6802 100644
--- a/src/HybridSOG.cpp
+++ b/src/HybridSOG.cpp
@@ -35,7 +35,7 @@ using namespace sylvan;
 
 
 
-const vector<class Place> *_vplaces = NULL;
+
 
 /*void my_error_handler_dist(int errcode) {
     cout<<"errcode = "<<errcode<<endl;
@@ -50,7 +50,7 @@ const vector<class Place> *_vplaces = NULL;
 } */
 
 
-HybridSOG::HybridSOG(const net &R, int BOUND,bool init)
+HybridSOG::HybridSOG(const NewNet &R, int BOUND,bool init)
 {
 
 
@@ -74,10 +74,10 @@ HybridSOG::HybridSOG(const net &R, int BOUND,bool init)
     init_gc_seq();
     //_______________
     transitions=R.transitions;
-    Observable=R.Observable;
-    NonObservable=R.NonObservable;
-    Formula_Trans=R.Formula_Trans;
-    transitionName=R.transitionName;
+    m_observable=R.Observable;
+    m_nonObservable=R.NonObservable;
+    m_place_proposition=R.m_formula_place;
+    m_transitionName=R.transitionName;
     InterfaceTrans=R.InterfaceTrans;
 
     m_nbPlaces=R.places.size();
@@ -95,7 +95,7 @@ HybridSOG::HybridSOG(const net &R, int BOUND,bool init)
 
     delete []liste_marques;
     // place names
-    _vplaces = &R.places;
+
 
 
     uint32_t *prec = new uint32_t[m_nbPlaces];
@@ -829,15 +829,6 @@ void HybridSOG::computeDSOG(LDDGraph &g)
 }
 
 
-
-void HybridSOG::printhandler(ostream &o, int var)
-{
-    o << (*_vplaces)[var/2].name;
-    if (var%2)
-        o << "_p";
-}
-
-
 int HybridSOG::minCharge()
 {
     int pos=1;
@@ -854,65 +845,6 @@ int HybridSOG::minCharge()
 }
 
 
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-Set HybridSOG::firable_obs(MDD State)
-{
-    Set res;
-    for(Set::const_iterator i=Observable.begin(); !(i==Observable.end()); i++)
-    {
-
-        //cout<<"firable..."<<endl;
-        MDD succ = lddmc_firing_mono(State,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        if(succ!=lddmc_false)
-        {
-            res.insert(*i);
-        }
-    }
-    return res;
-}
-
-
-
-
-MDD HybridSOG::get_successor(MDD From,int t)
-{
-    return lddmc_firing_mono(From,m_tb_relation[t].getMinus(),m_tb_relation[t].getPlus());
-}
-
-
-MDD HybridSOG::Accessible_epsilon(MDD From)
-{
-    MDD M1;
-    MDD M2=From;
-    do
-    {
-        M1=M2;
-        for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-        {
-
-            MDD succ= lddmc_firing_mono(M2,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-            M2=lddmc_union_mono(succ,M2);
-            //M2=succ|M2;
-        }
-        //	cout << bdd_nodecount(M2) << endl;
-    }
-    while(M1!=M2);
-    return M2;
-}
-
-
-/*string to_hex(unsigned char s)
-{
-    stringstream ss;
-    ss << hex << (int) s;
-    return ss.str();
-} */
-
-
 void HybridSOG::strcpySHA(unsigned char *dest,const unsigned char *source)
 {
     for (int i=0; i<LENGTH_ID; i++)
@@ -979,109 +911,14 @@ MDD HybridSOG::decodage_message(const char *chaine)
 
 
 
-/******************************************************************************/
-MDD HybridSOG::ImageForward(MDD From)
-{
-    MDD Res=lddmc_false;
-    for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-    {
-        MDD succ= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        Res=lddmc_union_mono(Res,succ);
-    }
-    return Res;
-}
-
 
-/*----------------------------------------------CanonizeR()------------------------------------*/
-MDD HybridSOG::Canonize(MDD s,unsigned int level)
-{
-    if (level>m_nbPlaces || s==lddmc_false) return lddmc_false;
-    if(isSingleMDD(s))   return s;
-    MDD s0=lddmc_false,s1=lddmc_false;
-
-    bool res=false;
-    do
-    {
-        if (get_mddnbr(s,level)>1)
-        {
-            s0=ldd_divide_rec(s,level);
-            s1=ldd_minus(s,s0);
-            res=true;
-        }
-        else
-            level++;
-    }
-    while(level<m_nbPlaces && !res);
-
-
-    if (s0==lddmc_false && s1==lddmc_false)
-        return lddmc_false;
-    // if (level==nbPlaces) return lddmc_false;
-    MDD Front,Reach;
-    if (s0!=lddmc_false && s1!=lddmc_false)
-    {
-        Front=s1;
-        Reach=s1;
-        do
-        {
-            // cout<<"premiere boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s0 = ldd_minus(s0,Front);
-        }
-        while((Front!=lddmc_false)&&(s0!=lddmc_false));
-    }
-    if((s0!=lddmc_false)&&(s1!=lddmc_false))
-    {
-        Front=s0;
-        Reach = s0;
-        do
-        {
-            //  cout<<"deuxieme boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s1 = ldd_minus(s1,Front);
-        }
-        while( Front!=lddmc_false && s1!=lddmc_false );
-    }
 
-
-
-    MDD Repr=lddmc_false;
-
-    if (isSingleMDD(s0))
-    {
-        Repr=s0;
-    }
-    else
-    {
-
-        Repr=Canonize(s0,level);
-
-    }
-
-    if (isSingleMDD(s1))
-        Repr=lddmc_union_mono(Repr,s1);
-    else
-        Repr=lddmc_union_mono(Repr,Canonize(s1,level));
-
-
-    return Repr;
-
-
-}
 void * HybridSOG::threadHandler(void *context)
 {
 
     return ((HybridSOG*)context)->doCompute();
 }
 
-
-void printchaine(string *s) {
-    for (int i=0;i<s->size();i++)
-        printf("%d",(s->at(i)-1));
-}
-
 void HybridSOG::convert_wholemdd_stringcpp(MDD cmark,string &res)
 {
     typedef pair<string,MDD> Pair_stack;
diff --git a/src/HybridSOG.h b/src/HybridSOG.h
index 8011e98f1226c73c4c5392e6d9a889b5b44a0363..f480981e0704aaae9f072d1c5f75b505c63b322b 100644
--- a/src/HybridSOG.h
+++ b/src/HybridSOG.h
@@ -3,7 +3,7 @@
 
 #include <stack>
 #include <vector>
-#include "Net.hpp"
+#include "NewNet.h"
 // #include "MDD.h"
 //#include "MDGraph.h"
 //#include "bvec.h"
@@ -29,6 +29,7 @@
 //#include <boost/serialization/string.hpp>
 #include <time.h>
 #include <chrono>
+#include "CommonSOG.h"
 // namespace mpi = boost::mpi;
 
 //#define MASTER 0
@@ -36,125 +37,103 @@
 extern unsigned int nb_th;
 extern int n_tasks, task_id;
 
-typedef pair<LDDState *, MDD> couple;
-typedef pair<couple, Set> Pair;
-typedef stack<Pair> pile;
+
 
 typedef pair<string *, unsigned int> MSG;
 
 typedef stack<MSG> pile_msg;
 
 // typedef vector<Trans> vec_trans;
-class HybridSOG {
- public:
-  HybridSOG(const net &, int BOUND = 32, bool init = false);
-  void buildFromNet(int index);
-  /// principal functions to construct the SOG
-  void computeDSOG(LDDGraph &g);
-  virtual ~HybridSOG();
-  static void printhandler(ostream &o, int var);
-  static void *threadHandler(void *context);
-  void *doCompute();
-
- protected:
- private:
-  /// \ hash function
-  void get_md5(const string &chaine, unsigned char *md_chaine);
-  /// Termination Detection functions
-  inline void ReceiveTermSignal();
-  inline void TermSendMsg();
-  inline void startTermDetectionByMaster();
-  inline void TermReceivedMsg();
-  LDDGraph *m_graph;
-  /// saturation
-  inline MDD Accessible_epsilon(MDD From);
-  inline MDD ImageForward(MDD From);
-  /// Observable Transition
-  Set firable_obs(MDD State);
-  ///
-  MDD get_successor(MDD From, int t);
-
-  /// minimum charge function for the load balancing between thread
-  inline int minCharge();
-  inline bool isNotTerminated();
-  /// Copie string of caracter
-  void strcpySHA(unsigned char *dest, const unsigned char *source);
-
-  vector<class Transition> transitions;
-  Set Observable;
-  Set NonObservable;
-  map<string, int> transitionName;
-  Set InterfaceTrans;
-  Set Formula_Trans;
-  unsigned int m_nbPlaces;
-  MDD M0;
-  LDDState m_M0;
-
-  //-----------------
-  vector<TransSylvan> m_tb_relation;
-  int m_NbIt;
-  int m_itext, m_itint;
-  int m_MaxIntBdd;
-
-  int m_nbmetastate;
-
-  pile m_st[128];
-  pile_msg m_msg[128];
-
-  // void DisplayMessage(const char *chaine);
-
-  //        int n_tasks, task_id;
-
-  int m_charge[128];
-
-  net m_net;
-  int m_bound, m_init;
-
-  /// Convert an MDD to a string caracter (for the send)
-  void convert_wholemdd_stringcpp(MDD cmark, string &chaine);
-  /// Convert a string caracter to an MDD
-  MDD decodage_message(const char *chaine);
-  /// there is a message to receive?
-  void read_message();
-  /// receive termination message
-  void read_termination();
-  void AbortTerm();
-  /// receive state message
-  void read_state_message();
-  /// send state message
-  void send_state_message();
-  /// canonicalization of an aggregate represented by an MDD
-  MDD Canonize(MDD s, unsigned int level);
-
-  int m_nb_thread;
-  pthread_t m_list_thread[128];
-
-  int m_id_thread;
-  /// Mutex declaration
-  pthread_mutex_t m_mutex;
-  pthread_mutex_t m_graph_mutex;
-  pthread_mutex_t m_gc_mutex;
-  pthread_mutex_t m_supervise_gc_mutex;
-  unsigned int m_gc;
-
-  pthread_mutex_t m_mutex_stack[128];
-  pthread_mutex_t m_spin_stack[128];
-  pthread_mutex_t m_spin_msg[128];
-  // pthread_mutex_t m_spin_charge;
-  pthread_spinlock_t m_spin_md5;
-  pthread_mutex_t m_spin_working;
-  unsigned int m_working = 0;
-
-  // unsigned int m_count_thread_working;
-  bool m_Terminated = false;
-  unsigned long m_size_mess = 0;
-  int m_nbsend = 0, m_nbrecv = 0;
-  int m_total_nb_send = 0, m_total_nb_recv = 0;
-
-  MPI_Status m_status;
-  bool m_Terminating = false;
-
-  // named_mutex m_initial_mtx{open_or_create, "initial"};
+class HybridSOG : public CommonSOG
+{
+public:
+    HybridSOG(const NewNet &, int BOUND = 32, bool init = false);
+    void buildFromNet(int index);
+    /// principal functions to construct the SOG
+    void computeDSOG(LDDGraph &g);
+    virtual ~HybridSOG();
+    static void *threadHandler(void *context);
+    void *doCompute();
+
+protected:
+private:
+    /// \ hash function
+    void get_md5(const string &chaine, unsigned char *md_chaine);
+    /// Termination Detection functions
+    inline void ReceiveTermSignal();
+    inline void TermSendMsg();
+    inline void startTermDetectionByMaster();
+    inline void TermReceivedMsg();
+
+
+
+    /// minimum charge function for the load balancing between thread
+    inline int minCharge();
+    inline bool isNotTerminated();
+    /// Copie string of caracter
+    void strcpySHA(unsigned char *dest, const unsigned char *source);
+
+    MDD M0;
+
+    int m_NbIt;
+    int m_itext, m_itint;
+    int m_MaxIntBdd;
+
+    int m_nbmetastate;
+
+    pile m_st[128];
+    pile_msg m_msg[128];
+
+    // void DisplayMessage(const char *chaine);
+
+    //        int n_tasks, task_id;
+
+    int m_charge[128];
+    int m_init;
+
+    /// Convert an MDD to a string caracter (for the send)
+    void convert_wholemdd_stringcpp(MDD cmark, string &chaine);
+    /// Convert a string caracter to an MDD
+    MDD decodage_message(const char *chaine);
+    /// there is a message to receive?
+    void read_message();
+    /// receive termination message
+    void read_termination();
+    void AbortTerm();
+    /// receive state message
+    void read_state_message();
+    /// send state message
+    void send_state_message();
+
+
+    int m_nb_thread;
+    pthread_t m_list_thread[128];
+
+    int m_id_thread;
+    /// Mutex declaration
+    pthread_mutex_t m_mutex;
+    pthread_mutex_t m_graph_mutex;
+    pthread_mutex_t m_gc_mutex;
+    pthread_mutex_t m_supervise_gc_mutex;
+    unsigned int m_gc;
+
+    pthread_mutex_t m_mutex_stack[128];
+    pthread_mutex_t m_spin_stack[128];
+    pthread_mutex_t m_spin_msg[128];
+    // pthread_mutex_t m_spin_charge;
+    pthread_spinlock_t m_spin_md5;
+    pthread_mutex_t m_spin_working;
+    unsigned int m_working = 0;
+
+    // unsigned int m_count_thread_working;
+    bool m_Terminated = false;
+    unsigned long m_size_mess = 0;
+    int m_nbsend = 0, m_nbrecv = 0;
+    int m_total_nb_send = 0, m_total_nb_recv = 0;
+
+    MPI_Status m_status;
+    bool m_Terminating = false;
+
 };
 
 #endif  // HybridSOG_H
diff --git a/src/LDDGraph.cpp b/src/LDDGraph.cpp
index 8a7bc244ee542a6ff27aedd88c064bdebdfd1d44..13a89d31b4646fda81c3f422c23739b11eebd0ed 100644
--- a/src/LDDGraph.cpp
+++ b/src/LDDGraph.cpp
@@ -2,7 +2,7 @@
 #include <sylvan.h>
 #include <stdio.h>
 #include <string.h>
-
+#include <map>
 LDDGraph::~LDDGraph()
 {
     //dtor
@@ -14,6 +14,10 @@ void LDDGraph::setInitialState(LDDState *c)
 	m_currentstate=m_initialstate=c;
 
 }
+
+LDDState* LDDGraph::getInitialState() const {
+    return m_GONodes.at(0);
+}
 /*----------------------find()----------------*/
 LDDState * LDDGraph::find(LDDState* c)
 {
@@ -104,7 +108,7 @@ void LDDGraph::printCompleteInformation()
 	char c;
 	cin>>c;
 	//InitVisit(initialstate,n);
-	m_tab=new MDD[(int)m_nbStates];
+
 	size_t n=1;
 	//cout<<"NB BDD NODE : "<<NbBddNode(initialstate,n)<<endl;
 	NbBddNode(m_initialstate,n);
@@ -119,13 +123,10 @@ void LDDGraph::printCompleteInformation()
 		size_t n=1;
 		 printGraph(m_initialstate,n);
 	}
-
-
 }
 /*----------------------InitVisit()------------------------*/
 void LDDGraph::InitVisit(LDDState * S,size_t nb)
 {
-
 	if(nb<=m_nbStates)
 	{
 		S->m_visited=false;
@@ -172,33 +173,33 @@ void LDDGraph::printGraph(LDDState *s,size_t &nb)
 /*---------void print_successors_class(Class_Of_State *)------------*/
 void LDDGraph::printsuccessors(LDDState *s)
 {
-	/*Edges::const_iterator i;
-	cout<<bddtable<<s->class_state<<endl;
-	if(s->boucle)
-		cout<<"\n\tON BOUCLE DESSUS AVEC EPSILON\n";
-	if(s->blocage)
-		cout<<"\n\tEXISTENCE D'UN ETAT BLOCANT\n";
-	cout<<"\n\tSES SUCCESSEURS SONT  ( "<<s->Successors.size()<<" ) :\n\n";
-	getchar();
-	for(i =s->Successors.begin();!(i==s->Successors.end());i++)
-	{
-		cout<<" \t- t"<<(*i).second<<" ->";
-		cout<<bddtable<<(*i).first->class_state<<endl;
-		getchar();
-	}*/
 	cout<<"Not implemented yet!"<<endl;
 }
 /*---------void printpredescessors(Class_Of_State *)------------*/
 void LDDGraph::printpredecessors(LDDState *s)
 {
-	/*Edges::const_iterator i;
-	cout<<"\n\tSES PREDESCESSEURS SONT  ( "<<s->Predecessors.size()<<" ) :\n\n";
-	getchar();
-	for(i =s->Predecessors.begin();!(i==s->Predecessors.end());i++)
-	{
-		cout<<" \t- t"<<(*i).second<<" ->";
-		cout<<bddtable<<(*i).first->class_state<<endl;
-		getchar();
-	}*/
 	cout<<"Not implemented yet!"<<endl;
 }
+/*** Giving a position in m_GONodes Returns an LDDState ****/
+LDDState *LDDGraph::getLDDStateById(unsigned int id) {
+    return m_GONodes.at(id);
+}
+
+string LDDGraph::getTransition(int pos) {
+    cout<<"********** Pos "<<pos<<endl;
+    map<string,int>::iterator it=m_transition->begin();
+    while(it != m_transition->end())
+    {
+        if(it->second == pos)
+        return it->first;
+        it++;
+    }
+    return it->first;
+}
+
+void LDDGraph::setTransition(map<string,int>& list_transitions) {
+    m_transition=&list_transitions;
+}
+
+//void LDDGraph::setTransition(vector<string> list)
+
diff --git a/src/LDDGraph.h b/src/LDDGraph.h
index 4399850d93fa6a27c57e1e763da4e3bae0cdddf6..3c1b356dae33d2e4891827dca50c3db89dec2d51 100755
--- a/src/LDDGraph.h
+++ b/src/LDDGraph.h
@@ -4,18 +4,21 @@
 //#include "LDDStateExtend.h"
 using namespace std;
 #include <iostream>
-
+#include <map>
 typedef set<int> Set;
 typedef vector<LDDState*> MetaLDDNodes;
 
 class LDDGraph
 {
     private:
-        MDD * m_tab;
+        map<string,int>* m_transition;
 		void printGraph(LDDState *, size_t &);
 
 	public:
+        string getTransition(int pos);
+        void setTransition(map<string,int>& list_transitions);
         MetaLDDNodes m_GONodes;
+        LDDState *getLDDStateById(unsigned int id);
 		void Reset();
 		LDDState *m_initialstate;
 		LDDState *m_currentstate;
@@ -35,6 +38,7 @@ class LDDGraph
 		void insert(LDDState*);
 		LDDGraph() {m_nbStates=m_nbArcs=m_nbMarking=0;}
 		void setInitialState(LDDState*);  //Define the initial state of this graph
+		LDDState* getInitialState() const;
 		void printCompleteInformation();
 		virtual ~LDDGraph();
 };
diff --git a/src/LDDState.cpp b/src/LDDState.cpp
index 616246c9f50feee32877293a08139d3907444bc6..a6f372b3af40b1a4f516c2de908a5cbc5aa4659e 100644
--- a/src/LDDState.cpp
+++ b/src/LDDState.cpp
@@ -24,3 +24,7 @@ bool LDDState::isVirtual() {
 void LDDState::setVirtual() {
     m_virtual=true;
 }
+
+vector<pair<LDDState*, int>>* LDDState::getSuccessors() {
+    return &Successors;
+}
diff --git a/src/LDDState.h b/src/LDDState.h
index 17b342002c7c96195fc97d3f8b871cf07c50a12e..4337d85aa02a692107d5cc4382a10c31d06156fd 100755
--- a/src/LDDState.h
+++ b/src/LDDState.h
@@ -16,6 +16,7 @@ class LDDState {
   virtual ~LDDState();
   Set firable;
   void* Class_Appartenance;
+  vector<pair<LDDState*, int>>* getSuccessors();
   vector<pair<LDDState*, int> > Predecessors, Successors;
   pair<LDDState*, int> LastEdge;
   void setLDDValue(MDD m);
@@ -28,7 +29,10 @@ class LDDState {
   bool m_visited;
   bool isVirtual();
   void setVirtual();
-
+  void setDiv(bool di) {m_boucle=di;}
+  bool isDiv() {return m_boucle;}
+  void setDeadLock(bool de) {m_blocage=de;}
+  bool isDeadLock() {return m_blocage;}
  protected:
  private:
   bool m_virtual = false;
diff --git a/src/NewNet.cpp b/src/NewNet.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..e9d7625eca23b737b040dae2caa1eb7845ebbd49
--- /dev/null
+++ b/src/NewNet.cpp
@@ -0,0 +1,551 @@
+#include "NewNet.h"
+#include <spot/misc/version.hh>
+#include <spot/twaalgos/dot.hh>
+#include <spot/tl/parse.hh>
+#include <spot/tl/print.hh>
+#include <spot/twaalgos/translate.hh>
+#include <spot/twaalgos/emptiness.hh>
+
+
+#include <algorithm>
+#include <ext/hash_map>
+#include <iomanip>
+#include <iostream>
+#include <fstream>
+#include <map>
+#include <string>
+#include <vector>
+
+
+#define TAILLEBUFF 500
+using namespace std;
+/***********************************************************/
+/*                      class Node                         */
+/***********************************************************/
+
+void Node::addPre(int node, int valuation) {
+  pair<int, int> x(node, valuation);
+  pre.push_back(x);
+}
+
+void Node::addPost(int node, int valuation) {
+  pair<int, int> x(node, valuation);
+  post.push_back(x);
+}
+
+void Node::addInhibitor(int node, int valuation) {
+  pair<int, int> x(node, valuation);
+  inhibitor.push_back(x);
+}
+
+void Node::addPreAuto(int node, int valuation) {
+  pair<int, int> x(node, valuation);
+  preAuto.push_back(x);
+}
+
+void Node::addPostAuto(int node, int valuation) {
+  pair<int, int> x(node, valuation);
+  postAuto.push_back(x);
+}
+
+void Node::addReset(int node) { reset.push_back(node); }
+
+/***********************************************************/
+/*                      class RdPE                         */
+/***********************************************************/
+NewNet::NewNet(const char *f, const char *Formula_trans, const char *Int_trans) {
+
+  cout << "CREATION D'UN NOUVEAU SOUS-RESEAU \n";
+  if (create(f)) {
+    for (vector<class Place>::iterator p = places.begin(); p != places.end();
+         p++) {
+      sort(p->pre.begin(), p->pre.end());
+      sort(p->post.begin(), p->post.end());
+    }
+    for (vector<class Transition>::iterator p = transitions.begin();
+         p != transitions.end(); p++) {
+      sort(p->pre.begin(), p->pre.end());
+      sort(p->post.begin(), p->post.end());
+    }
+  } else {
+    places.clear();
+    transitions.clear();
+    placeName.clear();
+    transitionName.clear();
+  }
+  if (strlen(Formula_trans) > 0) {
+    cout<<"transitions de la formule non vide \n";
+
+    Set_Formula_Trans(Formula_trans);
+    if (strlen(Int_trans) > 0) {
+      Set_Interface_Trans(Int_trans);
+      // cout<<"transitions de l'interface non vide \n";
+    }
+    cout << "______________66666666666666666666666______________________\n";
+    set_union(InterfaceTrans.begin(), InterfaceTrans.end(),
+              Formula_Trans.begin(), Formula_Trans.end(),
+              inserter(Observable, Observable.begin()));
+    Set_Non_Observables();
+  } else
+    for (unsigned int i = 0; i < transitions.size(); i++) Observable.insert(i);
+  cout << "FIN CREATION \n";
+}
+/***************************** Constructor for Model checker******************/
+NewNet::NewNet(const char *f, const set<string> & f_trans) {
+
+  cout << "CREATION D'UN NOUVEAU SOUS-RESEAU \n";
+  if (create(f)) {
+    for (vector<class Place>::iterator p = places.begin(); p != places.end();
+         p++) {
+      sort(p->pre.begin(), p->pre.end());
+      sort(p->post.begin(), p->post.end());
+    }
+    for (vector<class Transition>::iterator p = transitions.begin();
+         p != transitions.end(); p++) {
+      sort(p->pre.begin(), p->pre.end());
+      sort(p->post.begin(), p->post.end());
+    }
+  } else {
+    places.clear();
+    transitions.clear();
+    placeName.clear();
+    transitionName.clear();
+  }
+  if (f_trans.size() > 0) {
+    cout<<"Transition set of formula is not empty\n";
+    for (set<string>::iterator p=f_trans.begin();p!=f_trans.end();p++) {
+        cout<<"Transition observable :"<<*p<<endl;
+    }
+    setListObservable(f_trans);
+    //for(Set::iterator p=Formula_Trans.begin();p!=Formula_Trans
+
+    cout << "______________66666666666666666666666______________________\n";
+    cout<<"Formula trans size "<<Formula_Trans.size()<<endl;
+    cout<<"Interface trans size "<<InterfaceTrans.size()<<endl;
+    set_union(InterfaceTrans.begin(), InterfaceTrans.end(),
+              Formula_Trans.begin(), Formula_Trans.end(),
+              inserter(Observable, Observable.begin()));
+    Set_Non_Observables();
+  } else
+    for (unsigned int i = 0; i < transitions.size(); i++) Observable.insert(i);
+  cout << "FIN CREATION \n";
+}
+/*---------------------------------Init Set of  transitions
+ * ------------------------------*/
+ void NewNet::setListObservable(const set<string> & list_t) {
+    int pos_trans(TRANSITIONS T, string trans);
+    for (set<string>::const_iterator i=list_t.begin();i!=list_t.end();i++) {
+        int pos = pos_trans(transitions, *i);
+        if (pos==-1) {
+            cout<<"Error: "<<*i<<" is not a transition!"<<endl;
+            // Check if the proposition corresponds to a place
+            map<string, int>::iterator pi = placeName.find(*i);
+            if (pi!=placeName.end()) cout<<"Place was found!"<<endl;
+            m_formula_place.insert(pi->second);
+
+        } else {
+            Formula_Trans.insert(pos);
+            cout<<"Transition found pos="<<pos<<endl;
+            map<string,int>::iterator ti=transitionName.find(*i);
+            cout<<"pos= "<<ti->second<<endl;
+        }
+    }
+ }
+
+/*---------------------------------Set_formula_trans()------------------*/
+bool NewNet::Set_Formula_Trans(const char *f) {
+  FILE *in;
+  int i, nb;
+
+  //	cout<<"ici set formula transitions \n";
+  int pos_trans(TRANSITIONS, string);
+  char Buff[TAILLEBUFF], *z;
+
+
+  in = fopen(f, "r");
+  if (in == NULL) {
+    cout << "file " << f << " doesn't exist" << endl;
+    exit(1);
+  }
+  int nb_formula_trans;
+  fscanf(in, "%d\n", &nb_formula_trans);
+  nb = fread(Buff, 1, TAILLEBUFF - 1, in);
+  Buff[nb] = '\0';
+  z = strtok(Buff, " \t\n");
+  cout << "taille " << TAILLEBUFF << " buff " << Buff << " z: " << z << endl;
+  for (i = 0; i < nb_formula_trans; i++) {
+    cout << " z: " << z << endl;
+    if (z == NULL) {
+      cout << "error in formula trans format " << endl;
+      return false;
+    }
+    string tmp(z);
+    int pos = pos_trans(transitions, tmp);
+    if (pos == -1) {
+      cout << z << "    Error??? : observale transition " << tmp
+           << " doesn't exist \n";
+      // return false;
+    } else
+      Formula_Trans.insert(pos);
+    /*cout<<"insertion de :"<<transitions[pos].name<<endl;*/
+    z = strtok(NULL, " \t\n");
+    if (z == NULL) {
+      nb = fread(Buff, 1, TAILLEBUFF - 1, in);
+      Buff[nb] = '\0';
+      z = strtok(Buff, " \t\n");
+    }
+  }
+  fclose(in);
+  return true;
+}
+/*---------------------------------Set_Interface_trans()------------------*/
+bool NewNet::Set_Interface_Trans(const char *f) {
+  FILE *in;
+  int i, nb;
+  int pos_trans(TRANSITIONS, string);
+  char Buff[TAILLEBUFF], *z;
+  in = fopen(f, "r");
+  if (in == NULL) {
+    cout << "file " << f << " doesn't exist" << endl;
+    exit(1);
+  }
+  int int_trans;
+  fscanf(in, "%d\n", &int_trans);
+  nb = fread(Buff, 1, TAILLEBUFF - 1, in);
+  Buff[nb] = '\0';
+  z = strtok(Buff, " \t\n");
+  cout << "taille " << TAILLEBUFF << " buff " << Buff << " z: " << z << endl;
+  for (i = 0; i < int_trans; i++) {
+    cout << " z: " << z << endl;
+    if (z == NULL) {
+      cout << "error in interface format " << endl;
+      return false;
+    }
+    string tmp(z);
+    int pos = pos_trans(transitions, tmp);
+    // if(Formula_Trans.find(pos)==Formula_Trans.end())
+    if (pos == -1) {
+      cout << z << "         Error??? : interface transition doesn't exist \n";
+      //	return false;
+    } else
+      InterfaceTrans.insert(pos);
+    z = strtok(NULL, " \t\n");
+    if (z == NULL) {
+      nb = fread(Buff, 1, TAILLEBUFF - 1, in);
+      Buff[nb] = '\0';
+      z = strtok(Buff, " \t\n");
+    }
+  }
+  fclose(in);
+  return true;
+}
+/*---------------------------------Set_Non_Observables()------------------*/
+void NewNet::Set_Non_Observables() {
+  NonObservable.clear();
+  for (unsigned int i = 0; i < transitions.size(); i++)
+    if (Observable.find(i) == Observable.end()) {
+      NonObservable.insert(i);
+    }
+}
+/*-----------------------pos_trans()--------------------*/
+int pos_trans(TRANSITIONS T, string trans) {
+  int pos = 0;
+  //	cout<<"on cherche "<<trans<<" dans :\n";
+  for (TRANSITIONS::const_iterator i = T.begin(); !(i == T.end()); i++, pos++) {
+    //  cout<<i->name<<"   ";
+    if (i->name == trans) return pos;
+  }
+  // cout<<"Non trouve :\n";
+  return -1;
+}
+/* ------------------------------ operator<< -------------------------------- */
+ostream &operator<<(ostream &os, const Set &s) {
+  bool b = false;
+
+  if (s.size()) {
+    for (Set::const_iterator i = s.begin(); !(i == s.end()); i++) {
+      if (b)
+        os << ", ";
+      else
+        os << "{";
+      os << *i << " ";
+      b = true;
+    }
+    os << "}";
+  } else
+    os << "empty set";
+  return os;
+}
+/*----------------------------------------------------------------------*/
+bool NewNet::addPlace(const string &place, int marking, int capacity) {
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end()) {
+    placeName[place] = places.size();
+    Place p(place, marking, capacity);
+    places.push_back(p);
+    return true;
+  } else
+    return false;
+}
+
+bool NewNet::addQueue(const string &place, int capacity) {
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end()) {
+    placeName[place] = places.size();
+    Place p(place, -1, capacity);
+    places.push_back(p);
+    return true;
+  } else
+    return false;
+}
+
+bool NewNet::addLossQueue(const string &place, int capacity) {
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end()) {
+    placeName[place] = places.size();
+    Place p(place, -2, capacity);
+    places.push_back(p);
+    return true;
+  } else
+    return false;
+}
+
+bool NewNet::addTrans(const string &trans) {
+  map<string, int>::const_iterator ti = transitionName.find(trans);
+  if (ti == transitionName.end()) {
+    transitionName[trans] = transitions.size();
+    Transition t(trans);
+    transitions.push_back(t);
+    return true;
+  } else
+    return false;
+}
+
+bool NewNet::addPre(const string &place, const string &trans, int valuation) {
+  int p, t;
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end() || places[pi->second].isQueue())
+    return false;
+  else
+    p = pi->second;
+  map<string, int>::const_iterator ti = transitionName.find(trans);
+  if (ti == transitionName.end())
+    return false;
+  else
+    t = ti->second;
+  transitions[t].addPre(p, valuation);
+  places[p].addPost(t, valuation);
+  return true;
+}
+
+bool NewNet::addPost(const string &place, const string &trans, int valuation) {
+  int p, t;
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end() || places[pi->second].isQueue())
+    return false;
+  else
+    p = pi->second;
+  map<string, int>::const_iterator ti = transitionName.find(trans);
+  if (ti == transitionName.end())
+    return false;
+  else
+    t = ti->second;
+  transitions[t].addPost(p, valuation);
+  places[p].addPre(t, valuation);
+  return true;
+}
+
+bool NewNet::addPreQueue(const string &place, const string &trans, int valuation) {
+  int p, t;
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end() || !places[pi->second].isQueue())
+    return false;
+  else
+    p = pi->second;
+  map<string, int>::const_iterator ti = transitionName.find(trans);
+  if (ti == transitionName.end())
+    return false;
+  else
+    t = ti->second;
+  transitions[t].addPre(p, valuation);
+  places[p].addPost(t, valuation);
+  return true;
+}
+
+bool NewNet::addPostQueue(const string &place, const string &trans,
+                       int valuation) {
+  int p, t;
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end() || !places[pi->second].isQueue())
+    return false;
+  else
+    p = pi->second;
+  map<string, int>::const_iterator ti = transitionName.find(trans);
+  if (ti == transitionName.end())
+    return false;
+  else
+    t = ti->second;
+  transitions[t].addPost(p, valuation);
+  places[p].addPre(t, valuation);
+  return true;
+}
+
+bool NewNet::addInhibitor(const string &place, const string &trans,
+                       int valuation) {
+  int p, t;
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end())
+    return false;
+  else
+    p = pi->second;
+  map<string, int>::const_iterator ti = transitionName.find(trans);
+  if (ti == transitionName.end())
+    return false;
+  else
+    t = ti->second;
+  transitions[t].addInhibitor(p, valuation);
+  places[p].addInhibitor(t, valuation);
+  return true;
+}
+
+bool NewNet::addPreAuto(const string &place, const string &trans,
+                     const string &valuation) {
+  int p, t, v;
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end() || places[pi->second].isQueue())
+    return false;
+  else
+    p = pi->second;
+  map<string, int>::const_iterator ti = transitionName.find(trans);
+  if (ti == transitionName.end())
+    return false;
+  else
+    t = ti->second;
+  map<string, int>::const_iterator pv = placeName.find(valuation);
+  if (pv == placeName.end() || places[pv->second].isQueue())
+    return false;
+  else
+    v = pv->second;
+  transitions[t].addPreAuto(p, v);
+  places[p].addPostAuto(t, v);
+  return true;
+}
+
+bool NewNet::addPostAuto(const string &place, const string &trans,
+                      const string &valuation) {
+  int p, t, v;
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end() || places[pi->second].isQueue())
+    return false;
+  else
+    p = pi->second;
+  map<string, int>::const_iterator ti = transitionName.find(trans);
+  if (ti == transitionName.end())
+    return false;
+  else
+    t = ti->second;
+  map<string, int>::const_iterator pv = placeName.find(valuation);
+  if (pv == placeName.end() || places[pi->second].isQueue())
+    return false;
+  else
+    v = pv->second;
+  transitions[t].addPostAuto(p, v);
+  places[p].addPreAuto(t, v);
+  return true;
+}
+
+bool NewNet::addReset(const string &place, const string &trans) {
+  int p, t;
+  map<string, int>::const_iterator pi = placeName.find(place);
+  if (pi == placeName.end())
+    return false;
+  else
+    p = pi->second;
+  map<string, int>::const_iterator ti = transitionName.find(trans);
+  if (ti == transitionName.end())
+    return false;
+  else
+    t = ti->second;
+  transitions[t].addReset(p);
+  places[p].addReset(t);
+  return true;
+}
+
+/* Visualisation */
+ostream &operator<<(ostream &os, const NewNet &R) {
+  /* affichage nombre de places et de transitions */
+  os << "***************************" << endl;
+  os << "Nombre de places     :" << R.nbPlace() << endl;
+  os << "Nombre de transitions:" << R.nbTransition() << endl;
+
+  /* affichage de la liste des places */
+  os << "********** places **********" << endl;
+  int i = 0;
+  for (vector<class Place>::const_iterator p = R.places.begin();
+       p != R.places.end(); p++, i++) {
+    if (p->isQueue()) {
+      os << "queue " << setw(4) << i << ":" << p->name << ", cp(" << p->capacity
+         << ")";
+      if (p->isLossQueue()) cout << " loss";
+      cout << endl;
+    } else
+      os << "place " << setw(4) << i << ":" << p->name << ":" << p->marking
+         << " <..>, cp(" << p->capacity << ")" << endl;
+  }
+  os << "********** transitions  de la formule  **********" << endl;
+  for (Set::const_iterator h = R.Formula_Trans.begin();
+       !(h == R.Formula_Trans.end()); h++)
+    cout << R.transitions[*h].name << endl;
+  os << "********** transitions  de l'interface  **********" << endl;
+  for (Set::const_iterator h = R.InterfaceTrans.begin();
+       !(h == R.InterfaceTrans.end()); h++)
+    cout << R.transitions[*h].name << endl;
+  os << "Nombre de transitions observable:" << R.Observable.size() << endl;
+  os << "********** transitions observables **********" << endl;
+  for (Set::const_iterator h = R.Observable.begin(); !(h == R.Observable.end());
+       h++)
+    cout << R.transitions[*h].name << endl;
+  os << "Nombre de transitions non observees:" << R.NonObservable.size()
+     << endl;
+  os << "********** transitions  non observees **********" << endl;
+  for (Set::const_iterator h = R.NonObservable.begin();
+       !(h == R.NonObservable.end()); h++)
+    cout << R.transitions[*h].name << endl;
+  i = 0;
+  os << "Nombre global de transitions :" << R.nbTransition() << endl;
+  os << "********** transitions  **********" << endl;
+  for (TRANSITIONS::const_iterator t = R.transitions.begin();
+       t != R.transitions.end(); t++, i++) {
+    os << setw(4) << i << ":" << t->name << endl;
+
+    // os<<"        IN  { ";
+    // for (vector< pair<int,int> >::const_iterator
+    // a=p->pre.begin();a!=p->pre.end();a++)
+    //  if (R.places[a->first].isQueue())
+    //  os<<R.places[a->first].name<<":<"<<a->second<<">;";
+    //  else
+    //  os<<R.places[a->first].name<<":"<<a->second<<";";
+    //    for (vector< pair<int,int> >::const_iterator
+    //    a=p->inhibitor.begin();a!=p->inhibitor.end();a++)
+    // os<<R.places[a->first].name<<"<"<<a->second<<";";
+    // for (vector< pair<int,int> >::const_iterator
+    // a=p->preAuto.begin();a!=p->preAuto.end();a++)
+    // os<<R.places[a->first].name<<":"<<R.places[a->second].name<<";";
+    // for (vector<int>::const_iterator
+    // a=p->reset.begin();a!=p->reset.end();a++) os<<R.places[*a].name<<":
+    // reset;"; os<<" }"<<endl;
+
+    // os<<"        OUT { ";
+    // for (vector< pair<int,int> >::const_iterator
+    // a=p->post.begin();a!=p->post.end();a++)
+    //  if (R.places[a->first].isQueue())
+    //  os<<R.places[a->first].name<<":<"<<a->second<<">;";
+    //  else
+    //  os<<R.places[a->first].name<<":"<<a->second<<";";
+    // for (vector< pair<int,int> >::const_iterator
+    // a=p->postAuto.begin();a!=p->postAuto.end();a++)
+    // os<<R.places[a->first].name<<":"<<R.places[a->second].name<<";";
+    // os<<" }"<<endl;
+  }
+  return (os);
+}
diff --git a/src/NewNet.h b/src/NewNet.h
new file mode 100644
index 0000000000000000000000000000000000000000..5a75757e0363086f24364a7197f230300f207fce
--- /dev/null
+++ b/src/NewNet.h
@@ -0,0 +1,114 @@
+#ifndef NEWNET_H_INCLUDED
+#define NEWNET_H_INCLUDED
+/* -*- C++ -*- */
+#ifndef NET_H
+#define NET_H
+#include <cstring>
+#include <ext/hash_map>
+#include <iostream>
+#include <map>
+#include <set>
+#include <string>
+#include <vector>
+#include "RdPMonteur.hpp"
+typedef set<int> Set;
+class Node {
+ public:
+  Node(){};
+  ~Node(){};
+  vector<pair<int, int> > pre, post, inhibitor, preAuto, postAuto;
+  vector<int> reset;
+  void addPre(int, int);
+  void addPost(int, int);
+  void addInhibitor(int, int);
+  void addPreAuto(int, int);
+  void addPostAuto(int, int);
+  void addReset(int);
+};
+
+class Place : public Node {
+ public:
+  string name;
+  int marking, capacity;
+  Place(const string &p, int m = 0, int c = 0)
+      : name(p), marking(m), capacity(c){};
+  ~Place(){};
+  bool isLossQueue() const { return marking == -2; }
+  bool isQueue() const { return marking <= -1; }
+  bool hasCapacity() const { return capacity != 0; }
+};
+
+class Transition : public Node {
+ public:
+  string name;
+  Transition(const string &t) : name(t){};
+  ~Transition(){};
+};
+/*-----------------------------------------------------------------*/
+struct ltstr {
+  bool operator()(const char *s1, const char *s2) const {
+    return std::strcmp(s1, s2) < 0;
+  }
+};
+typedef set<const char *, ltstr> Set_mot;
+typedef vector<Place> PLACES;
+typedef vector<Transition> TRANSITIONS;
+
+class NewNet : public RdPMonteur {
+ public:
+    void setListObservable(const set<string> & list_t);
+ private:
+  /*Initialisation des attributs*/
+  bool Set_Observables(const char *file);
+  bool Set_Interface_Trans(const char *file);
+  bool Set_Formula_Trans(const char *file);
+  bool Set_ObsNonObservables(Set_mot obs);
+  void Set_Non_Observables();
+
+ public:
+  /* Attributs */
+  vector<class Place> places;
+  vector<class Transition> transitions;
+  map<string, int> placeName;
+  map<string, int> transitionName;
+  Set Observable;
+  Set NonObservable;
+  Set InterfaceTrans;
+  Set Formula_Trans;
+  Set m_formula_place;
+
+  /* Constructors */
+  NewNet(){};
+  ~NewNet(){};
+  NewNet(const char *file, const char *Obs = "", const char *Int = "");
+  NewNet(const char *f, const set<string> & f_trans);
+  /* Monteur */
+  bool addPlace(const string &place, int marking = 0, int capacity = 0);
+  bool addQueue(const string &place, int capacity = 0);
+  bool addLossQueue(const string &place, int capacity = 0);
+  bool addTrans(const string &transition);
+  bool addPre(const string &place, const string &transition, int valuation = 1);
+  bool addPost(const string &place, const string &transition,
+               int valuation = 1);
+  bool addPreQueue(const string &place, const string &transition,
+                   int valuation = 1);
+  bool addPostQueue(const string &place, const string &transition,
+                    int valuation = 1);
+  bool addInhibitor(const string &place, const string &transition,
+                    int valuation = 1);
+  bool addPreAuto(const string &place, const string &transition,
+                  const string &valuation);
+  bool addPostAuto(const string &place, const string &transition,
+                   const string &valuation);
+  bool addReset(const string &place, const string &transition);
+  /* Visualisation */
+  int nbPlace() const { return places.size(); };
+  int nbTransition() const { return transitions.size(); };
+};
+
+ostream &operator<<(ostream &, const NewNet &);
+#endif
+
+
+
+#endif // NEWNET_H_INCLUDED
diff --git a/src/SpotSogIterator.cpp b/src/SpotSogIterator.cpp
index 5e8c76ee01f47faceaeba7ff9a8a8ce2aa0ebc10..8d3ba3f18a99cbb23e9da527a92cb60893122882 100644
--- a/src/SpotSogIterator.cpp
+++ b/src/SpotSogIterator.cpp
@@ -6,35 +6,45 @@
 
 SpotSogIterator::SpotSogIterator(const LDDState* lddstate):m_lddstate(lddstate)
 {
-
+    //vector<pair<LDDState*, int>>
+    m_lddstate->setDiv(true);
+    for (int i=0;i<m_lddstate->getSuccessors()->size();i++) {
+        m_lsucc.push_back(m_lddstate->getSuccessors()->at(i));
+    }
+   /* if (lddstate->isDeadLock()) {
+        m_lsucc.push_back(pair(,-1));
+    }*/
+    if (lddstate->isDiv()) {
+        m_lsucc.push_back(pair<LDDState*,int>(m_lddstate,-1));
+    }
 }
 bool SpotSogIterator::first() {
   //  m_sog->getLDDStateById(m_id)->Successors().
     //return m_sog->get_successor()
 
     m_current_edge=0;
-    return m_lddstate->getSuccessors()->size()!=0;
+    return m_lsucc.size()!=0;
 }
 
 bool SpotSogIterator::next() {
 
     m_current_edge++;
-    return m_current_edge<m_lddstate->getSuccessors()->size();
+    return m_current_edge<m_lsucc.size();
 }
 
 bool SpotSogIterator::done() const {
 
-    return m_current_edge==m_lddstate->getSuccessors()->size();
+    return m_current_edge==m_lsucc.size();
 }
 
 SpotSogState* SpotSogIterator::dst() const
   {
-    return new SpotSogState(m_lddstate->getSuccessors()->at(m_current_edge).first);
+    return new SpotSogState(m_lsucc.at(m_current_edge).first);
   }
 
 bdd SpotSogIterator::cond()  const {
-    bdd a=bddtrue;//1;
-    string name=m_graph->getTransition(m_lddstate->getSuccessors()->at(m_current_edge).second);
+    if (m_lsucc.at(m_current_edge).second==-1) return bddtrue;
+    string name=m_graph->getTransition(m_lsucc.at(m_current_edge).second);
     //cout<<"Value "<<m_lddstate->getSuccessors()->at(m_current_edge).second<<" Transition name "<<name<<endl;
 
     spot::bdd_dict *p=m_dict_ptr->get();
diff --git a/src/SpotSogIterator.h b/src/SpotSogIterator.h
index 7a25b996a07cb9663fef2b4dcf37f8a6cafc3062..152912047bde8c7599131daac5ce86cdee07b9b4 100644
--- a/src/SpotSogIterator.h
+++ b/src/SpotSogIterator.h
@@ -6,6 +6,7 @@
 class SpotSogIterator : public spot::twa_succ_iterator
 {
     public:
+
         static LDDGraph * m_graph;
         static spot::bdd_dict_ptr* m_dict_ptr;
         SpotSogIterator(const LDDState *lddstate);
@@ -24,6 +25,7 @@ class SpotSogIterator : public spot::twa_succ_iterator
         // Associated SOG graph
 
         LDDState * m_lddstate;
+        vector<pair<LDDState*, int>> m_lsucc;
         unsigned int m_current_edge=0;
 };
 
diff --git a/src/main.cpp b/src/main.cpp
index aa4cbab925519010dd78698db666e4e4de5dcaa3..4922e4ac340fb910e85055a20c3e665f7411310c 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -21,7 +21,8 @@
 #include <spot/twaalgos/translate.hh>
 #include <spot/twaalgos/emptiness.hh>
 #include <spot/tl/apcollect.hh>
-#include "Net.hpp"
+#include "NewNet.h"
+#include "SogTwa.h"
 
 
 
@@ -31,39 +32,47 @@
 using namespace std;
 #define MASTER 0
 
-int Formula_transitions(const char * f, Set_mot& formula_trans, net Rv) ;
+int Formula_transitions(const char * f, Set_mot& formula_trans, NewNet Rv) ;
 //int nb_th;
 
 unsigned int nb_th;
 int n_tasks, task_id;
-
-set<string> buildObsTransitions(const string &fileName) {
+spot::formula not_f;
+set<string> buildPropositions(const string &fileName)
+{
     string input;
     set<string> transitionSet;
     ifstream file(fileName);
-    if (file.is_open()) {
+    if (file.is_open())
+    {
         getline (file,input);
         cout<<"Loaded formula : "<<input<<endl;
         file.close();
 
     }
-    else {
+    else
+    {
         cout<<"Can not open formula file"<<endl;
         exit(0);
     }
 
     spot::parsed_formula pf = spot::parse_infix_psl(input);
-    if (pf.format_errors(std::cerr)) return transitionSet;
+    if (pf.format_errors(std::cerr))
+        return transitionSet;
     spot::formula fo = pf.f;
-    if (!fo.is_ltl_formula())    {
-      std::cerr << "Only LTL formulas are supported.\n";
-      return transitionSet;
+    if (!fo.is_ltl_formula())
+    {
+        std::cerr << "Only LTL formulas are supported.\n";
+        return transitionSet;
     }
     spot::atomic_prop_set *p_list=spot::atomic_prop_collect(fo,0);
-    for (spot::atomic_prop_set::const_iterator i=p_list->begin();i!=p_list->end();i++) {
+    for (spot::atomic_prop_set::const_iterator i=p_list->begin(); i!=p_list->end(); i++)
+    {
         transitionSet.insert((*i).ap_name());
     }
     print_spin_ltl(std::cout, fo)<<'\n';
+    cout<<"Building formula negation\n";
+    not_f = spot::formula::Not(pf.f);
     return transitionSet;
 
 }
@@ -76,11 +85,13 @@ int main(int argc, char** argv)
 
     exit(0);*/
 
-    if(argc<3)  return 0;
-    char Obs[100]="";
+    if(argc<3)
+        return 0;
+    char formula[100]="";
     char Int[100]="";
-    strcpy(Obs, argv[4]);
-    if (argc > 6) strcpy(Int, argv[5]);
+    strcpy(formula, argv[4]);
+    if (argc > 6)
+        strcpy(Int, argv[5]);
 
     int bound  = atoi(argv[argc - 1])==0?32:atoi(argv[argc - 1]);
     //if(argc>5)
@@ -88,7 +99,7 @@ int main(int argc, char** argv)
 
 
     cout<<"Fichier net : "<<argv[3]<<endl;
-    cout<<"Fichier formule : "<<Obs<<endl;
+    cout<<"Fichier formule : "<<formula<<endl;
     cout<<"Fichier Interface : "<<Int<<endl;
     cout<<"Bound : "<<argv[argc-1]<<endl;
     cout<<"thread : "<<argv[2]<<endl;
@@ -103,9 +114,9 @@ int main(int argc, char** argv)
 
     cout<<"______________________________________\n";
     cout<<"Fetching formula..."<<endl;
-    set<string> list_transitions=buildObsTransitions(Obs);
+    set<string> list_propositions=buildPropositions(formula);
 
-    net R(argv[3],list_transitions);
+    NewNet R(argv[3],list_propositions);
 
     MPI_Init (&argc, &argv );
     MPI_Comm_size(MPI_COMM_WORLD,&n_tasks);
@@ -130,31 +141,73 @@ int main(int argc, char** argv)
         else
         {
             cout<<"*******************Multithread version****************** \n" <<endl;
-            if (!strcmp(argv[1],"p")) {
+            if (!strcmp(argv[1],"p"))
+            {
                 cout<<"Construction with pthread library."<<endl;
                 cout<<"Count of threads to be created: "<<nb_th<<endl;
                 DR.computeDSOG(g,false);
                 g.printCompleteInformation();
             }
-            else if (!strcmp(argv[1],"pc")) {
+            else if (!strcmp(argv[1],"pc"))
+            {
                 cout<<"Canonized construction with pthread library."<<endl;
                 cout<<"Count of threads to be created: "<<nb_th<<endl;
                 DR.computeDSOG(g,true);
                 g.printCompleteInformation();
             }
-            else if (!strcmp(argv[1],"l")) {
+            else if (!strcmp(argv[1],"l"))
+            {
                 cout<<"Construction with lace framework."<<endl;
                 cout<<"Count of workers to be created: "<<nb_th<<endl;
                 DR.computeSOGLace(g);
                 g.printCompleteInformation();
             }
-             else if (!strcmp(argv[1],"lc")) {
+            else if (!strcmp(argv[1],"lc"))
+            {
                 cout<<"Canonised construction with lace framework."<<endl;
                 cout<<"Count of workers to be created: "<<nb_th<<endl;
                 DR.computeSOGLaceCanonized(g);
                 g.printCompleteInformation();
             }
-        }
+
+            cout<<"Perform Model checking ?";
+            char c;
+            cin>>c;
+            if (c='y')
+            {
+                cout<<"Building automata for not(formula)\n";
+                auto d = spot::make_bdd_dict();
+                spot::twa_graph_ptr af = spot::translator(d).run(not_f);
+                cout<<"Formula automata built.\n";
+                cout<<"Want to save the graph in a dot file ?";
+                cin>>c;
+                if (c=='y') {
+                    fstream file;
+                    string st(formula);
+                    st+=".dot";
+                    file.open(st.c_str(),fstream::out);
+                    spot::print_dot(file, af);
+                    file.close();
+                }
+                auto k = std::make_shared<SogTwa>(d,DR.getGraph());
+                cout<<"SOG translated to SPOT succeeded.."<<endl;
+                cout<<"Want to save the graph in a dot file ?";
+                cin>>c;
+                if (c=='y') {
+                    fstream file;
+                    string st(argv[3]);
+                    st+=".dot";
+                    file.open(st.c_str(),fstream::out);
+                    spot::print_dot(file, k);
+                    file.close();
+                }
+                if (auto run = k->intersecting_run(af))
+                    std::cout << "formula is violated by the following run:\n" << *run;
+                else
+                    std::cout << "formula is verified\n";
+            }
+
+          }
     }
 
 
diff --git a/src/threadSOG.cpp b/src/threadSOG.cpp
index 40da1bfa08d4963f34ce6ba30e3120665a2c5e1f..917a54ce5d2229728b79551c008eb11cc57ae5b4 100644
--- a/src/threadSOG.cpp
+++ b/src/threadSOG.cpp
@@ -5,12 +5,6 @@
 //#define DEBUG_GC
 #include "threadSOG.h"
 
-
-// #include <vec.h>
-
-
-// #include "test_assert.h"
-
 #include "sylvan.h"
 #include "sylvan_seq.h"
 #include <sylvan_sog.h>
@@ -18,8 +12,6 @@
 
 using namespace sylvan;
 
-
-
 void write_to_dot(const char *ch,MDD m)
 {
     FILE *fp=fopen(ch,"w");
@@ -29,26 +21,12 @@ void write_to_dot(const char *ch,MDD m)
 
 /*************************************************/
 
-//#include <boost/thread.hpp>
-const vector<class Place> *_places = NULL;
-
-/*void my_error_handler_dist(int errcode) {
-    cout<<"errcode = "<<errcode<<endl;
-	if (errcode == BDD_RANGE) {
-		// Value out of range : increase the size of the variables...
-		// but which one???
-		bdd_default_errhandler(errcode);
-	}
-	else {
-		bdd_default_errhandler(errcode);
-	}
-} */
 
 
 
 /*************************************************/
 
-threadSOG::threadSOG(const net &R, int BOUND, int nbThread,bool uselace,bool init)
+threadSOG::threadSOG(const NewNet &R, int BOUND, int nbThread,bool uselace,bool init)
 {
     m_nb_thread=nbThread;
     if (uselace)  {
@@ -80,23 +58,27 @@ threadSOG::threadSOG(const net &R, int BOUND, int nbThread,bool uselace,bool ini
 
     //_______________
     transitions=R.transitions;
-    Observable=R.Observable;
-    NonObservable=R.NonObservable;
-    Formula_Trans=R.Formula_Trans;
-    transitionName=R.transitionName;
-    InterfaceTrans=R.InterfaceTrans;
-    m_nbPlaces=R.places.size();
-    cout<<"Nombre de places : "<<m_nbPlaces<<endl;
-    cout<<"Derniere place : "<<R.places[m_nbPlaces-1].name<<endl;
-    // place domain, place bvect, place initial marking and place name
-    // domains
+    m_observable=R.Observable;
+    m_place_proposition=R.m_formula_place;
+    m_nonObservable=R.NonObservable;
 
+    m_transitionName=R.transitionName;
 
-    // bvec
+    cout<<"Toutes les Transitions:"<<endl;
+    map<string,int>::iterator it2=m_transitionName.begin();
+    for (;it2!=m_transitionName.end();it2++) {
+        cout<<(*it2).first<<" : "<<(*it2).second<<endl;}
 
 
-    // Computing initial marking
 
+    cout<<"Transitions observables :"<<endl;
+    Set::iterator it=m_observable.begin();
+    for (;it!=m_observable.end();it++) {cout<<*it<<"  ";}
+    cout<<endl;
+    InterfaceTrans=R.InterfaceTrans;
+    m_nbPlaces=R.places.size();
+    cout<<"Nombre de places : "<<m_nbPlaces<<endl;
+    cout<<"Derniere place : "<<R.places[m_nbPlaces-1].name<<endl;
 
     uint32_t * liste_marques=new uint32_t[R.places.size()];
     for(i=0,it_places=R.places.begin(); it_places!=R.places.end(); i++,it_places++)
@@ -106,10 +88,8 @@ threadSOG::threadSOG(const net &R, int BOUND, int nbThread,bool uselace,bool ini
 
     M0=lddmc_cube(liste_marques,R.places.size());
 
-   // ldd_refs_push(M0);
 
-    // place names
-    _places = &R.places;
+
 
 
     uint32_t *prec = new uint32_t[m_nbPlaces];
@@ -198,7 +178,7 @@ void threadSOG::computeSeqSOG(LDDGraph &g)
 
     // cout<<"Marquage initial :\n";
     //cout<<bddtable<<M0<<endl;
-    MDD Complete_meta_state=Accessible_epsilon2(M0);
+    MDD Complete_meta_state=Accessible_epsilon(M0);
    // write_to_dot("detectDiv.dot",Complete_meta_state);
     //cout<<" div "<<Set_Div(Complete_meta_state)<<endl;
     //lddmc_fprintdot(fp,Complete_meta_state);
@@ -206,15 +186,7 @@ void threadSOG::computeSeqSOG(LDDGraph &g)
 
     //cout<<"Apres accessible epsilon \n";
     fire=firable_obs(Complete_meta_state);
-   // MDD canonised_initial=Canonize(Complete_meta_state,0);
-    //ldd_refs_push(canonised_initial);
-
 
-    //c->blocage=Set_Bloc(Complete_meta_state);
-    //c->boucle=Set_Div(Complete_meta_state);
-    //c->m_lddstate=CanonizeR(Complete_meta_state,0);
-    //cout<<"Apres CanonizeR nb representant : "<<bdd_pathcount(c->m_lddstate)<<endl;
-    //c->m_lddstate=canonised_initial;
     c->m_lddstate=Complete_meta_state;
     //TabMeta[m_nbmetastate]=c->m_lddstate;
     m_nbmetastate++;
@@ -241,7 +213,7 @@ void threadSOG::computeSeqSOG(LDDGraph &g)
             reached_class=new LDDState;
             {
                 //  cout<<"Avant Accessible epsilon \n";
-                MDD Complete_meta_state=Accessible_epsilon2(get_successor(e.first.second,t));
+                MDD Complete_meta_state=Accessible_epsilon(get_successor(e.first.second,t));
                 //MDD reduced_meta=Canonize(Complete_meta_state,0);
                 ldd_refs_push(Complete_meta_state);
                 //ldd_refs_push(reduced_meta);
@@ -255,11 +227,7 @@ void threadSOG::computeSeqSOG(LDDGraph &g)
                 {
                     //  cout<<"not found"<<endl;
                     reached_class->m_boucle=Set_Div(Complete_meta_state);
-                  //  cout<<"Divergence "<<Set_Div(Complete_meta_state)<<endl;
-                //    cout<<"blocage "<<Set_Bloc(Complete_meta_state)<<endl;
 
-                    //reached_class->blocage=Set_Bloc(Complete_meta_state);
-                    //reached_class->boucle=Set_Div(Complete_meta_state);
                     fire=firable_obs(Complete_meta_state);
                     st.push(Pair(couple(reached_class,Complete_meta_state),fire));
                     //TabMeta[nbmetastate]=reached_class->m_lddstate;
@@ -336,11 +304,6 @@ void * threadSOG::doCompute()
         //ldd_refs_push(canonised_initial);
         fire=firable_obs(Complete_meta_state);
 
-        //c->blocage=Set_Bloc(Complete_meta_state);
-        //c->boucle=Set_Div(Complete_meta_state);
-        //c->m_lddstate=CanonizeR(Complete_meta_state,0);
-        //cout<<"Apres CanonizeR nb representant : "<<bdd_pathcount(c->m_lddstate)<<endl;
-        //c->m_lddstate=canonised_initial;
         c->m_lddstate=Complete_meta_state;
         //m_TabMeta[m_nbmetastate]=c->m_lddstate;
         m_nbmetastate++;
@@ -506,11 +469,7 @@ void * threadSOG::doComputeCanonized()
         ldd_refs_push(canonised_initial);
         fire=firable_obs(Complete_meta_state);
 
-        //c->blocage=Set_Bloc(Complete_meta_state);
-        //c->boucle=Set_Div(Complete_meta_state);
-        //c->m_lddstate=CanonizeR(Complete_meta_state,0);
-        //cout<<"Apres CanonizeR nb representant : "<<bdd_pathcount(c->m_lddstate)<<endl;
-        //c->m_lddstate=canonised_initial;
+
         c->m_lddstate=canonised_initial;
         //m_TabMeta[m_nbmetastate]=c->m_lddstate;
         m_nbmetastate++;
@@ -527,8 +486,7 @@ void * threadSOG::doComputeCanonized()
 
     LDDState* reached_class;
 
-    // size_t max_meta_state_size;
-    // int min_charge;
+
     do
     {
 
@@ -663,6 +621,7 @@ void threadSOG::computeDSOG(LDDGraph &g,bool canonised)
     cout << "number of threads "<<m_nb_thread<<endl;
     int rc;
     m_graph=&g;
+    m_graph->setTransition(m_transitionName);
     m_id_thread=0;
 
     pthread_mutex_init(&m_mutex, NULL);
@@ -711,110 +670,6 @@ void * threadSOG::threadHandlerCanonized(void *context)
     return ((threadSOG*)context)->doComputeCanonized();
 }
 
-
-void threadSOG::printhandler(ostream &o, int var)
-{
-    o << (*_places)[var/2].name;
-    if (var%2)
-        o << "_p";
-}
-
-
-
-
-
-
-
-
-
-
-Set threadSOG::firable_obs(MDD State)
-{
-    Set res;
-    for(Set::const_iterator i=Observable.begin(); !(i==Observable.end()); i++)
-    {
-        //cout<<"firable..."<<endl;
-        MDD succ = lddmc_firing_mono(State,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        if(succ!=lddmc_false)
-        {
-            res.insert(*i);
-        }
-
-    }
-    return res;
-}
-
-
-MDD threadSOG::get_successor(MDD From,int t)
-{
-    return lddmc_firing_mono(From,m_tb_relation[(t)].getMinus(),m_tb_relation[(t)].getPlus());
-}
-
-MDD threadSOG::get_successor2(MDD From,int t)
-{
-  //  LACE_ME;
-    return lddmc_firing_mono(From,m_tb_relation[(t)].getMinus(),m_tb_relation[(t)].getPlus());
-}
-
-MDD threadSOG::Accessible_epsilon2(MDD From)
-{
-    MDD M1;
-    MDD M2=From;
-    int it=0;
-
-
-    do
-    {
-
-        M1=M2;
-        for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-        {    LACE_ME;
-
-            MDD succ= lddmc_firing_mono(M2,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-            M2=lddmc_union(succ,M2);
-
-        }
-
-        it++;
-
-        //	cout << bdd_nodecount(M2) << endl;
-    }
-    while(M1!=M2);
-
-    return M2;
-}
-
-MDD threadSOG::Accessible_epsilon(MDD From)
-{
-    MDD M1;
-    MDD M2=From;
-    int it=0;
-
-
-    do
-    {
-
-        M1=M2;
-        for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-        {
-
-            MDD succ= lddmc_firing_mono(M2,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-            M2=lddmc_union_mono(succ,M2);
-
-        }
-
-        it++;
-
-        //	cout << bdd_nodecount(M2) << endl;
-    }
-    while(M1!=M2);
-
-    return M2;
-}
-
-
-
-
 int threadSOG::minCharge()
 {
     int pos=0;
@@ -832,230 +687,17 @@ int threadSOG::minCharge()
 }
 
 
-/*---------------------------  Set_Bloc()  -------*/
-/*bool DistributedSOG::Set_Bloc(MDD &S) const {
-
- cout<<"Ici detect blocage \n";
-int check_deadlocks = 0
-MDD cur;
-  for(vector<TransSylvan>::const_iterator i = m_tb_relation.begin(); i!=m_tb_relation.end();i++)
-  {
-
-      cur=TransSylvan(*i).getMinus();
-
-  }
-return ((S&cur)!=lddmc_false);
-	//BLOCAGE
-}
-
-
-/*-------------------------Set_Div() à revoir -----------------------------*/
-/*bool threadSOG::Set_Div(MDD &S) const
-{
-	Set::const_iterator i;
-	MDD To,Reached;
-	//cout<<"Ici detect divergence \n";
-	Reached=S;
-	do
-	{
-	        MDD From=Reached;
-		for(i=NonObservable.begin();!(i==NonObservable.end());i++)
-		{
-
-                To=lddmc_firing_mono(Reached,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-                Reached=lddmc_union_mono(Reached,To);
-				//To=m_tb_relation[*i](Reached);
-				//Reached=Reached|To; //Reached=To ???
-				//Reached=To;
-		}
-		if(Reached==From)
-			//cout<<"SEQUENCE DIVERGENTE \n";
-			return true;
-		//From=Reached;
-	}while(Reached!=bddfalse);
-	 return false;
-	//cout<<"PAS DE SEQUENCE DIVERGENTE \n";
-}
-*/
-
-MDD threadSOG::Canonize(MDD s,unsigned int level)
-{
-    if (level>m_nbPlaces || s==lddmc_false)
-        return lddmc_false;
-    if(isSingleMDD(s))
-        return s;
-    MDD s0=lddmc_false,s1=lddmc_false;
 
-    bool res=false;
-    do
-    {
-        if (get_mddnbr(s,level)>1)
-        {
-            s0=ldd_divide_rec(s,level);
-            s1=ldd_minus(s,s0);
-            res=true;
-        }
-        else
-            level++;
-    }
-    while(level<m_nbPlaces && !res);
 
 
-    if (s0==lddmc_false && s1==lddmc_false)
-        return lddmc_false;
-    // if (level==nbPlaces) return lddmc_false;
-    MDD Front,Reach;
-    if (s0!=lddmc_false && s1!=lddmc_false)
-    {
-        Front=s1;
-        Reach=s1;
-        do
-        {
-            // cout<<"premiere boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s0 = ldd_minus(s0,Front);
-        }
-        while((Front!=lddmc_false)&&(s0!=lddmc_false));
-    }
-    if((s0!=lddmc_false)&&(s1!=lddmc_false))
-    {
-        Front=s0;
-        Reach = s0;
-        do
-        {
-            //  cout<<"deuxieme boucle interne \n";
-            Front=ldd_minus(ImageForward(Front),Reach);
-            Reach = lddmc_union_mono(Reach,Front);
-            s1 = ldd_minus(s1,Front);
-        }
-        while( Front!=lddmc_false && s1!=lddmc_false );
-    }
-
-
-
-    MDD Repr=lddmc_false;
-
-    if (isSingleMDD(s0))
-    {
-        Repr=s0;
-    }
-    else
-    {
-
-        Repr=Canonize(s0,level);
-
-    }
-
-    if (isSingleMDD(s1))
-        Repr=lddmc_union_mono(Repr,s1);
-    else
-        Repr=lddmc_union_mono(Repr,Canonize(s1,level));
-
-
-    return Repr;
-
-
-}
-MDD threadSOG::ImageForward(MDD From)
-{
-    MDD Res=lddmc_false;
-    for(Set::const_iterator i=NonObservable.begin(); !(i==NonObservable.end()); i++)
-    {
-        MDD succ= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        //        bdd succ = relation[(*i)](From);
-        Res=lddmc_union_mono(Res,succ);
-        // Res=Res|succ;
-
-    }
-    return Res;
-}
-
-
-bool threadSOG::Set_Bloc(MDD &M) const
-{
-  //bdd Mt = lddmc_true;
-  //for(vector<Trans>::const_iterator i = relation.begin(); i != relation.end(); ++i) {
-   // Mt = Mt & !(i->Precond);
-  //}
-  //return ((S & Mt) != bddfalse);
-   cout<<"Ici detect blocage \n";
-//int check_deadlocks = 0
-   MDD cur=lddmc_true;
-  for(vector<TransSylvan>::const_iterator i = m_tb_relation.begin(); i!=m_tb_relation.end();i++)
-  {
-
-      cur=cur&(TransSylvan(*i).getMinus());
-
-  }
-return ((M&cur)!=lddmc_false);
-	//BLOCAGE
-}
-bool threadSOG::Set_Div2( const MDD &M) const
-{
-    if (NonObservable.empty())
-    return false;
-	Set::const_iterator i;
-	MDD Reached,From;
-	//cout<<"Ici detect divergence \n";
-	Reached=M;
-	do
-	{
-        From=Reached;
-		for(i=NonObservable.begin();!(i==NonObservable.end());i++)
-		{
-		// To=relation[*i](Reached);
-        // Reached=Reached|To; //Reached=To ???
-        MDD To= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        Reached=lddmc_union_mono(Reached,To);
-				//Reached=To;
-		}
-		//From=Reached;
-	}while(Reached!=lddmc_false && Reached != From);
-   //  cout<<"PAS DE SEQUENCE DIVERGENTE \n";
-	 return Reached != lddmc_false;
-}
-
 //}
-bool threadSOG::Set_Div(MDD &M) const
-{
-    if (NonObservable.empty())
-    return false;
-	Set::const_iterator i;
-	MDD Reached,From;
-	//cout<<"Ici detect divergence \n";
-	Reached=M;
-	do
-	{
-        From=Reached;
-		for(i=NonObservable.begin();!(i==NonObservable.end());i++)
-		{
-		// To=relation[*i](Reached);
-        // Reached=Reached|To; //Reached=To ???
-        MDD To= lddmc_firing_mono(From,m_tb_relation[(*i)].getMinus(),m_tb_relation[(*i)].getPlus());
-        Reached=lddmc_union_mono(Reached,To);
-				//Reached=To;
-		}
-		if(Reached==From)
-		//{
-        //cout << " sequence divergente "<<endl;
-        return true;
-		//}
-		//From=Reached;
-	}while(Reached!=lddmc_false && Reached != From);
-   //  cout<<"PAS DE SEQUENCE DIVERGENTE \n";
-	 return false;
-}
+
 
 threadSOG::~threadSOG()
 {
     //dtor
 }
 
-/*********Returns the count of places******************************************/
-unsigned int threadSOG::getPlacesCount() {
-    return m_nbPlaces;
-}
 
 
 
@@ -1091,6 +733,7 @@ TASK_3 (Set, firable_obs_lace,MDD, State, Set*, observable, vector<TransSylvan>*
         if(succ!=lddmc_false)
         {
             res.insert(*i);
+
         }
 
     }
@@ -1130,6 +773,7 @@ void threadSOG::computeSOGLace(LDDGraph &g)
     clock_gettime(CLOCK_REALTIME, &start);
     Set fire;
     m_graph=&g;
+    m_graph->setTransition(m_transitionName);
     m_nbmetastate=0;
     m_MaxIntBdd=0;
 
@@ -1138,10 +782,10 @@ void threadSOG::computeSOGLace(LDDGraph &g)
 
     //cout<<"Marquage initial is being built..."<<endl;
     LACE_ME;
-    MDD initial_meta_state(CALL(Accessible_epsilon_lace,M0,&NonObservable,&m_tb_relation));
+    MDD initial_meta_state(CALL(Accessible_epsilon_lace,M0,&m_nonObservable,&m_tb_relation));
 
 
-    fire=firable_obs_lace(initial_meta_state,&Observable,&m_tb_relation);
+    fire=firable_obs_lace(initial_meta_state,&m_observable,&m_tb_relation);
 
     c->m_lddstate=initial_meta_state;
 
@@ -1154,10 +798,7 @@ void threadSOG::computeSOGLace(LDDGraph &g)
     m_graph->insert(c);
     //m_graph->nbMarking+=bdd_pathcount(c->m_lddstate);
     LDDState* reached_class;
-    //  MDD Complete_meta_state;*/
 
-    // size_t max_meta_state_size;
-    // int min_charge;
 
     while (!m_st[0].empty())
     {
@@ -1170,15 +811,18 @@ void threadSOG::computeSOGLace(LDDGraph &g)
         while(iter!=e.second.end())
         {
             int t = *iter;
+            cout<<"Transition order1: "<<*iter<<endl;
             //e.second.erase(t);
-            SPAWN(Accessible_epsilon_lace,get_successor(e.first.second,t),&NonObservable,&m_tb_relation);
+            SPAWN(Accessible_epsilon_lace,get_successor(e.first.second,t),&m_nonObservable,&m_tb_relation);
             onb_it++;iter++;
         }
 
         for (unsigned int i=0; i<onb_it; i++)
         {
-            int t = *e.second.end();
-            e.second.erase(t);
+            Set::iterator it = e.second.end();
+            it--;
+            int t=*it;
+            e.second.erase(it);
             MDD Complete_meta_state=SYNC(Accessible_epsilon_lace);
             reached_class=new LDDState;
             reached_class->m_lddstate=Complete_meta_state;
@@ -1192,7 +836,7 @@ void threadSOG::computeSOGLace(LDDGraph &g)
                 e.first.first->Successors.insert(e.first.first->Successors.begin(),LDDEdge(reached_class,t));
                 reached_class->Predecessors.insert(reached_class->Predecessors.begin(),LDDEdge(e.first.first,t));
                 m_nbmetastate++;
-                fire=firable_obs_lace(Complete_meta_state,&Observable,&m_tb_relation);
+                fire=firable_obs_lace(Complete_meta_state,&m_observable,&m_tb_relation);
                 m_st[0].push(Pair(couple(reached_class,Complete_meta_state),fire));
             }
             else
@@ -1211,12 +855,7 @@ void threadSOG::computeSOGLace(LDDGraph &g)
     std::cout << "TIME OF CONSTRUCTION OF THE SOG " << tps << " seconds\n";
 }
 
-Set * threadSOG::getNonObservable() {
-    return &NonObservable;
-}
-vector<TransSylvan>* threadSOG::getTBRelation() {
-    return &m_tb_relation;
-}
+
 /********************* Compute canonized SOG with lace *********************************************/
 
 /******************************Canonizer with lace framework  **********************************/
@@ -1322,6 +961,7 @@ void threadSOG::computeSOGLaceCanonized(LDDGraph &g)
     clock_gettime(CLOCK_REALTIME, &start);
     Set fire;
     m_graph=&g;
+    m_graph->setTransition(m_transitionName);
 
 
     m_nbmetastate=0;
@@ -1332,12 +972,12 @@ void threadSOG::computeSOGLaceCanonized(LDDGraph &g)
 
     //cout<<"Marquage initial is being built..."<<endl;
     LACE_ME;
-    MDD initial_meta_state(CALL(Accessible_epsilon_lace,M0,&NonObservable,&m_tb_relation));
+    MDD initial_meta_state(CALL(Accessible_epsilon_lace,M0,&m_nonObservable,&m_tb_relation));
 
     //lddmc_refs_spawn(SPAWN(lddmc_canonize,initial_meta_state,0,*this));
 
 
-    fire=firable_obs_lace(initial_meta_state,&Observable,&m_tb_relation);
+    fire=firable_obs_lace(initial_meta_state,&m_observable,&m_tb_relation);
     m_nbmetastate++;
     //m_old_size=lddmc_nodecount(c->m_lddstate);
     //reduced_initial=lddmc_refs_sync(SYNC(lddmc_canonize));
@@ -1364,14 +1004,17 @@ cout<<"\n=========================================\n";
         {
             int t = *iter;
             //e.second.erase(t);
-            SPAWN(Accessible_epsilon_lace,get_successor(e.first.second,t),&NonObservable,&m_tb_relation);
+            SPAWN(Accessible_epsilon_lace,get_successor(e.first.second,t),&m_nonObservable,&m_tb_relation);
             onb_it++;iter++;
         }
 
         for (unsigned int i=0; i<onb_it; i++)
         {
-            int t = *e.second.end();
-            e.second.erase(t);
+            Set::iterator it = e.second.end();
+            it--;
+            int t=*it;
+            e.second.erase(it);
+
             MDD Complete_meta_state=SYNC(Accessible_epsilon_lace);
             lddmc_refs_push(Complete_meta_state);
 
@@ -1390,7 +1033,7 @@ cout<<"\n=========================================\n";
                 e.first.first->Successors.insert(e.first.first->Successors.begin(),LDDEdge(reached_class,t));
                 reached_class->Predecessors.insert(reached_class->Predecessors.begin(),LDDEdge(e.first.first,t));
                 m_nbmetastate++;
-                fire=firable_obs_lace(Complete_meta_state,&Observable,&m_tb_relation);
+                fire=firable_obs_lace(Complete_meta_state,&m_observable,&m_tb_relation);
                 m_st[0].push(Pair(couple(reached_class,Complete_meta_state),fire));
             }
             else
@@ -1410,4 +1053,3 @@ cout<<"\n=========================================\n";
     std::cout << "TIME OF CONSTRUCTION OF THE SOG " << tps << " seconds\n";
 }
 
-
diff --git a/src/threadSOG.h b/src/threadSOG.h
index 977526a655bf712fb4e390afa1ff66943f90ab99..f0880740447ef681031bf03b9f575a79bd34e5c2 100644
--- a/src/threadSOG.h
+++ b/src/threadSOG.h
@@ -3,7 +3,7 @@
 // #include "RdPBDD.h"
 #include <stack>
 #include <vector>
-#include "Net.hpp"
+#include "NewNet.h"
 // #include "MDD.h"
 //#include "MDGraph.h"
 //#include "bvec.h"
@@ -12,70 +12,47 @@
 #include <sys/types.h>
 #include <unistd.h>
 #include "LDDGraph.h"
-#include "TransSylvan.h"
+#include "TransSylvan.h"
+#include "CommonSOG.h"
+
+
+
 
-typedef pair<LDDState *, MDD> couple;
-typedef pair<couple, Set> Pair;
-typedef stack<Pair> pile;
 // typedef vector<Trans> vec_trans;
 extern unsigned int nb_th;
 
-class threadSOG {
+class threadSOG : public CommonSOG{
  public:
-  threadSOG(const net &, int BOUND = 32, int nbThread=2,bool uselace=false,bool init = false);
+  threadSOG(const NewNet &, int BOUND = 32, int nbThread=2,bool uselace=false,bool init = false);
   void buildFromNet(int index);
   void computeDSOG(LDDGraph &g,bool canonised);
   void computeSeqSOG(LDDGraph &g);
   virtual ~threadSOG();
-  static void printhandler(ostream &o, int var);
   static void *threadHandler(void *context);
   static void *threadHandlerCanonized(void *context);
   void *doCompute();
   void *doComputeCanonized();
-  unsigned int getPlacesCount();
-  MDD ImageForward(MDD From);
+
+
   void computeSOGLace(LDDGraph &g);
   void computeSOGLaceCanonized(LDDGraph &g);
-  Set * getNonObservable();
-  vector<TransSylvan>* getTBRelation();
+
+
+
  protected:
  private:
  ////////////////////////////////
-
- //////////////////////////////
-
-  int m_nbPlaces = 0;
-  MDD Canonize(MDD s, unsigned int level);
-  LDDGraph *m_graph;
-  MDD LDDAccessible_epsilon(MDD *m);
-  MDD LDDAccessible_epsilon2(MDD *m);
-  MDD Accessible_epsilon(MDD From);
-  MDD Accessible_epsilon2(MDD From);
-  Set firable_obs(MDD State);
-  MDD get_successor(MDD From, int t);
-  MDD get_successor2(MDD From, int t);
   int minCharge();
-  bool Set_Bloc(MDD &M) const;
-  bool Set_Bloc2(const MDD &M) const;
-  bool Set_Div(MDD &M) const;
-  bool Set_Div2(const MDD &M) const;
+
+
   bool isNotTerminated();
-  //-----Original defined as members
-  vector<class Transition> transitions;
-  Set Observable;
-  Set NonObservable;
-  map<string, int> transitionName;
-  Set InterfaceTrans;
-  Set Formula_Trans;
 
   timespec start, finish;
 
   MDD M0;
-  LDDState m_M0;
-  MDD currentvar;
 
-  //-----------------
-  vector<TransSylvan> m_tb_relation;
+    //-----------------
+
   int m_NbIt;
   int m_itext, m_itint;
   int m_MaxIntBdd;
@@ -91,7 +68,7 @@ class threadSOG {
 
   int m_min_charge;
 
-  net m_net;
+
   int m_bound, m_init;
   int m_id_thread;
   pthread_mutex_t m_mutex;