diff --git a/Makefile b/Makefile
index 53eeb8053c4c3f151cba7dfd0ab0fec25c6fc7eb..36fd4298391ee8173198a61b5760c7eadda8710b 100755
--- a/Makefile
+++ b/Makefile
@@ -265,8 +265,9 @@ $(STDRELEASE:.tgz=.tar): $(BASERELEASE:.tgz=.tar)
 	@cp $(TTOOL_DOC)/README_java $(TTOOL_TARGET)/java
 # Basic bin
 	@cp $(TTOOL_EXE) $(TTOOL_TARGET)/
+	@cp $(TTOOL_CONFIG_SRC) $(TTOOL_TARGET)/bin
 	@cp $(TTOOL_LOTOS_H) $(TTOOL_TARGET)/bin
-	@$(TAR) uf $@ -C $(TTOOL_TARGET_RELEASE) TTool/lotos TTool/nc TTool/bin TTool/java TTool/figures TTool/nc TTool/lotos TTool/doc/prototyping_with_soclib_installation_guide.pdf TTool/doc/prototyping_with_soclib_user_guide.pdf  $(patsubst $(TTOOL_DOC)/%,TTool/%,$(TTOOL_EXE))
+	@$(TAR) uf $@ -C $(TTOOL_TARGET_RELEASE) TTool/lotos TTool/nc TTool/bin TTool/java TTool/figures TTool/nc TTool/lotos TTool/doc/prototyping_with_soclib_installation_guide.pdf TTool/doc/prototyping_with_soclib_user_guide.pdf  $(patsubst $(TTOOL_DOC)/%,TTool/%,$(TTOOL_EXE)) $(patsubst $(TTOOL_DOC)/%,TTool/bin/%,$(TTOOL_CONFIG_SRC))
 
 $(ADVANCED_RELEASE:.tgz=.tar): $(STDRELEASE:.tgz=.tar) documentation
 	@echo "$(PREFIX) Generating advanced release"
@@ -294,9 +295,9 @@ $(TTOOL_PREINSTALL_WINDOWS:.tgz=.tar): $(BASERELEASE:.tgz=.tar)
 	@mkdir -p $(TTOOL_TARGET_WINDOWS)/TTool/bin
 	@$(TAR) xzvf $(TTOOL_PRIVATE)/stocks/proverif_windows.tar.gz -C $(TTOOL_TARGET_WINDOWS)
 	@$(TAR) xzvf $(TTOOL_PRIVATE)/stocks/uppaal.tar.gz -C $(TTOOL_TARGET_WINDOWS)
-	@cp $(TTOOL_DOC)/config_windows.xml $(TTOOL_TARGET_WINDOWS)/TTool/bin/config.xml
-	@cp $(TTOOL_DOC)/ttool_windows.bat $(TTOOL_TARGET_WINDOWS)/ttool.bat
-	@$(TAR) uf $@ -C $(TTOOL_TARGET_WINDOWS) proverif uppaal TTool/bin/config.xml ttool.bat
+	@cp $(TTOOL_DOC)/config_windows.xml $(TTOOL_TARGET_WINDOWS)/TTool/bin/
+	@sed 's#chdir .*#chdir TTool/bin#' $(TTOOL_DOC)/ttool_windows.bat > $(TTOOL_TARGET_WINDOWS)/ttool.bat
+	@$(TAR) uf $@ -C $(TTOOL_TARGET_WINDOWS) proverif uppaal TTool/bin/config_windows.xml ttool.bat
 
 $(TTOOL_PREINSTALL_MACOS:.tgz=.tar): $(BASERELEASE:.tgz=.tar)
 	@echo "$(PREFIX) Generating preinstall for MacOS"
@@ -305,9 +306,9 @@ $(TTOOL_PREINSTALL_MACOS:.tgz=.tar): $(BASERELEASE:.tgz=.tar)
 	@$(TAR) xzf $(TTOOL_PRIVATE)/stocks/proverif_macos.tar.gz -C $(TTOOL_TARGET_MACOS)
 	@$(TAR) xzf $(TTOOL_PRIVATE)/stocks/uppaal_macos.tar.gz -C $(TTOOL_TARGET_MACOS)
 	@mv $(TTOOL_TARGET_MACOS)/uppaal* $(TTOOL_TARGET_MACOS)/uppaal
-	@cp $(TTOOL_DOC)/config_macosx.xml $(TTOOL_TARGET_MACOS)/TTool/bin/config.xml
-	@cp $(TTOOL_DOC)/ttool4preinstalllinux.exe $(TTOOL_TARGET_MACOS)/ttool.exe
-	@$(TAR) uf $@ -C $(TTOOL_TARGET_MACOS) proverif uppaal TTool/bin/config.xml ttool.exe
+	@cp $(TTOOL_DOC)/config_macosx.xml $(TTOOL_TARGET_MACOS)/TTool/bin/config_macosx.xml
+	@sed 's#cd [^;]*#cd TTool/bin#' $(TTOOL_DOC)/ttool_macosx.exe > $(TTOOL_TARGET_MACOS)/ttool.exe
+	@$(TAR) uf $@ -C $(TTOOL_TARGET_MACOS) proverif uppaal TTool/bin/config_macosx.xml ttool.exe
 
 $(TTOOL_PREINSTALL_LINUX:.tgz=.tar): $(BASERELEASE:.tgz=.tar)
 	@echo "$(PREFIX) Generating preinstall for Linux"
@@ -315,13 +316,13 @@ $(TTOOL_PREINSTALL_LINUX:.tgz=.tar): $(BASERELEASE:.tgz=.tar)
 	@mkdir -p $(TTOOL_TARGET_LINUX)/TTool/bin
 	@$(TAR) xzvf $(TTOOL_PRIVATE)/stocks/proverif_linux.tar.gz -C $(TTOOL_TARGET_LINUX)
 	@$(TAR) xzvf $(TTOOL_PRIVATE)/stocks/uppaal.tar.gz -C $(TTOOL_TARGET_LINUX)
-	@cp $(TTOOL_DOC)/config_linux.xml $(TTOOL_TARGET_LINUX)/TTool/bin/config.xml
-	@cp $(TTOOL_DOC)/ttool4preinstalllinux.exe $(TTOOL_TARGET_LINUX)/ttool.exe
-	@$(TAR) uf $@ -C $(TTOOL_TARGET_LINUX) proverif uppaal TTool/bin/config.xml ttool.exe
+	@cp $(TTOOL_DOC)/config_linux.xml $(TTOOL_TARGET_LINUX)/TTool/bin/config_linux.xml
+	@sed 's#cd [^;]*#cd TTool/bin#' $(TTOOL_DOC)/ttool_linux.exe > $(TTOOL_TARGET_LINUX)/ttool.exe
+	@$(TAR) uf $@ -C $(TTOOL_TARGET_LINUX) proverif uppaal TTool/bin/config_linux.xml ttool.exe
 
-$(BASERELEASE:.tgz=.tar): $(JTTOOL_BINARY) $(TTOOL_BINARY) $(LAUNCHER_BINARY) $(TIFTRANSLATOR_BINARY) $(TMLTRANSLATOR_BINARY) $(RUNDSE_BINARY)
+$(BASERELEASE:.tgz=.tar): $(JTTOOL_BINARY) $(TTOOL_BINARY) $(LAUNCHER_BINARY) $(TIFTRANSLATOR_BINARY) $(TMLTRANSLATOR_BINARY) $(RUNDSE_BINARY) FORCE
 	@echo "$(PREFIX) Preparing base release"
-	@rm -rf $(TTOOL_TARGET)
+	@rm -rf $(TTOOL_TARGET_RELEASE)
 	@mkdir -p $(TTOOL_TARGET)
 # modeling
 	@mkdir -p $(TTOOL_TARGET)/modeling
diff --git a/build.txt b/build.txt
index 18e0079f66897175d336b2266def0d0dc9e45db8..2480a4d9e276626bb1d138e2caffd068010b38ff 100644
--- a/build.txt
+++ b/build.txt
@@ -1 +1 @@
-12281
\ No newline at end of file
+12284
\ No newline at end of file
diff --git a/doc/ttool4preinstalllinux.exe b/doc/ttool4preinstalllinux.exe
deleted file mode 100755
index d48338cd0491961d843d205f275f578ddb80cf74..0000000000000000000000000000000000000000
--- a/doc/ttool4preinstalllinux.exe
+++ /dev/null
@@ -1 +0,0 @@
-cd TTool/bin; java -Xmx1024m -jar ttool.jar -launcher -config config.xml -nc -diplodocus -avatar -proverif
diff --git a/doc/ttool_windows.bat b/doc/ttool_windows.bat
index 7abb8c080eb4a59496f96f57400baa360bfb9829..0a3024b9e2a5421d9de2c4cb93a449dd274c4398 100755
--- a/doc/ttool_windows.bat
+++ b/doc/ttool_windows.bat
@@ -1,3 +1,3 @@
 chdir  bin
-java -Xmx1024m -jar ttool.jar -launcher -config config.xml -nc -diplodocus -avatar -proverif
+java -Xmx1024m -jar ttool.jar -launcher -config config_windows.xml -nc -diplodocus -avatar -proverif
 
diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java
index 7cebaa4cc522807ec8308f922075b356675d87b0..0bf3b8703144be4da48984f0993bacfb63a53f1c 100644
--- a/src/main/java/avatartranslator/AvatarSpecification.java
+++ b/src/main/java/avatartranslator/AvatarSpecification.java
@@ -49,7 +49,7 @@ import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-
+import java.util.ArrayList;
 /**
    * Class AvatarSpecification
    * Avatar specification
@@ -75,7 +75,7 @@ public class AvatarSpecification extends AvatarElement {
     private LinkedList<AvatarPragma> pragmas;
     private LinkedList<String> safety_pragmas;
     private LinkedList<AvatarConstant> constants;
-
+	public List<String> checkedIDs;
     private boolean robustnessMade = false;
 
     private Object informationSource; // element from which the spec has been built
@@ -91,7 +91,7 @@ public class AvatarSpecification extends AvatarElement {
 	safety_pragmas = new LinkedList<String>();
         this.constants.add (AvatarConstant.FALSE);
         this.constants.add (AvatarConstant.TRUE);
-
+		checkedIDs= new ArrayList<String>();
         this.libraryFunctions = new LinkedList<AvatarLibraryFunction> ();
     }
 
@@ -640,6 +640,9 @@ public class AvatarSpecification extends AvatarElement {
 		    AvatarConstant cN = constant.advancedClone();
 		    spec.addConstant(cN);
 		}
+		for (String id:checkedIDs){
+			spec.checkedIDs.add(id);
+		}
 
 		spec.setInformationSource(getInformationSource());
 		spec.addApplicationCode(getApplicationCode());
diff --git a/src/main/java/myutil/SVGGraphics.java b/src/main/java/myutil/SVGGraphics.java
index c72aa886d1e87568bd2f3e74ce086aec5b799646..ad2440d851c2352f10016a4be3652e95af8e538b 100755
--- a/src/main/java/myutil/SVGGraphics.java
+++ b/src/main/java/myutil/SVGGraphics.java
@@ -139,7 +139,7 @@ public class SVGGraphics extends Graphics2D {
 
     }
 
-
+    @Override
     public void drawRect(int x, int y, int width, int height) {
         //TraceManager.addDev("Drawing svg rect");
         String s = makeArg("x", x);
@@ -154,6 +154,7 @@ public class SVGGraphics extends Graphics2D {
         svgvalue += makeDesc("rect", s);
     }
 
+    @Override
     public void draw3DRect(int x, int y, int width, int height, boolean raised) {
         String s = makeArg("x", x);
         s += makeArg("y", y);
@@ -166,6 +167,7 @@ public class SVGGraphics extends Graphics2D {
         svgvalue += makeDesc("rect", s);
     }
 
+    @Override
     public void drawLine(int x1, int y1, int x2, int y2) {
         //TraceManager.addDev("Drawing svg 3D line");
         String s = makeArg("x1", x1);
@@ -179,6 +181,7 @@ public class SVGGraphics extends Graphics2D {
         svgvalue += makeDesc("line", s);
     }
 
+    @Override
     public void drawOval(int x, int y, int width, int height) {
         String s = makeArg("cx", x+width/2);
         s += makeArg("cy", y+height/2);
@@ -191,6 +194,7 @@ public class SVGGraphics extends Graphics2D {
         svgvalue += makeDesc("ellipse", s);
     }
 
+    @Override
     public void drawPolygon(int[] xPoints, int[] yPoints, int nPoints) {
         String s = "";
         for(int i=0; i<nPoints; i++) {
@@ -205,6 +209,7 @@ public class SVGGraphics extends Graphics2D {
 
     }
 
+    @Override
     public void drawRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
         String s = makeArg("x", x);
         s += makeArg("y", y);
@@ -219,6 +224,7 @@ public class SVGGraphics extends Graphics2D {
         svgvalue += makeDesc("rect", s);
     }
 
+    @Override
     public  void drawString(String str, int x, int y){
         String s = makeArg("x", x);
         s += makeArg("y", y);
@@ -230,6 +236,7 @@ public class SVGGraphics extends Graphics2D {
         svgvalue += makeDescWithValue("text", s, Conversion.transformToXMLString(str));
     }
 
+    @Override
     public void fill3DRect(int x, int y, int width, int height, boolean raised) {
         String s = makeArg("x", x);
         s += makeArg("y", y);
@@ -240,6 +247,7 @@ public class SVGGraphics extends Graphics2D {
         svgvalue += makeDesc("rect", s);
     }
 
+    @Override
     public void fillOval(int x, int y, int width, int height) {
         String s = makeArg("cx", x+width/2);
         s += makeArg("cy", y+height/2);
@@ -250,6 +258,7 @@ public class SVGGraphics extends Graphics2D {
         svgvalue += makeDesc("ellipse", s);
     }
 
+    @Override
     public void fillPolygon(int[] xPoints, int[] yPoints, int nPoints) {
         String s = "";
         for(int i=0; i<nPoints; i++) {
@@ -262,6 +271,7 @@ public class SVGGraphics extends Graphics2D {
 
     }
 
+    @Override
     public void fillRect(int x, int y, int width, int height) {
         String s = makeArg("x", x);
         s += makeArg("y", y);
@@ -272,6 +282,7 @@ public class SVGGraphics extends Graphics2D {
         svgvalue += makeDesc("rect", s);
     }
 
+    @Override
     public void fillRoundRect(int x, int y, int width, int height, int arcWidth, int arcHeight) {
         String s = makeArg("x", x);
         s += makeArg("y", y);
@@ -290,239 +301,281 @@ public class SVGGraphics extends Graphics2D {
 
     // From Graphics2D
 
+    @Override
     public void addRenderingHints(Map<?,?> hints) {}
 
+    @Override
     public void clip(Shape s) {}
 
+    @Override
     public void draw(Shape s) {}
 
+    @Override
     public void drawGlyphVector(GlyphVector g, float x, float y) {}
 
+    @Override
     public void drawImage(BufferedImage img, BufferedImageOp op, int x, int y) {}
 
-    public  boolean     drawImage(Image img, AffineTransform xform, ImageObserver obs) {
+    @Override
+    public boolean drawImage(Image img, AffineTransform xform, ImageObserver obs) {
         return true;
     }
 
-    public  void drawRenderableImage(RenderableImage img, AffineTransform xform){}
-
-    public  void drawRenderedImage(RenderedImage img, AffineTransform xform){}
-
-    public  void drawString(AttributedCharacterIterator iterator, float x, float y){}
+    @Override
+    public void drawRenderableImage(RenderableImage img, AffineTransform xform){}
 
-    public  void drawString(AttributedCharacterIterator iterator, int x, int y){}
+    @Override
+    public void drawRenderedImage(RenderedImage img, AffineTransform xform){}
 
-    public  void drawString(String str, float x, float y){}
+    @Override
+    public void drawString(AttributedCharacterIterator iterator, float x, float y){}
 
+    @Override
+    public void drawString(AttributedCharacterIterator iterator, int x, int y){}
 
+    @Override
+    public void drawString(String str, float x, float y){}
 
-    public  void fill(Shape s){}
-
-
+    @Override
+    public void fill(Shape s){}
 
+    @Override
     public Color getBackground() {
         return graphics.getBackground();
     }
 
+    @Override
     public Composite getComposite() {
         return graphics.getComposite();
     }
 
+    @Override
     public GraphicsConfiguration getDeviceConfiguration() {
         return graphics.getDeviceConfiguration();
     }
 
+    @Override
     public FontRenderContext getFontRenderContext() {
         return graphics.getFontRenderContext();
     }
 
+    @Override
     public Paint getPaint() {
         return graphics.getPaint();
     }
 
+    @Override
     public Object getRenderingHint(RenderingHints.Key hintKey) {
         return graphics.getRenderingHint(hintKey);
     }
 
+    @Override
     public RenderingHints getRenderingHints() {
         return graphics.getRenderingHints();
     }
 
+    @Override
     public Stroke getStroke() {
         return graphics.getStroke();
     }
 
+    @Override
     public AffineTransform getTransform() {
         return graphics.getTransform();
     }
 
+    @Override
     public boolean hit(Rectangle rect, Shape s, boolean onStroke) {
         return graphics.hit(rect, s, onStroke);
     }
 
+    @Override
     public void rotate(double theta) {
     }
 
+    @Override
     public void rotate(double theta, double x, double y) {
     }
 
+    @Override
     public void scale(double sx, double sy) {
     }
 
+    @Override
     public void setBackground(Color color) {
         graphics.setBackground(color);
     }
 
+    @Override
     public void setComposite(Composite comp) {
         graphics.setComposite(comp);
     }
 
+    @Override
     public void setPaint(Paint paint) {
         graphics.setPaint(paint);
     }
 
+    @Override
     public void setRenderingHint(RenderingHints.Key hintKey, Object hintValue) {
         graphics.setRenderingHint(hintKey, hintValue);
     }
 
+    @Override
     public void setRenderingHints(Map<?,?> hints) {
         graphics.setRenderingHints(hints);
     }
 
+    @Override
     public void setStroke(Stroke s) {
         graphics.setStroke(s);
     }
 
-
+    @Override
     public void setTransform(AffineTransform Tx) {
         graphics.setTransform(Tx);
     }
 
+    @Override
     public void shear(double shx, double shy) {
     }
 
+    @Override
     public void transform(AffineTransform Tx) {
     }
 
+    @Override
     public void translate(double tx, double ty) {
     }
 
+    @Override
     public void translate(int x, int y) {
     }
 
 
     // Graphics
-
+    
+    @Override
     public void clearRect(int x, int y, int width, int height) {}
 
+    @Override
     public void clipRect(int x, int y, int width, int height) {}
 
+    @Override
     public void copyArea(int x, int y, int width, int height, int dx, int dy) {}
 
+    @Override
     public Graphics create() {
         return graphics.create();
     }
 
+    @Override
     public void dispose() {}
 
+    @Override
     public  void drawArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
     }
 
+    @Override
     public boolean drawImage(Image img, int x, int y, Color bgcolor, ImageObserver observer) {
         return true;
     }
 
+    @Override
     public boolean drawImage(Image img, int x, int y, ImageObserver observer) {
         return true;
     }
 
+    @Override
     public boolean drawImage(Image img, int x, int y, int width, int height, Color bgcolor, ImageObserver observer) {
         return true;
     }
 
+    @Override
     public boolean drawImage(Image img, int x, int y, int width, int height, ImageObserver observer) {
         return true;
     }
 
+    @Override
     public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, Color bgcolor, ImageObserver observer) {
         return true;
     }
 
+    @Override
     public boolean drawImage(Image img, int dx1, int dy1, int dx2, int dy2, int sx1, int sy1, int sx2, int sy2, ImageObserver observer) {
         return true;
     }
 
+    @Override
     public void drawPolyline(int[] xPoints, int[] yPoints, int nPoints) {
     }
 
+    @Override
     public void fillArc(int x, int y, int width, int height, int startAngle, int arcAngle) {
     }
 
+    @Override
     public Shape getClip() {
         return graphics.getClip();
     }
 
+    @Override
     public Rectangle getClipBounds() {
         return graphics.getClipBounds();
     }
 
+    @Override
     public Rectangle getClipBounds(Rectangle r) {
         return graphics.getClipBounds(r);
     }
 
+    @Override
     public Color getColor() {
         return graphics.getColor();
     }
 
+    @Override
     public Font getFont() {
         return graphics.getFont();
     }
 
+    @Override
     public FontMetrics getFontMetrics() {
         return graphics.getFontMetrics();
     }
 
+    @Override
     public FontMetrics getFontMetrics(Font f) {
         return graphics.getFontMetrics(f);
     }
 
+    @Override
     public void setClip(int x, int y, int width, int height) {
         graphics.setClip(x, y, width, height);
     }
 
+    @Override
     public void setClip(Shape clip) {
         graphics.setClip(clip);
     }
 
+    @Override
     public void setColor(Color c) {
         graphics.setColor(c);
     }
 
+    @Override
     public void setFont(Font font) {
         graphics.setFont(font);
     }
 
+    @Override
     public void setPaintMode() {
         graphics.setPaintMode();
     }
 
+    @Override
     public void setXORMode(Color c1) {
         graphics.setXORMode(c1);
     }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 }
diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java
index b0f295809a46512d6b8c95e2dfd5145e2b3106ce..40382324015729ef23858eb93dd67205fab82456 100644
--- a/src/main/java/ui/AvatarDesignPanelTranslator.java
+++ b/src/main/java/ui/AvatarDesignPanelTranslator.java
@@ -1009,6 +1009,9 @@ public class AvatarDesignPanelTranslator {
 
         this.listE.addCor (aaos, asmdss);
         asmdss.setAVATARID (aaos.getID());
+		if (asmdss.getCheckLatency()){
+			_as.checkedIDs.add(asmdss.getName()+":"+aaos.getID());
+		}
         asm.addElement (aaos);
     }
 
@@ -1285,6 +1288,9 @@ public class AvatarDesignPanelTranslator {
         this.listE.addCor (aaos, asmdrs);
         asmdrs.setAVATARID (aaos.getID());
         asm.addElement (aaos);
+		if (asmdrs.getCheckLatency()){
+			_as.checkedIDs.add(asmdrs.getName()+":"+aaos.getID());
+		}
     }
 
     private void translateAvatarSMDState (TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab, AvatarSMDState tgc) throws CheckingError {
@@ -1305,6 +1311,9 @@ public class AvatarDesignPanelTranslator {
         this.listE.addCor (astate, tgc);
         astate.addReferenceObject (tgc);
         tgc.setAVATARID (astate.getID());
+		if (tgc.getCheckLatency()){
+			_as.checkedIDs.add(tgc.getName()+":"+astate.getID());
+		}
     }
 
     private void translateAvatarSMDRandom (TDiagramPanel tdp, AvatarSpecification _as, AvatarStateMachineOwner _ab, AvatarSMDRandom asmdrand) throws CheckingError {
diff --git a/src/main/java/ui/TDiagramPanel.java b/src/main/java/ui/TDiagramPanel.java
index 893eae3b94c625e838a9348535df8f38ed51ad2f..aec52d1fff78d4bc57ec1ad513c41b4bf366d515 100755
--- a/src/main/java/ui/TDiagramPanel.java
+++ b/src/main/java/ui/TDiagramPanel.java
@@ -153,7 +153,8 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
 
     private boolean draw;
 
-    private Graphics lastGraphics;
+    // Issue #14 point 10: Always use the current graphics
+    //private Graphics lastGraphics;
 
     // MODE
     public int mode;
@@ -426,7 +427,7 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         else
             g.setFont (fontToUse);
 
-        this.lastGraphics = g;
+       // this.lastGraphics = g;
         this.drawingMain = b;
 
         if (!this.overcomeShowing && !this.isShowing()) {
@@ -1954,14 +1955,14 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
 //        if (maxX < minimumXSize + increment) {
 //            downX.setEnabled(false);
 //        } else {
-        	// Issue #14
+        // Issue #14
         downX.setEnabled( canDecreaseMaxX() );
 //        }
 
 //        if (maxY < minimumYSize + increment) {
 //            downY.setEnabled(false);
 //        } else {
-        	// Issue #14
+        // Issue #14
         downY.setEnabled( canDecreaseMaxY() );
 //        }
         
@@ -2942,9 +2943,10 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         boolean b = draw;
         BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
         Graphics2D g = image.createGraphics();
-        if (lastGraphics != null) {
-            g.setFont(lastGraphics.getFont());
-        }
+        g.setFont( getGraphics().getFont() );
+//        if (lastGraphics != null) {
+//            g.setFont(lastGraphics.getFont());
+//        }
         draw = true;
         //paintMycomponents(g);
         overcomeShowing = true;
@@ -2979,9 +2981,12 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         int h = this.getHeight();
         BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
         Graphics2D g = image.createGraphics();
-        if (lastGraphics != null) {
-            g.setFont(lastGraphics.getFont());
-        }
+        
+        // Issue #14 point 10: Always use the current graphics
+        g.setFont( getGraphics().getFont() );
+//        if (lastGraphics != null) {
+//            g.setFont(lastGraphics.getFont());
+//        }
         selectedTemp = false;
         Color colorTmp = ColorManager.SELECTED_0;
         ColorManager.SELECTED_0 = ColorManager.NORMAL_0;
@@ -3231,7 +3236,10 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         sb.append("<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\"");
         sb.append(" width=\"" + (w+x) + "\" height=\"" + (h+y) + "\" viewbox=\"" + x + " " + y + " " + w + " " + h + "\">\n");
 
-        SVGGraphics svgg = new SVGGraphics((Graphics2D)lastGraphics);
+        // Issue #14 point 10: Somehow the last graphics that was used is different than the actual one leading
+        // to an error in calculating string lengths
+        final SVGGraphics svgg = new SVGGraphics( (Graphics2D) getGraphics() );
+//      SVGGraphics svgg = new SVGGraphics((Graphics2D)lastGraphics);
 
         RepaintManager.currentManager(this).setDoubleBufferingEnabled(false);
         //this.paint(svgg);
diff --git a/src/main/java/ui/TToolBar.java b/src/main/java/ui/TToolBar.java
index cf02a94cda22e4010fe20ffe9270152f5486743c..add31cb3dcd21d8d3ca73324c02e6363a438768b 100755
--- a/src/main/java/ui/TToolBar.java
+++ b/src/main/java/ui/TToolBar.java
@@ -143,3 +143,4 @@ public abstract class TToolBar extends JToolBar implements ActionListener {
     }
 
 } // Class
+
diff --git a/src/main/java/ui/avatarinteractivesimulation/AvatarInteractiveSimulationActions.java b/src/main/java/ui/avatarinteractivesimulation/AvatarInteractiveSimulationActions.java
index 26c1eabd4240668470a775a58a0148cf18213acc..7df2e86fc152f7fc9e051a3739120b77813c4b38 100755
--- a/src/main/java/ui/avatarinteractivesimulation/AvatarInteractiveSimulationActions.java
+++ b/src/main/java/ui/avatarinteractivesimulation/AvatarInteractiveSimulationActions.java
@@ -103,8 +103,8 @@ public class AvatarInteractiveSimulationActions extends AbstractAction {
     public static final int ACT_DELETE_ASYNC_MSG = 32;
     public static final int ACT_UP_ASYNC_MSG = 33;
     public static final int ACT_DOWN_ASYNC_MSG = 34;
-
-    public static final int NB_ACTION = 35;
+    public static final int ACT_ADD_LATENCY = 35;
+    public static final int NB_ACTION = 36;
 
 
     private  static final TAction [] actions = new TAction[NB_ACTION];
@@ -190,6 +190,7 @@ public class AvatarInteractiveSimulationActions extends AbstractAction {
         actions[ACT_DELETE_ASYNC_MSG] = new TAction("delete-async-command", "Delete", IconManager.imgic336, IconManager.imgic336, "Delete msg +", "Delete the selected message", '0');
         actions[ACT_UP_ASYNC_MSG] = new TAction("up-async-command", "Up", IconManager.imgic78, IconManager.imgic78, "Up msg", "Put a async msg closer to the FIFO exit", '0');
         actions[ACT_DOWN_ASYNC_MSG] = new TAction("up-async-command", "Down", IconManager.imgic79, IconManager.imgic79, "Down msg", "Put a async msg further from the FIFO exit", '0');
+        actions[ACT_ADD_LATENCY] = new TAction("add-latency-command", "Add latency", IconManager.imgic75, IconManager.imgic75, "Add latency", "Add latency checkpoint", '0');
     }
 
     public String getActionCommand()  {
diff --git a/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java b/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java
index 57ea772b1e1d475561d5aff5637c2d3a38d7447f..a60eb118885822519012ca361df7d9bde91008b8 100755
--- a/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java
+++ b/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java
@@ -47,6 +47,7 @@ import common.ConfigurationTTool;
 import myutil.*;
 import ui.*;
 import ui.avatarbd.AvatarBDPortConnector;
+import ui.interactivesimulation.*;
 import ui.util.IconManager;
 
 import javax.swing.*;
@@ -61,6 +62,11 @@ import java.io.File;
 import java.util.Hashtable;
 import java.util.LinkedList;
 import java.util.Vector;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Collections;
 
 /**
    * Class JFrameAvatarInteractiveSimulation
@@ -220,6 +226,20 @@ public  class JFrameAvatarInteractiveSimulation extends JFrame implements Avatar
     // Async messages
     Vector<AvatarSimulationAsynchronousTransaction> lastAsyncmsgs;
 
+    //Latency
+    JPanel latencyPanel;
+    JComboBox<String> transaction1;
+    JComboBox<String> transaction2;
+    JButton addLatencyCheckButton;
+    JButton updateLatencyButton;
+    LatencyTableModel latm;
+    public Vector<String> checkedTransactions = new Vector<String>();
+    private Vector<SimulationLatency> latencies = new Vector<SimulationLatency>();
+	List<String> toCheck = new ArrayList<String>();
+	Map<String, List<String>> transTimes = new HashMap<String, List<String>>();
+
+    private JScrollPane jspLatency;
+
     public JFrameAvatarInteractiveSimulation(/*Frame _f,*/ MainGUI _mgui, String _title, AvatarSpecification _avspec) {
         super(_title);
 
@@ -241,7 +261,10 @@ public  class JFrameAvatarInteractiveSimulation extends JFrame implements Avatar
         initActions();
 
         initSimulation();
-
+		for (String id: _avspec.checkedIDs){
+			checkedTransactions.add(id);
+			transTimes.put(id, new ArrayList<String>());		
+		}
         makeComponents();
         setComponents();
     }
@@ -772,6 +795,8 @@ public  class JFrameAvatarInteractiveSimulation extends JFrame implements Avatar
         transactionPanel.add(jspTransactionInfo, BorderLayout.CENTER);
 
 
+
+
 	// Met elements
         metElementsPanel = new JPanel();
         metElementsPanel.setLayout(new BorderLayout());
@@ -821,6 +846,71 @@ public  class JFrameAvatarInteractiveSimulation extends JFrame implements Avatar
         jspDisplayedBlocks.setPreferredSize(new Dimension(250, 300));
         infoTab.addTab("Displayed blocks", IconManager.imgic1202, jspDisplayedBlocks, "Displayed blocks");
 
+
+        // Latencies
+       	latencyPanel = new JPanel();
+		infoTab.addTab("Latencies", IconManager.imgic1202, latencyPanel, "Latencies");
+        GridBagLayout gridbag0 = new GridBagLayout();
+        GridBagConstraints c0 = new GridBagConstraints();
+        latencyPanel.setLayout(gridbag0);
+        c0.gridwidth = GridBagConstraints.REMAINDER;
+		latencyPanel.add(new JLabel("Latencies shown in number of cycles relative to the main clock"), c0);
+
+        c0.gridwidth=1;
+        c0.gridheight=1;
+        latencyPanel.add(new JLabel("Checkpoint 1:"),c0);
+        c0.gridwidth = GridBagConstraints.REMAINDER;
+        transaction1 = new JComboBox<String>(checkedTransactions);
+        latencyPanel.add(transaction1, c0);
+
+        c0.gridwidth=1;
+        latencyPanel.add(new JLabel("Checkpoint 2:"),c0);
+        c0.gridwidth= GridBagConstraints.REMAINDER;
+        transaction2 = new JComboBox<String>(checkedTransactions);
+        latencyPanel.add(transaction2, c0);
+
+
+        addLatencyCheckButton = new JButton(actions[AvatarInteractiveSimulationActions.ACT_ADD_LATENCY]);
+        latencyPanel.add(addLatencyCheckButton,c0);
+        latm = new LatencyTableModel();
+        latm.setData(latencies);
+        sorterPI = new TableSorter(latm);
+        final JTable latTable = new JTable(sorterPI);
+	/*	latTable.addMouseListener(new java.awt.event.MouseAdapter() {
+			@Override
+ 			public void mouseClicked(java.awt.event.MouseEvent evt) {
+    			int row = latTable.rowAtPoint(evt.getPoint());
+    			int col = latTable.columnAtPoint(evt.getPoint());
+    			if (row >= 0 && col >= 0 && col <2) {
+					for (TGComponent tgc: tmap.getTMLModeling().getCheckedComps().keySet()){
+						if (tmap.getTMLModeling().getCheckedComps().get(tgc).equals(latm.getValueAt(row,col).toString().split(" ")[0])){
+        				    mgui.selectTab(tgc.getTDiagramPanel());
+            				tgc.getTDiagramPanel().highlightTGComponent(tgc);
+						}
+					}
+    			}
+ 			}
+		});*/
+        sorterPI.setTableHeader(latTable.getTableHeader());
+        ((latTable.getColumnModel()).getColumn(0)).setPreferredWidth(700);
+        ((latTable.getColumnModel()).getColumn(1)).setPreferredWidth(700);
+        ((latTable.getColumnModel()).getColumn(2)).setPreferredWidth(100);
+        ((latTable.getColumnModel()).getColumn(3)).setPreferredWidth(100);
+        ((latTable.getColumnModel()).getColumn(4)).setPreferredWidth(100);
+        ((latTable.getColumnModel()).getColumn(5)).setPreferredWidth(100);
+        latTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
+        jspLatency = new JScrollPane(latTable);
+        jspLatency.setWheelScrollingEnabled(true);
+        jspLatency.getVerticalScrollBar().setUnitIncrement(10);
+        jspLatency.setMinimumSize(new Dimension(400, 250));
+        jspLatency.setPreferredSize(new Dimension(1400, 250));
+        latencyPanel.add(jspLatency, c0);
+
+
+
+//        updateLatencyButton = new JButton(actions[InteractiveSimulationActions.ACT_UPDATE_LATENCY]);
+  //      latencyPanel.add(updateLatencyButton,c0);
+
         //Randomness
         randomPanel = new JPanel();
         randomPanel.setLayout(new GridBagLayout());
@@ -991,6 +1081,11 @@ public  class JFrameAvatarInteractiveSimulation extends JFrame implements Avatar
             ass.resetSimulation();
             //ass.backOneTransactionBunch();
         }
+	//	latencies.clear();
+		transTimes.clear();
+		for (String id: avspec.checkedIDs){
+			transTimes.put(id, new ArrayList<String>());		
+		}
         //ass.killSimulation();
     }
 
@@ -1332,10 +1427,84 @@ public  class JFrameAvatarInteractiveSimulation extends JFrame implements Avatar
         //nbOfAllExecutedElements = hashOfAllElements.hashCode();
     }
 
+	public void addLatency(){
+		toCheck.add(transaction1.getSelectedItem().toString()+"--"+transaction2.getSelectedItem().toString());
+		updateTransactionsTable();
+	}
+
     public void updateTransactionsTable() {
         if (transactiontm != null) {
             transactiontm.fireTableStructureChanged();
         }
+		if (ass!=null && latm!=null){
+			latencies.clear();
+			if (ass.getAllTransactions()!=null){
+				for (AvatarSimulationTransaction trans: ass.getAllTransactions()){
+					String id = ((TGComponent)trans.executedElement.getReferenceObject()).getName() + ":"+Integer.toString(trans.executedElement.getID());
+				//	System.out.println(id + " " + transTimes.keySet());
+				//	System.out.println("transaction " + trans.executedElement.getID() + " " + trans.initialClockValue);
+					if (transTimes.containsKey(id)){
+						if (!transTimes.get(id).contains(Long.toString(trans.initialClockValue))){
+							transTimes.get(id).add(Long.toString(trans.initialClockValue));
+						}
+					}
+				}
+			}
+		//	System.out.println(transTimes);
+			 for (String st1:transTimes.keySet()){
+                for (String st2:transTimes.keySet()){
+                    if (st1!=st2 && toCheck.contains(st1 +"--"+st2)){
+                            if (transTimes.get(st1) !=null && transTimes.get(st2)!=null){
+
+    	                        ArrayList<Integer> minTimes = new ArrayList<Integer>();
+								SimulationLatency sl = new SimulationLatency();
+								sl.trans1=st1;
+								sl.trans2=st2;
+                                for(String time1: transTimes.get(st1)){
+                                    //Find the first subsequent transaction
+                                    int time = Integer.MAX_VALUE;
+                                    for (String time2: transTimes.get(st2)){
+                                        int diff = Integer.valueOf(time2) - Integer.valueOf(time1);
+                                        if (diff < time && diff >=0){
+                                            time=diff;
+                                        }
+								//		System.out.println("diff " + diff + " " + transTimes.get(st1) + " " + transTimes.get(st2));
+                                    }
+                                    if (time!=Integer.MAX_VALUE){
+                                        minTimes.add(time);
+                                    }
+                                }
+							//	System.out.println("Min times " + minTimes);
+                                if (minTimes.size()>0){
+                                    int sum=0;
+                                    sl.minTime=Integer.toString(Collections.min(minTimes));
+                                    sl.maxTime=Integer.toString(Collections.max(minTimes));
+                                    for (int time: minTimes){
+                                        sum+=time;
+                                    }
+                                    double average = (double) sum/ (double) minTimes.size();
+                                    double stdev =0.0;
+                                    for (int time:minTimes){
+                                        stdev +=(time - average)*(time-average);
+                                    }
+                                    stdev= stdev/minTimes.size();
+                                    stdev = Math.sqrt(stdev);
+                                    sl.avTime= String.format("%.1f",average);
+                                    sl.stDev = String.format("%.1f",stdev);
+                                }
+								latencies.add(sl);
+
+                            }
+
+                        }
+
+                    }
+                }
+
+			if (latm !=null && latencies.size()>0){
+				latm.setData(latencies);
+     		}
+		}
     }
 
 
@@ -1789,7 +1958,9 @@ public  class JFrameAvatarInteractiveSimulation extends JFrame implements Avatar
         } else if (command.equals(actions[AvatarInteractiveSimulationActions.ACT_ZOOM_OUT].getActionCommand())) {
             zoomOut();
             return;
-
+        } else if (command.equals(actions[AvatarInteractiveSimulationActions.ACT_ADD_LATENCY].getActionCommand())) {
+            addLatency();
+            return;
         } else if (evt.getSource() == displayedTransactionsText) {
             TraceManager.addDev("Entered text:" + displayedTransactionsText.getText());
 
diff --git a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
index 48a86588f80dd42831f6ffc843c558051af105af..613c90e1ac10138d48bf402de02420ddc6cc004e 100755
--- a/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
+++ b/src/main/java/ui/interactivesimulation/JFrameInteractiveSimulation.java
@@ -269,24 +269,7 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
         diagramTable = new Hashtable<String, String>();
 
 
-		tmlSimPanel = new JFrameTMLSimulationPanel(new Frame(), _mgui, "Simulation Transactions");
-		try {
-		pos = new PipedOutputStream();
-		pis = new PipedInputStream(pos, 4096);
-		tmlSimPanel.setFileReference(new BufferedReader(new InputStreamReader(pis)));
-		bw = new BufferedWriter(new OutputStreamWriter(pos));
 
-		//bw.close();
-		//pos.close();
-		}
-		catch (Exception e){
-			System.out.println("failed " + e);
-		}
-		for (TMLTask task : tmap.getTMLModeling().getTasks()){
-			simtraces.add("time=0 block="+ task.getName()+" type=state_entering state=startState");
-			simIndex++;
-		}
-		tmlSimPanel.setVisible(true);
 
         mgui.resetRunningID();
         mgui.resetLoadID();
@@ -967,7 +950,7 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
         addLatencyCheckButton = new JButton(actions[InteractiveSimulationActions.ACT_ADD_LATENCY]);
         latencyPanel.add(addLatencyCheckButton,c0);
 
-        latm = new LatencyTableModel(this);
+        latm = new LatencyTableModel();
         latm.setData(latencies);
         sorterPI = new TableSorter(latm);
         final JTable latTable = new JTable(sorterPI);
@@ -1397,24 +1380,35 @@ public class JFrameInteractiveSimulation extends JFrame implements ActionListene
     }
 	public void writeSimTrace(){
 		try {
-		Collections.sort(simtraces, new Comparator<String>() {
-
-    	@Override
-    	public int compare(String o1, String o2) {
-       		int i = Integer.valueOf((o1.split(" ")[0]).split("=")[1]);
-			int j = Integer.valueOf((o2.split(" ")[0]).split("=")[1]);
-			return i-j;
-    	}
-	});
-
+			tmlSimPanel = new JFrameTMLSimulationPanel(new Frame(), mgui, "Simulation Transactions");
+			pos = new PipedOutputStream();
+			pis = new PipedInputStream(pos, 4096);
+			tmlSimPanel.setFileReference(new BufferedReader(new InputStreamReader(pis)));
+			bw = new BufferedWriter(new OutputStreamWriter(pos));	
+			for (TMLTask task : tmap.getTMLModeling().getTasks()){
+				simtraces.add("time=0 block="+ task.getName()+" type=state_entering state=startState");
+				simIndex++;
+			}
+			//Sort simtraces by end time
+			Collections.sort(simtraces, new Comparator<String>() {
+    			@Override
+    			public int compare(String o1, String o2) {
+       				int i = Integer.valueOf((o1.split(" ")[0]).split("=")[1]);
+					int j = Integer.valueOf((o2.split(" ")[0]).split("=")[1]);
+					return i-j;
+    			}
+			});
 			//System.out.println(simtraces);
 			for (String s: simtraces){
-				bw.write("#0 " +s);
+				bw.write("#"+simIndex+ " "+s);
 				bw.newLine();
 				bw.flush();
+				simIndex++;
 			}
 			bw.close();
 			pos.close();
+			tmlSimPanel.setVisible(true);
+	
 		}
 		catch (Exception e){
 			System.out.println("Could not write sim trace " + e);
diff --git a/src/main/java/ui/interactivesimulation/LatencyTableModel.java b/src/main/java/ui/interactivesimulation/LatencyTableModel.java
index 01c710084b991807e10cbedf5435e70a1b78f5c8..9df771fe36c74a80fb64981fdb190d6fc5b490ba 100755
--- a/src/main/java/ui/interactivesimulation/LatencyTableModel.java
+++ b/src/main/java/ui/interactivesimulation/LatencyTableModel.java
@@ -52,13 +52,13 @@ import java.util.Vector;
    * @author Ludovic APVRILLE
  */
 public class LatencyTableModel extends AbstractTableModel {
-    private JFrameInteractiveSimulation jfis;
+   // private JFrameInteractiveSimulation jfis;
     private int nbOfRows;
     private SimulationLatency data[];
 	
     //private String [] names;
-    public LatencyTableModel(JFrameInteractiveSimulation _jfis) {
-	jfis = jfis;
+    public LatencyTableModel() {
+//	jfis = jfis;
 	SimulationLatency sl = new SimulationLatency();
 	data = new SimulationLatency[]{sl};
 	
diff --git a/src/main/java/ui/interactivesimulation/SimulationLatency.java b/src/main/java/ui/interactivesimulation/SimulationLatency.java
index 109895c32ebb1cdd8873c7539037479542487d56..64f8447b2940d8a19aa6fa2c412a023bac5aa073 100644
--- a/src/main/java/ui/interactivesimulation/SimulationLatency.java
+++ b/src/main/java/ui/interactivesimulation/SimulationLatency.java
@@ -52,10 +52,10 @@ public class SimulationLatency  {
 
     public String trans1;
     public String trans2;
-    public String minTime=""; 
-	public String maxTime="";
-	public String avTime="";
-	public String stDev="";
+    public String minTime="N/A"; 
+	public String maxTime="N/A";
+	public String avTime="N/A";
+	public String stDev="N/A";
 
     public SimulationLatency() {
     }
diff --git a/src/main/java/ui/tmlcp/TMLCPForLoop.java b/src/main/java/ui/tmlcp/TMLCPForLoop.java
index cd7128682cb2d678effac6a4afa6fc34a8659b34..2f25ac9e780e7f13cd951499db4c6b230d19e3fa 100755
--- a/src/main/java/ui/tmlcp/TMLCPForLoop.java
+++ b/src/main/java/ui/tmlcp/TMLCPForLoop.java
@@ -97,8 +97,8 @@ public class TMLCPForLoop extends TGCWithoutInternalComponent implements Embedde
     }
 
     public void internalDrawing(Graphics g) {
-        int w  = g.getFontMetrics().stringWidth(value);
-        int w1 = Math.max(minWidth, w + 2 * textX);
+        final int textWidth  = g.getFontMetrics().stringWidth(value);
+        int w1 = Math.max(minWidth, textWidth + 2 * textX);
         if ((w1 != width) & (!tdp.isScaled())) {
             setCd(x + width/2 - w1/2, y);
             width = w1;
@@ -123,7 +123,7 @@ public class TMLCPForLoop extends TGCWithoutInternalComponent implements Embedde
         g.drawLine(x+(width/2), y+height, x+(width/2), y + lineLength + height);
         g.drawLine(x+width, y+height/2, x+width +lineLength, y+height/2);
 
-        g.drawString(value, x + (width - w) / 2 , y + textY);
+        g.drawString(value, x + (width - textWidth) / 2 , y + textY);
     }
 
     public boolean editOndoubleClick(JFrame frame) {
diff --git a/src/main/java/ui/util/DefaultText.java b/src/main/java/ui/util/DefaultText.java
index fe75dcaa834a4cc9ed1544c522a7d43b7390a83e..81cc0316af56b5ceb9dc135f692c145182e760d2 100755
--- a/src/main/java/ui/util/DefaultText.java
+++ b/src/main/java/ui/util/DefaultText.java
@@ -51,8 +51,8 @@ package ui.util;
  */
 public class DefaultText  {
 
-    public static String BUILD = "12280";
-    public static String DATE = "2017/06/29 12:28:10 CET";
+    public static String BUILD = "12283";
+    public static String DATE = "2017/06/30 02:01:27 CET";
     
     
     public static StringBuffer sbAbout = makeAbout();