diff --git a/src/ui/GTURTLEModeling.java b/src/ui/GTURTLEModeling.java
index 82bf8c8e3fa5d18d679c42a46c11c9f5aa617ee4..c7159deed1cf7eabe67f8bac7ec80f3c1f3f68ec 100755
--- a/src/ui/GTURTLEModeling.java
+++ b/src/ui/GTURTLEModeling.java
@@ -4555,7 +4555,7 @@ public class GTURTLEModeling {
                     } catch (MalformedModelingException mme) {
                         Element elt = (Element) node;
                         String type = elt.getAttribute("type");
-                        TraceManager.addDev("Error when loading diagram: " + type);
+                        TraceManager.addDev("Error when loading diagram: " + elt + " " +type);
                         error = true;
                     }
                 }
@@ -7402,14 +7402,17 @@ public class GTURTLEModeling {
     }
 
 
-    public void addStates(AvatarStateMachineElement asme, int x, int y, AvatarSMDPanel smp, AvatarBDBlock bl, Map<AvatarStateMachineElement, TGComponent> SMDMap, Map<AvatarStateMachineElement, TGConnectingPoint> locMap, Map<AvatarTransition, AvatarStateMachineElement> tranDestMap, Map<AvatarTransition, TGConnectingPoint> tranSourceMap){
+    public void addStates(AvatarStateMachineElement asme, int x, int y, AvatarSMDPanel smp, AvatarBDBlock bl, Map<AvatarStateMachineElement, TGComponent> SMDMap, Map<AvatarStateMachineElement, TGComponent> locMap, Map<AvatarTransition, AvatarStateMachineElement> tranDestMap, Map<AvatarTransition, TGComponent> tranSourceMap){
 	TGConnectingPoint tp = new TGConnectingPoint(null, x, y, false, false);
+	//Create dummy tgcomponent
+	TGComponent tgcomp = new AvatarSMDStartState(x,y,x,x*2,y,y*2,false,null,smp);
 	if (asme instanceof AvatarStartState){
 	    AvatarSMDStartState smdss = new AvatarSMDStartState(x, y, x, x*2, y, y*2, false, null, smp);
+	    tgcomp = smdss;
 	    smp.addComponent(smdss, x, y, false, true);
 	    SMDMap.put(asme, smdss);
 	    tp = smdss.tgconnectingPointAtIndex(0);
-	    locMap.put(asme, tp);
+	    locMap.put(asme, smdss);
 	}
 	if (asme instanceof AvatarTransition){
 	   //
@@ -7418,6 +7421,7 @@ public class GTURTLEModeling {
 	    avatartranslator.AvatarSignal sig = ((AvatarActionOnSignal) asme).getSignal();
 	    if (sig.isIn()){
 		AvatarSMDReceiveSignal smdrs = new AvatarSMDReceiveSignal(x, y, x, x*2, y, y*2, false, null, smp);
+		tgcomp=smdrs;
 		smp.addComponent(smdrs, x, y, false, true);
 		String name=sig.getName().split("__")[sig.getName().split("__").length-1];
 	        smdrs.setValue(name+"()");
@@ -7426,7 +7430,7 @@ public class GTURTLEModeling {
 		SMDMap.put(asme, smdrs);
 	        tp = smdrs.getFreeTGConnectingPoint(x+smdrs.getWidth()/2,y+smdrs.getHeight());
 		TGConnectingPoint tp2 = smdrs.getFreeTGConnectingPoint(x+smdrs.getWidth()/2,y);
-	    	locMap.put(asme, tp2);
+	    	locMap.put(asme, smdrs);
 		if (bl.getAvatarSignalFromName(name) ==null){
 		    bl.addSignal(new ui.AvatarSignal(0, name, new String[0], new String[0]));
 		}
@@ -7434,6 +7438,7 @@ public class GTURTLEModeling {
 	    }
 	    else {
 		AvatarSMDSendSignal smdss = new AvatarSMDSendSignal(x, y, x, x*2, y, y*2, false, null, smp);
+		tgcomp=smdss;
 		smp.addComponent(smdss, x, y, false, true);
 	        String name=sig.getName().split("__")[sig.getName().split("__").length-1];
 	        smdss.setValue(name+"()");
@@ -7442,7 +7447,7 @@ public class GTURTLEModeling {
 		SMDMap.put(asme, smdss);
 	    	tp = smdss.getFreeTGConnectingPoint(x+smdss.getWidth()/2,y+smdss.getHeight());
 		TGConnectingPoint tp2 = smdss.getFreeTGConnectingPoint(x+smdss.getWidth()/2,y);
-	    	locMap.put(asme, tp2);
+	    	locMap.put(asme, smdss);
 		if (bl.getAvatarSignalFromName(name)  == null){
 		    bl.addSignal(new ui.AvatarSignal(1, name, new String[0], new String[0]));
 		}
@@ -7451,14 +7456,15 @@ public class GTURTLEModeling {
 	}
 	if (asme instanceof AvatarStopState){
 	    AvatarSMDStopState smdstop = new AvatarSMDStopState(x, y, x, x*2, y, y*2, false, null, smp);
+	    tgcomp=smdstop;
 	    SMDMap.put(asme, smdstop);
 	    smp.addComponent(smdstop, x, y, false, true);
 	    tp = smdstop.tgconnectingPointAtIndex(0);
-	    locMap.put(asme, tp);
+	    locMap.put(asme, smdstop);
 	}
 	if (asme instanceof AvatarState){
 	    //check if empty checker state
-	    if (asme.getName().contains("signalstate_")){
+	   /* if (asme.getName().contains("signalstate_")){
 		//don't add the state, ignore next transition, 
 		if (asme.getNexts().size()==1){
 		    AvatarStateMachineElement next = asme.getNext(0).getNext(0);
@@ -7471,40 +7477,43 @@ public class GTURTLEModeling {
 		    addStates(next, x, y, smp,bl, SMDMap, locMap, tranDestMap, tranSourceMap);
 		    return;
 		}
-	    }
+	    }*/
 	    AvatarSMDState smdstate = new AvatarSMDState(x, y, x, x*2, y, y*2, false, null, smp);
+	    tgcomp=smdstate;
 	    smp.addComponent(smdstate, x, y, false, true);
 	    smdstate.setValue(asme.getName());
 	    smdstate.recalculateSize();
 	    SMDMap.put(asme, smdstate);
 	    tp = smdstate.getFreeTGConnectingPoint(x+smdstate.getWidth()/2,y+smdstate.getHeight());
 	    TGConnectingPoint tp2 = smdstate.getFreeTGConnectingPoint(x+smdstate.getWidth()/2,y);
-	    locMap.put(asme, tp2);
+	    locMap.put(asme, smdstate);
 	}
-	int i=1;
-	int diff=400;
+	int i=0;
+	int diff=100;
 	int ydiff=50;
+	int num = asme.nbOfNexts();
 	for (AvatarStateMachineElement el:asme.getNexts()){
 	    if (el instanceof AvatarTransition){
-		tranSourceMap.put((AvatarTransition) el, tp);
+		tranSourceMap.put((AvatarTransition) el, tgcomp);
 	    }
 	    else {
 		AvatarTransition t = (AvatarTransition) asme;
 		tranDestMap.put(t, el);
 	    }
 	    if (!SMDMap.containsKey(el)){
-	    	addStates(el, diff*i, y+ydiff, smp, bl, SMDMap, locMap, tranDestMap, tranSourceMap);
-	    	i++;  
+	    	addStates(el, x+diff*(i-num/2), y+ydiff, smp, bl, SMDMap, locMap, tranDestMap, tranSourceMap);  
 	    }
+	    i++;
 	}
 	return;
     }
 
 
     public void drawPanel(AvatarSpecification avspec, AvatarDesignPanel adp){
-	Map<AvatarTransition, TGConnectingPoint> tranSourceMap = new HashMap<AvatarTransition, TGConnectingPoint>();
+
+	Map<AvatarTransition, TGComponent> tranSourceMap = new HashMap<AvatarTransition, TGComponent>();
 	Map<AvatarTransition, AvatarStateMachineElement> tranDestMap = new HashMap<AvatarTransition, AvatarStateMachineElement>();
-    	Map<AvatarStateMachineElement, TGConnectingPoint> locMap = new HashMap<AvatarStateMachineElement, TGConnectingPoint>();
+    	Map<AvatarStateMachineElement, TGComponent> locMap = new HashMap<AvatarStateMachineElement, TGComponent>();
     	Map<AvatarStateMachineElement, TGComponent> SMDMap = new HashMap<AvatarStateMachineElement, TGComponent>();
     	Map<String, Set<String>> originDestMap = new HashMap<String, Set<String>>();
     	Map<String, AvatarBDBlock> blockMap = new HashMap<String, AvatarBDBlock>();
@@ -7549,7 +7558,7 @@ public class GTURTLEModeling {
 		    bl.addCryptoElements();
 		}
 	    }
-	   // xpos+=300;
+	    xpos+=300;
 	    //Build the state machine
 	    int smx=400;
 	    int smy=40;
@@ -7566,14 +7575,42 @@ public class GTURTLEModeling {
 	    addStates(start, smx, smy, smp, bl, SMDMap, locMap, tranDestMap, tranSourceMap);
 	    //Add transitions
 	    for (AvatarTransition t: tranSourceMap.keySet()){
-		TGConnectingPoint p1 = tranSourceMap.get(t);
-		TGConnectingPoint p2 = locMap.get(tranDestMap.get(t));
+		int x=tranSourceMap.get(t).getX()+tranSourceMap.get(t).getWidth()/2;
+		int y=tranSourceMap.get(t).getY()+tranSourceMap.get(t).getHeight();
+
+	//	TGConnectingPoint p1 = tranSourceMap.get(t).findFirstFreeTGConnectingPoint(true,false);
+		TGConnectingPoint p1 = tranSourceMap.get(t).closerFreeTGConnectingPoint(x, y, true, false);
+		if (p1==null){
+		  //  p1= tranSourceMap.get(t).findFirstFreeTGConnectingPoint(true,true);
+		    p1=tranSourceMap.get(t).closerFreeTGConnectingPoint(x,y,true, true);
+		}
+		x= locMap.get(tranDestMap.get(t)).getX()+ locMap.get(tranDestMap.get(t)).getWidth()/2;
+		y = locMap.get(tranDestMap.get(t)).getY();
+		if (tranSourceMap.get(t).getY() > locMap.get(tranDestMap.get(t)).getY()){
+		    y=locMap.get(tranDestMap.get(t)).getY()+locMap.get(tranDestMap.get(t)).getHeight()/2;
+		    if (tranSourceMap.get(t).getX() < locMap.get(tranDestMap.get(t)).getX()){
+			x = locMap.get(tranDestMap.get(t)).getX();
+		    }
+		    else {
+			x= locMap.get(tranDestMap.get(t)).getX()+locMap.get(tranDestMap.get(t)).getWidth();
+		    }
+		}
+		TGConnectingPoint p2 = locMap.get(tranDestMap.get(t)).closerFreeTGConnectingPoint(x,y,false, true);
+		if (p2==null){
+		    p2=locMap.get(tranDestMap.get(t)).closerFreeTGConnectingPoint(x,y,true, true);
+		}
 		Vector points = new Vector();
 		if (p1==null || p2 ==null){
-		    System.out.println("Missing point");
+		    System.out.println(tranSourceMap.get(t)+" "+locMap.get(tranDestMap.get(t)));
+		
+		    System.out.println("Missing point "+ p1 + " "+p2);
 		    return;
 		}
 		AvatarSMDConnector SMDcon = new AvatarSMDConnector((int) p1.getX(), (int) p1.getY(), (int) p1.getX(), (int) p1.getY(), (int) p1.getX(), (int) p1.getY(), true, null, smp, p1, p2, points);	
+	  	//System.out.println(tranSourceMap.get(t)+" "+locMap.get(tranDestMap.get(t)));
+		///System.out.println("FREE " +p1.isFree() + " "+ p2.isFree());
+		p1.setFree(false);
+		p2.setFree(false);
 		String action="";
 		if (t.getActions().size()==0){
 		    action="";
@@ -7618,10 +7655,10 @@ public class GTURTLEModeling {
 		    	conn.setBlocking(ar.isBlocking());
 		    	conn.setPrivate(ar.isPrivate());
 		    	conn.setSizeOfFIFO(ar.getSizeOfFIFO());
-		    	System.out.println(bl1 +" "+ ar.block1.getName() + " "+ ar.block2.getName());
+		    	//System.out.println(bl1 +" "+ ar.block1.getName() + " "+ ar.block2.getName());
 			conn.addSignal("in " +ar.getSignal1(0).getName(),true,true);
 			conn.addSignal("out " +ar.getSignal2(0).getName(), false,false);
-			System.out.println("Added Signals");
+			//System.out.println("Added Signals");
 			conn.updateAllSignals();
 			p1.setFree(false);
 			p2.setFree(false);
diff --git a/src/ui/TGComponent.java b/src/ui/TGComponent.java
index 70a97aeefa50742ecee56cc83f5ad9400b7d6306..dca685bb1ffe0d797bbdca480b1335a3e0a325e5 100755
--- a/src/ui/TGComponent.java
+++ b/src/ui/TGComponent.java
@@ -2068,6 +2068,39 @@ public abstract class TGComponent implements CDElement, GenericTree {
         return currentCloser;
     }
 
+    public TGConnectingPoint closerFreeTGConnectingPoint(int x, int y, boolean out, boolean in) {
+        TGConnectingPoint currentCloser = null;
+        TGConnectingPoint currentp;
+        double d1, d2;
+        int i;
+	int ref=0;
+        //compare currentcloser to my points.
+        for(i=0; i<nbConnectingPoint; i++) {
+	    if (connectingPoint[i] instanceof TGConnectingPointComment){
+		continue;
+	    }
+            currentp = connectingPoint[i];
+            if ((currentp != null) && (currentp.isFree()) && (currentp.isIn() == in) && (currentp.isOut() == out)){
+                if (currentCloser == null) {
+                    currentCloser = currentp;
+		    ref=i;
+                } else {
+                    d1 = Point2D.distanceSq(currentp.getX(), currentp.getY(), x, y);
+                    d2 = Point2D.distanceSq(currentCloser.getX(), currentCloser.getY(), x, y);
+                    if (d1 < d2) {
+                        currentCloser = currentp;
+			ref=i;
+                    }
+                }
+            }
+        }
+	if (currentCloser!=null){
+	    connectingPoint[ref].setFree(false);
+	    return connectingPoint[ref];
+	}
+        return currentCloser;
+    }
+
     public TGConnectingPoint closerFreeTGConnectingPoint(int x, int y, boolean in) {
         TGConnectingPoint currentCloser = null;
         TGConnectingPoint currentp;