diff --git a/src/main/java/avatartranslator/AvatarStateMachine.java b/src/main/java/avatartranslator/AvatarStateMachine.java
index b109596a7eb33b88f5f68ef2260323353fc6563e..9b98266ba98a6b2f409af81daffa90026f485cd9 100644
--- a/src/main/java/avatartranslator/AvatarStateMachine.java
+++ b/src/main/java/avatartranslator/AvatarStateMachine.java
@@ -440,7 +440,9 @@ public class AvatarStateMachine extends AvatarElement {
     public void removeCompositeStates(AvatarBlock _block) {
         TraceManager.addDev("\n-------------- Remove composite states ---------------\n");
 
-        /*LinkedList<AvatarState> lists =*/ removeAllInternalStartStates();
+        /*LinkedList<AvatarState> lists =*/
+        List<AvatarStartState> compositeStateToBeRemoved = removeAllInternalStartStates();
+        removeAllInternalStopStatesByRegularStates();
 
         AvatarTransition at = getAvatarCompositeTransition();
 
@@ -456,23 +458,28 @@ public class AvatarStateMachine extends AvatarElement {
             }
         }
 
-        // For each composite transition: We link it to all the substates of the current state
+        // For each composite transition: We link it to all the subStates of the current state
         AvatarState src;
-        while (((at = getAvatarCompositeTransition()) != null)) {
+
+        Vector<AvatarTransition>transitions = getAvatarCompositeTransitions();
+
+        for (AvatarTransition atc: transitions) {
+            src = (AvatarState) (getPreviousElementOf(atc));
+            atc.setAsVerifiable(false);
+            for (int j = 0; j < elements.size(); j++) {
+                AvatarStateMachineElement elt = elements.get(j);
+                if ((elt instanceof AvatarState) && (elt.hasInUpperState(src))) {
+                    AvatarTransition att = cloneCompositeTransition(atc);
+                    elt.addNext(att);
+                    att.setAsVerifiable(false);
+                }
+            }
+        }
+
+        /*while (((at = getAvatarCompositeTransition()) != null)) {
             src = (AvatarState) (getPreviousElementOf(at));
             elements.remove(at);
 
-            // Add a new state after the transition
-            /*String  tmp = findUniqueStateName("forCompositeTransition_state");
-              AvatarState as = new AvatarState(tmp, at.getReferenceObject());
-              elements.add(as);
-              AvatarTransition ats = new AvatarTransition("forCompositeTransition_trans", at.getReferenceObject());
-              elements.add(ats);
-              ats.addNext(at.getNext(0));
-              at.removeAllNexts();
-              at.addNext(as);
-              as.addNext(ats);*/
-
             // Link a clone of the transition  to all internal states
 
             for (int j = 0; j < elements.size(); j++) {
@@ -485,11 +492,47 @@ public class AvatarStateMachine extends AvatarElement {
                 }
             }
 
-        }
+        }*/
+
+        // Removing composite states
+        /*for(AvatarStateMachineElement elt: compositeStateToBeRemoved) {
+            elements.remove(elt);
+        }*/
 
     }
 
 
+    private void removeAllInternalStopStatesByRegularStates() {
+        Vector<AvatarStopState> v = new Vector<>();
+        Vector<AvatarState> toAdd = new Vector<>();
+
+        for (AvatarStateMachineElement element : elements) {
+            if (element instanceof AvatarTransition) {
+                AvatarTransition at = (AvatarTransition) element;
+                //TraceManager.addDev("at? element=" + element);
+                // Transition fully in the internal state?
+                if (element.getNext(0) instanceof AvatarStopState) {
+                    AvatarStopState stop =  (AvatarStopState)(element.getNext(0));
+                    if (stop.getState() != null) {
+                        AvatarState newState = new AvatarState(stop.getName(), stop.getReferenceObject());
+                        element.removeNext(0);
+                        element.addNext(newState);
+                        toAdd.add(newState);
+                        v.add(stop);
+                    }
+
+                }
+            }
+        }
+        for(AvatarStopState s: v) {
+            elements.remove(s);
+        }
+        for(AvatarState st: toAdd) {
+            elements.add(st);
+        }
+    }
+
+
 
     private void modifyStateForCompositeSupport(AvatarState _state) {
         // Each time there is a transition with an after or more than one action, we must rework the transition
@@ -625,6 +668,24 @@ public class AvatarStateMachine extends AvatarElement {
         return null;
     }
 
+    private Vector<AvatarTransition> getAvatarCompositeTransitions() {
+
+        Vector<AvatarTransition> transitions = new Vector<>();
+
+        for (AvatarStateMachineElement element : elements) {
+            if (element instanceof AvatarTransition) {
+                if ((isACompositeTransition((AvatarTransition) element))) {
+                    transitions.add((AvatarTransition) element);
+                }
+            }
+        }
+
+        return transitions;
+    }
+
+
+
+
     // Checks whether the previous element is a state with an internal state machine
     public boolean isACompositeTransition(AvatarTransition _at) {
         AvatarStateMachineElement element = getPreviousElementOf(_at);
@@ -637,7 +698,17 @@ public class AvatarStateMachine extends AvatarElement {
         }
 
         AvatarState state = (AvatarState) element;
-        return hasInternalComponents(state);
+
+        if (!hasInternalComponents(state)) {
+            return false;
+        }
+
+        AvatarStateMachineElement next = _at.getNext(0);
+        if (next.hasInUpperState(state)) {
+            return false;
+        }
+
+        return true;
     }
 
     private boolean hasInternalComponents(AvatarState _state) {
@@ -970,11 +1041,11 @@ public class AvatarStateMachine extends AvatarElement {
 
     // All transitions reaching a state that has an internal start state
     // shall in fact go directly to the nexts of the start state
-    public List<AvatarState> removeAllInternalStartStates() {
+    public List<AvatarStartState> removeAllInternalStartStates() {
         // identify allstart state
         List<AvatarStartState> ll = new LinkedList<AvatarStartState>();
 
-        List<AvatarState> removedinfos = new LinkedList<AvatarState>();
+        List<AvatarStartState> removedinfos = new LinkedList<>();
 
         for (AvatarStateMachineElement element : elements) {
             if ((element instanceof AvatarStartState) && (element.getState() != null)) {
@@ -988,7 +1059,11 @@ public class AvatarStateMachine extends AvatarElement {
         for (AvatarStartState as : ll) {
             AvatarState astate = as.getState();
             if (as != null) {
-                le = getPreviousElementsOf(astate);
+                elements.remove(as);
+                AvatarStateMachineElement elt = as.getNext(0);
+                astate.addNext(elt);
+                removedinfos.add(as);
+                /*le = getPreviousElementsOf(astate);
                 if (le.size() > 0) {
                     as0 = new AvatarState("entrance__" + astate.getName(), astate.getReferenceObject());
                     as0.addNext(as.getNext(0));
@@ -1013,7 +1088,7 @@ public class AvatarStateMachine extends AvatarElement {
                     //TraceManager.addDev("-> -> removed an internal state state!");
                 } else {
                     TraceManager.addDev("Badly formed state machine");
-                }
+                }*/
             }
         }
 
diff --git a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java
index 9fd7708873eb9f3bc0574b201c5a4be569401314..c3390bb71166a755305b2ea06967f0ebfed7355a 100644
--- a/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java
+++ b/src/main/java/avatartranslator/modelchecker/AvatarModelChecker.java
@@ -103,6 +103,7 @@ public class AvatarModelChecker implements Runnable, myutil.Graph {
             //TraceManager.addDev("Before clone:\n" + spec);
             initialSpec.removeLibraryFunctionCalls();
             initialSpec.removeCompositeStates();
+            TraceManager.addDev("Before clone:\n" + initialSpec);
             spec = initialSpec.advancedClone();
             //TraceManager.addDev("After clone:\n" + spec);
         }
diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java
index 85eb6fbcbb517c8a8f8d37e4bda5af1a6fab7e78..2ce1bb4c7d9056391303038c5051615f57286e42 100644
--- a/src/main/java/ui/AvatarDesignPanelTranslator.java
+++ b/src/main/java/ui/AvatarDesignPanelTranslator.java
@@ -1742,7 +1742,7 @@ public class AvatarDesignPanelTranslator {
         //TDiagramPanel tdp = asmdp;
 
         // Search for composite AvatarStates: they cannot be checked for reachability and liveness
-         for (TGComponent tgc : asmdp.getComponentList()) {
+         /*for (TGComponent tgc : asmdp.getComponentList()) {
              if (tgc instanceof AvatarSMDState) {
                  AvatarSMDState sta = (AvatarSMDState)tgc;
                  if (sta.isACompositeState()) {
@@ -1758,7 +1758,7 @@ public class AvatarDesignPanelTranslator {
 
                  }
              }
-         }
+         }*/