From 120674122cef548e767da1176c18b6de317d8cf6 Mon Sep 17 00:00:00 2001
From: Ludovic Apvrille <ludovic.apvrille@telecom-paristech.fr>
Date: Fri, 10 Apr 2009 15:48:36 +0000
Subject: [PATCH] Many bugs resolved!

---
 src/translator/ADChoice.java                  |  19 +-
 src/translator/ActivityDiagram.java           |  30 +
 src/translator/TClass.java                    |  16 +
 src/translator/TURTLEModeling.java            |  11 +
 src/translator/TURTLETranslator.java          |  23 +-
 .../touppaal/RelationTIFUPPAAL.java           |  11 +
 src/translator/touppaal/TURTLE2UPPAAL.java    | 532 ++++++++++--------
 src/ui/CorrespondanceTGElement.java           |  33 +-
 src/ui/DesignPanelTranslator.java             |   3 +-
 src/ui/GTURTLEModeling.java                   |  64 +--
 src/ui/MainGUI.java                           |   8 +
 src/ui/TDiagramPanel.java                     |   7 -
 src/ui/ad/TActivityDiagramToolBar.java        |   5 +
 src/ui/cd/TClassDiagramToolBar.java           |   5 +
 src/ui/dd/TDeploymentDiagramToolBar.java      |   5 +
 .../InteractionOverviewDiagramToolBar.java    |   5 +
 src/ui/ncdd/NCDiagramToolBar.java             |   5 +
 .../osad/TURTLEOSActivityDiagramToolBar.java  |   5 +
 src/ui/oscd/TURTLEOSClassDiagramToolBar.java  |   5 +
 src/ui/procsd/ProactiveCSDToolBar.java        |   6 +
 src/ui/prosmd/ProactiveSMDToolBar.java        |   5 +
 src/ui/sd/SequenceDiagramToolBar.java         |   5 +
 src/ui/tmlad/TMLActivityDiagramToolBar.java   |   5 +
 src/ui/tmlcd/TMLTaskDiagramToolBar.java       |   5 +
 src/ui/tmldd/TMLArchiDiagramToolBar.java      |   3 +
 src/ui/ucd/UseCaseDiagramToolBar.java         |   5 +
 src/ui/window/JDialogUPPAALGeneration.java    |   4 +
 src/ui/window/JDialogUPPAALValidation.java    |   4 +-
 src/uppaaldesc/UPPAALSpec.java                |   4 +-
 src/uppaaldesc/UPPAALTemplate.java            |  28 +-
 30 files changed, 546 insertions(+), 320 deletions(-)

diff --git a/src/translator/ADChoice.java b/src/translator/ADChoice.java
index 435d4f988b..163c46a0e5 100755
--- a/src/translator/ADChoice.java
+++ b/src/translator/ADChoice.java
@@ -183,9 +183,9 @@ public class ADChoice extends ADComponent implements NonBlockingADComponent {
 		ADComponent adc, adc1;
 		String value;
 		
-		if (isElseChoice()) {
+		/*if (isElseChoice()) {
 			return true;
-		}
+		}*/
 		
         
         for(int i=0; i<next.size(); i++) {
@@ -219,6 +219,21 @@ public class ADChoice extends ADComponent implements NonBlockingADComponent {
 			}
         }
         
+        return true;
+    }
+	
+	public boolean isSpecialChoiceAction() {
+		ADComponent adc, adc1;
+		String value;
+		
+        for(int i=0; i<next.size(); i++) {
+            adc = getNext(i);
+            
+            if (!(adc instanceof ADActionStateWithGate)) {
+				return false;
+			}
+        }
+        
         return true;
     }
 	
diff --git a/src/translator/ActivityDiagram.java b/src/translator/ActivityDiagram.java
index c26d1a0fc1..761de66585 100755
--- a/src/translator/ActivityDiagram.java
+++ b/src/translator/ActivityDiagram.java
@@ -645,4 +645,34 @@ public class ActivityDiagram extends Vector{
       }
       return nb;
     }
+	
+	public int getMaximumNbOfGuardsPerChoice() {
+	  int nb = 0;
+      ADComponent adc;
+      for(int i=0; i<size(); i++) {
+        adc = (ADComponent)(elementAt(i));
+        if (adc instanceof ADChoice) {
+          nb = Math.max(nb, ((ADChoice)adc).getNbGuard());
+        }
+      }
+      return nb;
+		
+	}
+	
+	public int getMaximumNbOfGuardsPerSpecialChoice() {
+	  int nb = 0;
+      ADComponent adc;
+	  ADChoice adch;
+      for(int i=0; i<size(); i++) {
+        adc = (ADComponent)(elementAt(i));
+        if (adc instanceof ADChoice) {
+			adch = (ADChoice)adc;
+			if (adch.isSpecialChoice() && (!adch.isSpecialChoiceAction())) {
+				nb = Math.max(nb, ((ADChoice)adc).getNbGuard());
+			}
+        }
+      }
+      return nb;
+		
+	}
 }
diff --git a/src/translator/TClass.java b/src/translator/TClass.java
index 3bde60338a..86cea236e3 100755
--- a/src/translator/TClass.java
+++ b/src/translator/TClass.java
@@ -648,6 +648,22 @@ public class TClass {
       return ad.getNbOfJunctions();
     }
 	
+	public int getMaximumNbOfGuardsPerChoice() {
+		if (ad == null) {
+			return 0;
+		}
+		
+		return ad.getMaximumNbOfGuardsPerChoice();
+	}
+	
+	public int getMaximumNbOfGuardsPerSpecialChoice() {
+		if (ad == null) {
+			return 0;
+		}
+		
+		return ad.getMaximumNbOfGuardsPerSpecialChoice();
+	}
+	
     
     /*public void setIgnoredJava(boolean b) {
         ignoredJava = b;
diff --git a/src/translator/TURTLEModeling.java b/src/translator/TURTLEModeling.java
index 4ed3cb9739..f23d68c433 100755
--- a/src/translator/TURTLEModeling.java
+++ b/src/translator/TURTLEModeling.java
@@ -152,6 +152,17 @@ public class TURTLEModeling {
         }
         return null;
 	}
+	
+	public void addAllTClassesEndingWith(ArrayList<TClass> tclasses, String end) {
+		TClass tmp;
+        for(int i=0; i<tclass.size(); i++) {
+            tmp = (TClass)(tclass.elementAt(i));
+			if (tmp.getName().endsWith(end)) {
+				tclasses.add(tmp);
+				System.out.println("Adding tclass:" + tmp.getName());
+			}
+        }
+	}
     
     public int getIndexOf(TClass t) {
         return tclass.indexOf(t);
diff --git a/src/translator/TURTLETranslator.java b/src/translator/TURTLETranslator.java
index eb904023fb..146943cec8 100755
--- a/src/translator/TURTLETranslator.java
+++ b/src/translator/TURTLETranslator.java
@@ -1280,9 +1280,9 @@ public class TURTLETranslator {
 				// End added May 2008
 			}
 			/*if (p.getName().indexOf("67") > -1)
-                System.out.println(p.getName() + " -> " + s);
+			System.out.println(p.getName() + " -> " + s);
             if (s == null) {
-               System.out.println("*** NULL S (PROCESS) ***");
+				System.out.println("*** NULL S (PROCESS) ***");
             }
             if (s.startsWith("null")) {
                 System.out.println("*** NULL S1 (PROCESS) ***");
@@ -1298,7 +1298,7 @@ public class TURTLETranslator {
 				params.add(ad.getParam());
 				actions.add(modifyAction(ad.getActionValue(), languageID));
 				return translateADActionStateWithParam((ADActionStateWithParam)(ad.getNext(0)));
-			// end added May 2008
+				// end added May 2008
 			} else {
 				System.out.println("*** NULL PROCESS ***");
 				return "";
@@ -1530,9 +1530,24 @@ public class TURTLETranslator {
 					adsnext = (ADActionStateWithParam)(adc.getNext(0));
 					par = ads.getParam();
 					if (adsnext.getParam() != par) {
-						// One must verify that the second does not use the Param declared in the first one
+						// One must verify that the second does not use the Param declared in the first one!
+						//System.out.println("Param " + par.getName()+  " in use in " + adsnext.getActionValue() + "?");
 						if (!paramIsUsedIn(par, adsnext.getActionValue())) {
 								makeProcess = false;
+								//System.out.println("no");
+						} else {
+							//System.out.println("yes");
+						}
+						
+						// Must check also in the next ones of the next.
+						if (makeProcess == false) {
+							while(adsnext.getNext(0) instanceof ADActionStateWithParam) {
+								adsnext = (ADActionStateWithParam)(adsnext.getNext(0));
+								//System.out.println("Param " + par.getName()+  " in use in " + adsnext.getActionValue() + "?");
+								if (paramIsUsedIn(par, adsnext.getActionValue())) {
+									makeProcess = true;
+								}
+							}
 						}
 					}
 				}
diff --git a/src/translator/touppaal/RelationTIFUPPAAL.java b/src/translator/touppaal/RelationTIFUPPAAL.java
index 80a67b10f8..de7bcac207 100755
--- a/src/translator/touppaal/RelationTIFUPPAAL.java
+++ b/src/translator/touppaal/RelationTIFUPPAAL.java
@@ -109,8 +109,19 @@ public class RelationTIFUPPAAL {
 	}
 	
 	public String getRQuery(TClass _t, ADComponent _adc) {
+		//System.out.println("get RQuery for " + _t.getName());
+		
 		ADComponentLocation adcl = getFirstADComponentLocation(_adc);
 		TClassTemplate tt = getFirstTClassTemplate(_t);
+		
+		if (tt == null) {
+			System.out.println("null tt");
+		}
+		
+		if (adcl == null) {
+			System.out.println("null adc1");
+		}
+		
 		if ((tt == null) || (adcl == null)) {
 			return null;
 		}
diff --git a/src/translator/touppaal/TURTLE2UPPAAL.java b/src/translator/touppaal/TURTLE2UPPAAL.java
index 19fbe38e7c..d8437a408d 100755
--- a/src/translator/touppaal/TURTLE2UPPAAL.java
+++ b/src/translator/touppaal/TURTLE2UPPAAL.java
@@ -190,7 +190,9 @@ public class TURTLE2UPPAAL {
         //makeParallel(nb);
         makeSystem(effectiveNb);
 		
+		System.out.println("Enhancing graphical representation ...");
 		spec.enhanceGraphics();
+		System.out.println("Enhancing graphical representation done");
 		
 		//System.out.println("relations:" + table.toString());
 		
@@ -218,7 +220,7 @@ public class TURTLE2UPPAAL {
 			spec.addGlobalDeclaration("int groups__[maxGroups__];\n");
 			spec.addGlobalDeclaration("urgent broadcast chan endGroup__;\n");
 			spec.addGlobalDeclaration("urgent broadcast chan goAllTasks__;\n");
-		
+			
 			// Has to manage
 			s = "\nint hasToManage(int tab[maxTasks__]) {\nint i;\nfor(i=0; i<maxTasks__; i++) {\n";
 			s += "if (tab[i] != -1) {\nreturn 1;\n}\n}\nreturn 0;\n}\n\n";
@@ -242,13 +244,13 @@ public class TURTLE2UPPAAL {
 			
 			// End task
 			s = "int endTask(int id) {\nint i, j;\nint taskid;\nint ids[maxTasks__];\nint tmpids[maxTasks__];\n";
-			s += "int cpt = 0;\nint currentid;\n\nif (tasks__[id][id] == -3) {\n// I have been preempted\n";
+				s += "int cpt = 0;\nint currentid;\n\nif (tasks__[id][id] == -3) {\n// I have been preempted\n";
 			s += "tasks__[id][id] = 0;\nreturn -1;\n} else {\n// Normal termination\npreempt(id);\n}\n";
 			s += "\nfor(i=0; i<maxTasks__; i++) {\nids[i] = -1;\n}\n";
 			s += "ids[0] = id;\n\nwhile(hasToManage(ids) == 1) {\ncpt = 0;\nfor(i=0; i<maxTasks__; i++) {\n";
-			s += "tmpids[i] = ids[i];\nids[i] = -1;\n}\nfor(j=0; j<maxTasks__; j++) {\nif (tmpids[j] != -1) {\n";
-			s += "taskid = (tmpids[j] / totalTasks__)*totalTasks__;\ncurrentid = tmpids[j];\ntasks__[currentid][currentid] = 0;\n";
-			s += "for(i=taskid; i<(taskid + totalTasks__); i++) {\nif ((i != id) && (tasks__[i][currentid] == preempt__)) {\ntasks__[i][currentid] = 0;\n";
+				s += "tmpids[i] = ids[i];\nids[i] = -1;\n}\nfor(j=0; j<maxTasks__; j++) {\nif (tmpids[j] != -1) {\n";
+					s += "taskid = (tmpids[j] / totalTasks__)*totalTasks__;\ncurrentid = tmpids[j];\ntasks__[currentid][currentid] = 0;\n";
+					s += "for(i=taskid; i<(taskid + totalTasks__); i++) {\nif ((i != id) && (tasks__[i][currentid] == preempt__)) {\ntasks__[i][currentid] = 0;\n";
 			s += "ids[cpt] = i;\ncpt ++;\n}\n}\n}\n}\n}\nreturn -1;\n}\n\n";
 			spec.addGlobalDeclaration(Conversion.indentString(s, 2));
 			
@@ -507,7 +509,7 @@ public class TURTLE2UPPAAL {
 	public UPPAALTemplate newTClassTemplate(TClass t, int id) {
 		UPPAALTemplate template = new UPPAALTemplate();
 		if (id != 0) {
-			template.setName(t.getName() + "__" + id);
+			template.setName(t.getName() + "___" + id);
 		} else {
 			template.setName(t.getName());
 		}
@@ -520,7 +522,9 @@ public class TURTLE2UPPAAL {
     public void makeAttributes(TClass t, UPPAALTemplate template) {
 		Param p;
 		Vector params = t.getParamList();
-		for(int i=0; i<params.size(); i++) {
+		int i;
+		
+		for(i=0; i<params.size(); i++) {
 			p = (Param)(params.get(i));
 			if (p.getType() == Param.NAT) {
 				template.addDeclaration("int ");
@@ -536,6 +540,12 @@ public class TURTLE2UPPAAL {
 		for(Gate g:gatesWithInternalSynchro) {
 			template.addDeclaration("int " + t.getName() + "__" + g.getName() + TURTLE2UPPAAL.SYNCID + " = 0;\n");
 		}
+		
+		int nbOfChoice = t.getMaximumNbOfGuardsPerSpecialChoice();
+		for(i=0; i<nbOfChoice; i++) {
+			template.addDeclaration("int choice__" + i + ";\n");
+		}
+		
     }
     
     public void makeAttributeChoice(TClass t, int id1, int id2) {
@@ -768,7 +778,7 @@ public class TURTLE2UPPAAL {
 					buildAssignment(tr, action);
 					
 					table.addADComponentLocation(elt, previous, loc);
-				
+					
 					makeElementBehavior(t, template, elt.getNext(0), loc, end, null);
 					
 				} else {
@@ -835,7 +845,7 @@ public class TURTLE2UPPAAL {
 				//setSynchronization(tr2, "timeLimitedOfferExpired!");
 				//addNotSync("timeLimitedOfferExpired");
 				
-
+				
 				
 				makeElementBehavior(t, template, elt.getNext(1), loc2, end, null);
 				currentX -= STEP_LOOP_X;
@@ -943,15 +953,17 @@ public class TURTLE2UPPAAL {
 			
 			// Choice
 		} else if (elt instanceof ADChoice) {
-			System.out.println("ADChoice");
+			//System.out.println("ADChoice");
 			adch = (ADChoice)elt;
 			
 			if (adch.getNbGuard() == 1) {
 				if (adch.isGuarded(0)){
 					
-					loc = makeTimeInterval(template, previous, "0", ((ADLatency)(elt)).getValue());
+					//loc = makeTimeInterval(template, previous, "0", ((ADLatency)(elt)).getValue());
 					//table.addADComponentLocation(elt, previous, loc);
-					previous = loc;
+					//previous = loc;
+					
+					previous.setUrgent();
 					
 					loc = addLocation(template);
 					loc.setUrgent();
@@ -967,44 +979,14 @@ public class TURTLE2UPPAAL {
 					makeElementBehavior(t, template, elt.getNext(0), previous, end, null);
 				}
 			} else {
-				//System.out.println("ADChoice: testing");
-				if (choicesDeterministic) {
-					//System.out.println("Choice is deterministic");
-					int tmpX = currentX;
-					for(i=0; i<elt.getNbNext(); i++){
-						//System.out.println("Choice is deterministic i=" + i);
-						String gua = null;
-						if (adch.isGuarded(i)) {
-							gua = convertGuard(adch.getGuard(i));
-						}
-						
-						if (gua == null) {
-							gua = "";
-						}
-						
-						gua = gua.trim();
-						
-						if (gua.length() == 0) {
-							System.out.println("New choice system");
-							table.addADComponentLocation(elt, previous, previous);
-							makeElementBehavior(t, template, elt.getNext(i), previous, end, null);
-							currentX += 2 * STEP_LOOP_X;
-						} else {
-						
-							loc = addLocation(template);
-							tr = addTransition(template, previous, loc);
-							setGuard(tr, gua);
+				if (adch.isSpecialChoiceDelay()) {
+					
+					// Must check whether some actions are delayed or not
+					if (adch.isSpecialChoiceAction()) {
 						
-							table.addADComponentLocation(elt, previous, loc);
-							
-							makeElementBehavior(t, template, elt.getNext(i), loc, end, null);
-							currentX += 2 * STEP_LOOP_X;
-						}
-					}
-				} else {
-					/*if (adch.choiceFollowedWithADActionStateWithGates()) {
-						int tmpX = currentX;
 						for(i=0; i<elt.getNbNext(); i++){
+							//System.out.println("Special choice action / Task " + t.getName() + ": Choice is deterministic i=" + i + " with guard =" + adch.getGuard(i));
+						
 							String gua = null;
 							if (adch.isGuarded(i)) {
 								gua = convertGuard(adch.getGuard(i));
@@ -1012,187 +994,239 @@ public class TURTLE2UPPAAL {
 							table.addADComponentLocation(elt, previous, previous);
 							makeElementBehavior(t, template, elt.getNext(i), previous, end, gua);
 							currentX += 2 * STEP_LOOP_X;
-						}*/
-					if (adch.isSpecialChoiceDelay()) {
+						}
+					} else {
+						//System.out.println("Special choice delay");
+						
 						int tmpX = currentX;
+						int next = 0;
+						ADComponent elt1;
+						boolean delayed;
+						String gua = null;
+						
+						// Initialization
+						String init = "h__ = 0";
 						for(i=0; i<elt.getNbNext(); i++){
-							String gua = null;
-							String guadelay = null;
-							if (adch.isGuarded(i)) {
-								gua = convertGuard(adch.getGuard(i));
-							}
+							//System.out.println("Special choice delay / Task " + t.getName() + ": Choice is deterministic i=" + i + " with guard =" + adch.getGuard(i));
+						
+							elt1 = elt.getNext(i);
 							
-							if (elt.getNext(i) instanceof ADDelay) {
-								guadelay = ((ADDelay)(elt.getNext(i))).getValue();
-								guadelay = 	"(h__ >= (" + guadelay + "))";
+							if (elt1 instanceof ADDelay) {
+								init = init + ", choice__" + i + " = max(0, " + ((ADDelay)(elt1)).getValue() + ")";
 							}
 							
-							if (elt.getNext(i) instanceof ADLatency) {
-								guadelay = ((ADLatency)(elt.getNext(i))).getValue();
-								guadelay = 	"(h__ >= (" + guadelay + "))";
+							if (elt1 instanceof ADLatency) {
+								init = init + ", choice__" + i + " = 0"; 
 							}
 							
-							if (elt.getNext(i) instanceof ADTimeInterval) {
-								guadelay = ((ADTimeInterval)(elt.getNext(i))).getMinValue();
-								guadelay = 	"(h__ >= (" + guadelay + "))";
+							if (elt1 instanceof ADTimeInterval) {
+								init = init + ", choice__" + i + " = max(0, " + ((ADTimeInterval)(elt1)).getMinValue() + ")";
 							}
-							
-							if (gua == null) {
-								gua = guadelay;
-							} else {
-								if (guadelay != null) {
-									gua = "((" + gua + " && " + guadelay + ")";
-								}
+						}							
+						loc = addRLocation(template);
+						previous.setCommitted();
+						tr = addRTransition(template, previous, loc);
+						setAssignment(tr, init);
+						
+						
+						// Setting randomnly the value of non-deterministic time
+						for(i=0; i<elt.getNbNext(); i++){
+							elt1 = elt.getNext(i);
+							if (elt1 instanceof ADLatency) {
+								tr = addRTransition(template, loc, loc);
+								setGuard(tr, "choice__" + i + " <" + ((ADLatency)(elt1)).getValue());
+								setAssignment(tr, "choice__" + i + " = choice__" + i + " + 1");
 							}
 							
-							table.addADComponentLocation(elt, previous, previous);
-							
-							makeElementBehavior(t, template, elt.getNext(i), previous, end, gua);
-							currentX += 2 * STEP_LOOP_X;
+							if (elt1 instanceof ADTimeInterval) {
+								tr = addRTransition(template, loc, loc);
+								setGuard(tr, "choice__" + i + " <" + ((ADTimeInterval)(elt1)).getMaxValue());
+								setAssignment(tr, "choice__" + i + " = choice__" + i + " + 1");
+							}
 						}
-					} /*else if (adch.isElseChoice()) {
-						System.out.println("Else choice detected");
-						int tmpX = currentX;
-						previous.setUrgent();
+						
+						loc1 = addRLocation(template);
+						loc.setCommitted();
+						tr = addRTransition(template, loc, loc1);
+						
+						table.addADComponentLocation(elt, previous, loc1);
+						
 						for(i=0; i<elt.getNbNext(); i++){
-							loc = addLocation(template);
-							tr = addTransition(template, previous, loc);
-							action = convertGuard(adch.getGuard(i));
-							setGuard(tr, action);
+							delayed = false;
+							elt1 = elt.getNext(i);
 							
-							table.addADComponentLocation(elt, previous, loc);
+							gua = null;
+							// An action follows the guard #i
+							if (adch.isGuarded(i)) {
+								gua = convertGuard(adch.getGuard(i));
+							}
 							
-							makeElementBehavior(t, template, elt.getNext(i), loc, end, null);
-							currentX += 2 * STEP_LOOP_X;
+							if ((elt1 instanceof ADDelay) || (elt1 instanceof ADLatency) || (elt1 instanceof ADTimeInterval)){
+								delayed = true;
+							}
+							
+							if (!delayed) {
+								makeElementBehavior(t, template, elt.getNext(i), loc1, end, gua);
+								currentX += 2 * STEP_LOOP_X;
+							} else {
+								String guadelay = "(choice__" + i + " >0) && ( h__>= choice__" + i + ")";
+								if (gua != null) {
+									guadelay = "(" + gua + ") && (" + guadelay + ")";
+								}
+								tr = addRTransition(template, loc1, loc1);
+								setGuard(tr, guadelay);
+								setAssignment(tr, "choice__" + i + " = 0");
+								
+								guadelay = "choice__" + i + " == 0";
+								if (gua == null) {
+									gua = guadelay;
+								} else {
+									gua = "(" + gua + ") && (" + guadelay + ")";
+								}
+								makeElementBehavior(t, template, elt1.getNext(0), loc1, end, gua);
+								currentX += 2 * STEP_LOOP_X;
+							}
+						}
+					}
+					//System.out.println("ADChoice: testing");
+				} else if ((choicesDeterministic) || (adch.isElseChoice())) {
+					//System.out.println("Choice is deterministic");
+					int tmpX = currentX;
+					previous.setCommitted();
+					for(i=0; i<elt.getNbNext(); i++){
+						//System.out.println("Task " + t.getName() + ": Choice is deterministic i=" + i + " with guard =" + adch.getGuard(i));
+						String gua = null;
+						if (adch.isGuarded(i)) {
+							gua = convertGuard(adch.getGuard(i));
 						}
 						
-					}*/ else {
-						System.out.println("Irregular choice");
-						setMultiProcess(template);
-						addParallel(t, template);
-						
-						//start other tasks
-						loc = previous;
+						if (gua == null) {
+							gua = "";
+						}
 						
-						loc.setUrgent();
-						loc3 = addLocation(template);
-						loc3.setCommitted();
-						tr1 = addRTransition(template, loc, loc3);
-						setSynchronization(tr1, "lockmutextask__!");
-						//addAssignment(tr1, "gotasks__ = 0, \nstartingid__ = myid__,\npreemptid__ = myid__,\ngroupid__= firstGroupId(),\n waitgroupid__ = groupid__");
-						addAssignment(tr1, "gotasks__ = 0, \nstartingid__ = myid__,\npreemptid__ = myid__,\ngroupid__= mygroupid__");
-						loc = loc3;
+						gua = gua.trim();
 						
-						//System.out.println("Managing preempt");
-						index = currentX;
-						for(i=1; i<elt.getNbNext(); i++){
-							loc2 = makePreemptFromInit(t, template);
-							loc1 = addLocation(template);
-							loc1.setUrgent();
-							tr1 = addTransition(template, loc, loc1);
-							if (i!=0) {
-								setAssignment(tr1, "locid__ = " + loc2.int_id + ",\ntaskid__ = firstFree(myid__),\nmygroupid__ = groupid__");
+						if (gua.length() == 0) {
+							//System.out.println("New choice system");
+							if (elt.getNext(i) instanceof ADChoice) {
+								makeElementBehavior(t, template, elt.getNext(i), previous, end, null);
 							} else {
-								setAssignment(tr1, "locid__ = " + loc2.int_id + ",\ntaskid__ = firstFree(myid__)");
-							}
-							loc3 = addLocation(template);
-							loc3.setCommitted();
-							tr1 = addTransition(template, loc1, loc3);
-							setSynchronization(tr1, "begintask__!");
-							setAssignment(tr1, makeSetParam(t));
-							loc = loc3;
-							currentX += 2 * STEP_LOOP_X;
-							// Manage guard if applicable
-							//System.out.println("Guard #" + i);
-							if (adch.isGuarded(i)) {
-								loc4 = addRLocation(template);
-								tr1 = addTransition(template, loc2, loc4);
-								action = convertGuard(adch.getGuard(i));
-								//System.out.println("action=" + action);
-								setGuard(tr1, action);
-								loc2.setUrgent();
-								//System.out.println("guard set");
-								loc5 = addRLocation(template);
-								tr1 = addTransition(template, loc2, loc5);
-								action = convertGuard("!(" + adch.getGuard(i) + ")");
-								setGuard(tr1, action);
+								loc = addLocation(template);
+								tr = addTransition(template, previous, loc);
 								
-								
-								loc2 = loc4;
+								table.addADComponentLocation(elt, previous, previous);
+								makeElementBehavior(t, template, elt.getNext(i), loc, end, null);
+								currentX += 2 * STEP_LOOP_X;
 							}
+						} else {
+							
+							loc = addLocation(template);
+							tr = addTransition(template, previous, loc);
+							setGuard(tr, gua);
 							
-							table.addADComponentLocation(elt, previous, loc2);
+							table.addADComponentLocation(elt, previous, loc);
 							
-							makeElementBehavior(t, template, elt.getNext(i), loc2, end, null);
+							makeElementBehavior(t, template, elt.getNext(i), loc, end, null);
+							currentX += 2 * STEP_LOOP_X;
+						}
+					}
+				} else {
+					
+					System.out.println("Irregular choice");
+					setMultiProcess(template);
+					addParallel(t, template);
+					
+					//start other tasks
+					loc = previous;
+					
+					loc.setUrgent();
+					loc3 = addLocation(template);
+					loc3.setCommitted();
+					tr1 = addRTransition(template, loc, loc3);
+					setSynchronization(tr1, "lockmutextask__!");
+					//addAssignment(tr1, "gotasks__ = 0, \nstartingid__ = myid__,\npreemptid__ = myid__,\ngroupid__= firstGroupId(),\n waitgroupid__ = groupid__");
+					addAssignment(tr1, "gotasks__ = 0, \nstartingid__ = myid__,\npreemptid__ = myid__,\ngroupid__= mygroupid__");
+					loc = loc3;
+					
+					//System.out.println("Managing preempt");
+					index = currentX;
+					for(i=1; i<elt.getNbNext(); i++){
+						loc2 = makePreemptFromInit(t, template);
+						loc1 = addLocation(template);
+						loc1.setUrgent();
+						tr1 = addTransition(template, loc, loc1);
+						if (i!=0) {
+							setAssignment(tr1, "locid__ = " + loc2.int_id + ",\ntaskid__ = firstFree(myid__),\nmygroupid__ = groupid__");
+						} else {
+							setAssignment(tr1, "locid__ = " + loc2.int_id + ",\ntaskid__ = firstFree(myid__)");
 						}
-						
-						/*loc3 = addLocation(template);
-						tr1 = addTransition(template, loc, loc3);
-						setAssignment(tr1, "gotasks__ = " + (elt.getNbNext() - 1));
-						loc2 = addLocation(template);
-						tr1 = addTransition(template, loc3, loc2);
-						setSynchronization(tr1, "unlockmutextask__!");
-						setGuard(tr1, "gotasks__ == 0");
-						//setAssignment(tr1, "makeParallel(myid__, startingid__)");
-						
 						loc3 = addLocation(template);
-						tr1 = addTransition(template, loc2, loc3);
-						setSynchronization(tr1, "endGroup__[waitgroupid__]?");
-						
-						makeEnd(template, loc3);*/
-						
-						loc3 = addRLocation(template);
-						//loc3.setUrgent();
 						loc3.setCommitted();
-						tr1 = addTransition(template, loc, loc3);
-						//setAssignment(tr1, "gotasks__ = " + (elt.getNbNext() - 1));
-						setSynchronization(tr1, "goAllTasks__!");
-						
-						loc2 = addRLocation(template);
-						tr1 = addTransition(template, loc3, loc2);
-						setSynchronization(tr1, "unlockmutextask__!");
-						setGuard(tr1, "gotasks__ == 0");
-						setAssignment(tr1, "makeParallel(myid__, startingid__),\nmakePreempt(myid__, preemptid__, startingid__)");
-						
-						if (adch.isGuarded(0)) {
+						tr1 = addTransition(template, loc1, loc3);
+						setSynchronization(tr1, "begintask__!");
+						setAssignment(tr1, makeSetParam(t));
+						loc = loc3;
+						currentX += 2 * STEP_LOOP_X;
+						// Manage guard if applicable
+						//System.out.println("Guard #" + i);
+						if (adch.isGuarded(i)) {
 							loc4 = addRLocation(template);
 							tr1 = addTransition(template, loc2, loc4);
-							loc2.setUrgent();
-							action = convertGuard(adch.getGuard(0));
+							action = convertGuard(adch.getGuard(i));
+							//System.out.println("action=" + action);
 							setGuard(tr1, action);
-							
+							loc2.setUrgent();
+							//System.out.println("guard set");
 							loc5 = addRLocation(template);
 							tr1 = addTransition(template, loc2, loc5);
-							action = convertGuard("!(" + adch.getGuard(0) + ")");
+							action = convertGuard("!(" + adch.getGuard(i) + ")");
 							setGuard(tr1, action);
+							
+							
 							loc2 = loc4;
 						}
 						
-						loc = loc2;
-						currentX += 2 * STEP_LOOP_X;
+						table.addADComponentLocation(elt, previous, loc2);
 						
-						table.addADComponentLocation(elt, previous, loc);
+						makeElementBehavior(t, template, elt.getNext(i), loc2, end, null);
+					}
+					
+					loc3 = addRLocation(template);
+					//loc3.setUrgent();
+					loc3.setCommitted();
+					tr1 = addTransition(template, loc, loc3);
+					//setAssignment(tr1, "gotasks__ = " + (elt.getNbNext() - 1));
+					setSynchronization(tr1, "goAllTasks__!");
+					
+					loc2 = addRLocation(template);
+					tr1 = addTransition(template, loc3, loc2);
+					setSynchronization(tr1, "unlockmutextask__!");
+					setGuard(tr1, "gotasks__ == 0");
+					setAssignment(tr1, "makeParallel(myid__, startingid__),\nmakePreempt(myid__, preemptid__, startingid__)");
+					
+					if (adch.isGuarded(0)) {
+						loc4 = addRLocation(template);
+						tr1 = addTransition(template, loc2, loc4);
+						loc2.setUrgent();
+						action = convertGuard(adch.getGuard(0));
+						setGuard(tr1, action);
 						
-						makeElementBehavior(t, template, elt.getNext(0), loc, end, null);
-						currentX = index;
+						loc5 = addRLocation(template);
+						tr1 = addTransition(template, loc2, loc5);
+						action = convertGuard("!(" + adch.getGuard(0) + ")");
+						setGuard(tr1, action);
+						loc2 = loc4;
 					}
+					
+					loc = loc2;
+					currentX += 2 * STEP_LOOP_X;
+					
+					table.addADComponentLocation(elt, previous, loc);
+					
+					makeElementBehavior(t, template, elt.getNext(0), loc, end, null);
+					currentX = index;
 				}
 			}
-			return;
-			// Start activities in parallel -> all of them may preempt the others
-			
-			
-			
-			// Quite complex -> use other functions to continue
-			/*if (adch.isSpecialChoice()) {
-				makeSpecialChoice(t, template, elt, previous, end, adch);
-				System.out.println("Special choice encountered");
-				return;
-			} else {
-				// Choice is considered as a "regular" choice and not a LOTOS choice
-				System.out.println("Warning: elt = " + elt + " is not a special choice");
-				makeChoice(t, template, elt, previous, end, adch);
-			}*/
 			
 			// Sequence
 		} else if (elt instanceof ADSequence) {
@@ -1378,7 +1412,7 @@ public class TURTLE2UPPAAL {
 			}
 			return;
 			
-        } else if (elt instanceof ADPreempt) {
+		} else if (elt instanceof ADPreempt) {
 			if (elt.getNbNext() == 0) {
 				table.addADComponentLocation(elt, previous, previous);
 				makeElementBehavior(t, template, elt.getNext(0), previous, end, null);
@@ -1486,7 +1520,7 @@ public class TURTLE2UPPAAL {
 		UPPAALLocation loc, loc1;
 		UPPAALTransition tr, tr1;
 		loc1 = addRLocation(template);
-		previous.setUrgent();
+		previous.setCommitted();
 		tr1 = addRTransition(template, previous, loc1);
 		setAssignment(tr1, "h__ = 0");
 		loc = addRLocation(template);
@@ -1599,7 +1633,7 @@ public class TURTLE2UPPAAL {
 		return loc2;
 	}
 	
-    // Assumes adch is a not special choice
+	// Assumes adch is a not special choice
 	public void makeChoice(TClass t, UPPAALTemplate template, ADComponent elt, UPPAALLocation previous, UPPAALLocation end, ADChoice adch) {
 		int nbG = adch.getNbGuard();
 		UPPAALLocation loc1, loc2;
@@ -2075,8 +2109,8 @@ public class TURTLE2UPPAAL {
 		}
 		
 	}
-    
-    public UPPAALLocation addLocation(UPPAALTemplate template) {
+	
+	public UPPAALLocation addLocation(UPPAALTemplate template) {
 		UPPAALLocation loc = new UPPAALLocation();
 		loc.idPoint.x = currentX;
 		loc.idPoint.y = currentY;
@@ -2086,9 +2120,9 @@ public class TURTLE2UPPAAL {
 		currentX += STEP_X;
 		currentY += STEP_Y;
 		return loc;
-    }
-    
-    public UPPAALLocation addRLocation(UPPAALTemplate template) {
+	}
+	
+	public UPPAALLocation addRLocation(UPPAALTemplate template) {
 		UPPAALLocation loc = new UPPAALLocation();
 		loc.idPoint.x = currentX;
 		loc.idPoint.y = currentY;
@@ -2104,7 +2138,7 @@ public class TURTLE2UPPAAL {
 		}
 		
 		return loc;
-    }
+	}
 	
 	public UPPAALLocation addRUnlockLocation(UPPAALTemplate template) {
 		UPPAALLocation loc = new UPPAALLocation();
@@ -2123,9 +2157,9 @@ public class TURTLE2UPPAAL {
 		}
 		
 		return loc;
-    }
-    
-    public UPPAALLocation addRUnlockTaskLocation(UPPAALTemplate template) {
+	}
+	
+	public UPPAALLocation addRUnlockTaskLocation(UPPAALTemplate template) {
 		UPPAALLocation loc = new UPPAALLocation();
 		loc.idPoint.x = currentX;
 		loc.idPoint.y = currentY;
@@ -2142,7 +2176,7 @@ public class TURTLE2UPPAAL {
 		}
 		
 		return loc;
-    }
+	}
 	
 	public void addRandomNailPoint(UPPAALTransition tr) {
 		int x = 0, y = 0;
@@ -2152,8 +2186,8 @@ public class TURTLE2UPPAAL {
 			tr.points.add(new Point(x, y));
 		}
 	}
-    
-    public UPPAALTransition addTransition(UPPAALTemplate template, UPPAALLocation loc1, UPPAALLocation loc2) {
+	
+	public UPPAALTransition addTransition(UPPAALTemplate template, UPPAALLocation loc1, UPPAALLocation loc2) {
 		UPPAALTransition tr = new UPPAALTransition();
 		tr.sourceLoc = loc1;
 		tr.destinationLoc = loc2;
@@ -2168,17 +2202,17 @@ public class TURTLE2UPPAAL {
 			tr.points.add(new Point(x, y));
 		}*/
 		return tr;
-    }
+	}
 	
-    public UPPAALTransition addEndTransition(UPPAALTemplate template, UPPAALLocation loc1) {
+	public UPPAALTransition addEndTransition(UPPAALTemplate template, UPPAALLocation loc1) {
 		UPPAALTransition tr = addTransition(template, loc1, template.getInitLocation());
 		//template.addTransition(tr);
 		setEndAssignment(tr);
 		addRandomNailPoint(tr);
 		return tr;
-    }
-    
-    public UPPAALTransition addRTransition(UPPAALTemplate template, UPPAALLocation loc1, UPPAALLocation loc2) {
+	}
+	
+	public UPPAALTransition addRTransition(UPPAALTemplate template, UPPAALLocation loc1, UPPAALLocation loc2) {
 		UPPAALTransition tr = new UPPAALTransition();
 		tr.sourceLoc = loc1;
 		tr.destinationLoc = loc2;
@@ -2191,24 +2225,24 @@ public class TURTLE2UPPAAL {
 		addRandomNailPoint(tr);
 		// Nails?
 		return tr;
-    }
-    
-    public UPPAALTransition addActionTransition(UPPAALTemplate template, UPPAALLocation loc1, UPPAALLocation loc2) {
+	}
+	
+	public UPPAALTransition addActionTransition(UPPAALTemplate template, UPPAALLocation loc1, UPPAALLocation loc2) {
 		UPPAALTransition tr = addRTransition(template, loc1, loc2);
 		if (!isRegularTClass) {
 			addAssignment(tr, "preempt(myid__),\nh__ = 0");
 		}
 		addRandomNailPoint(tr);
 		return tr;
-    }
-    
-    public void setSynchronization(UPPAALTransition tr, String s) {
+	}
+	
+	public void setSynchronization(UPPAALTransition tr, String s) {
 		tr.synchronization = modifyString(s);
 		tr.synchronizationPoint.x = (tr.sourceLoc.idPoint.x + tr.destinationLoc.idPoint.x)/2 + SYNCHRO_X;
 		tr.synchronizationPoint.y = (tr.sourceLoc.idPoint.y + tr.destinationLoc.idPoint.y)/2 + SYNCHRO_Y;
-    }
-    
-    public void addGuard(UPPAALTransition tr, String s) {
+	}
+	
+	public void addGuard(UPPAALTransition tr, String s) {
 		if ((tr.guard == null) || (tr.guard.length() < 2)){
 			tr.guard = modifyString(s);
 		} else {
@@ -2216,25 +2250,25 @@ public class TURTLE2UPPAAL {
 		}
 		tr.guardPoint.x = (tr.sourceLoc.idPoint.x + tr.destinationLoc.idPoint.x)/2 + GUARD_X;
 		tr.guardPoint.y = (tr.sourceLoc.idPoint.y + tr.destinationLoc.idPoint.y)/2 + GUARD_Y;
-    }
-    
-    public void setInvariant(UPPAALLocation loc, String s) {
-	    loc.setInvariant(modifyString(s));
-    }
-    
-    public void setGuard(UPPAALTransition tr, String s) {
+	}
+	
+	public void setInvariant(UPPAALLocation loc, String s) {
+		loc.setInvariant(modifyString(s));
+	}
+	
+	public void setGuard(UPPAALTransition tr, String s) {
 		tr.guard = modifyString(s);
 		tr.guardPoint.x = (tr.sourceLoc.idPoint.x + tr.destinationLoc.idPoint.x)/2 + GUARD_X;
 		tr.guardPoint.y = (tr.sourceLoc.idPoint.y + tr.destinationLoc.idPoint.y)/2 + GUARD_Y;
-    }
-    
-    public void setAssignment(UPPAALTransition tr, String s) {
+	}
+	
+	public void setAssignment(UPPAALTransition tr, String s) {
 		tr.assignment = modifyString(s);
 		tr.assignmentPoint.x = (tr.sourceLoc.idPoint.x + tr.destinationLoc.idPoint.x)/2 + ASSIGN_X;
 		tr.assignmentPoint.y = (tr.sourceLoc.idPoint.y + tr.destinationLoc.idPoint.y)/2 + ASSIGN_Y;
-    }
-    
-    public void addAssignment(UPPAALTransition tr, String s) {
+	}
+	
+	public void addAssignment(UPPAALTransition tr, String s) {
 		if (s.length() <1) {
 			return;
 		}
@@ -2246,17 +2280,17 @@ public class TURTLE2UPPAAL {
 		
 		tr.assignmentPoint.x = (tr.sourceLoc.idPoint.x + tr.destinationLoc.idPoint.x)/2 + ASSIGN_X;
 		tr.assignmentPoint.y = (tr.sourceLoc.idPoint.y + tr.destinationLoc.idPoint.y)/2 + ASSIGN_Y;
-    }
-    
-    public void setEndAssignment(UPPAALTransition tr) {
+	}
+	
+	public void setEndAssignment(UPPAALTransition tr) {
 		if (!isRegularTClass) {
 			tr.assignment = "endTask(myid__)";
 		}
 		tr.assignmentPoint.x = (tr.sourceLoc.idPoint.x + tr.destinationLoc.idPoint.x)/2 + ASSIGN_X;
 		tr.assignmentPoint.y = (tr.sourceLoc.idPoint.y + tr.destinationLoc.idPoint.y)/2 + ASSIGN_Y;
-    }
-    
-    public void makeSystem(int nb) {
+	}
+	
+	public void makeSystem(int nb) {
 		ListIterator iterator = spec.getTemplates().listIterator();
 		UPPAALTemplate template;
 		String system = "system ";
@@ -2308,7 +2342,7 @@ public class TURTLE2UPPAAL {
 		}
 		
 		spec.addInstanciation(dec+system);
-    }
+	}
 	
 	public void setMultiProcess(UPPAALTemplate t) {
 		System.out.println("Setting multiprocess: " + t.getName());
@@ -2317,24 +2351,24 @@ public class TURTLE2UPPAAL {
 		}
 		multiprocess = true;
 	}
-    
-    public String modifyString(String _input) {
-        try {
+	
+	public String modifyString(String _input) {
+		try {
 			//_input = Conversion.replaceAllString(_input, "&&", "&amp;&amp;");
 			//_input = Conversion.changeBinaryOperatorWithUnary(_input, "div", "/");
 			//_input = Conversion.changeBinaryOperatorWithUnary(_input, "mod", "%");
 			//_input = Conversion.replaceAllChar(_input, '<', "&lt;");
 			//_input = Conversion.replaceAllChar(_input, '>', "&gt;");
 			_input = Conversion.replaceAllStringNonAlphanumerical(_input, "mod", "%");
-        } catch (Exception e) {
+		} catch (Exception e) {
 			e.printStackTrace();
 			System.out.println("Exception when changing binary operator in " + _input);
-        }
+		}
 		//System.out.println("Modified string=" + _input);
-        return _input;
-    }
-    
-    public String convertGuard(String g) {
+		return _input;
+	}
+	
+	public String convertGuard(String g) {
 		if (g == null) {
 			return "";
 		}
@@ -2345,7 +2379,7 @@ public class TURTLE2UPPAAL {
 		String action = Conversion.replaceAllChar(g, '[', "");
 		action = Conversion.replaceAllChar(action, ']', "");
 		return modifyString(action.trim());
-    }
+	}
+	
 	
-    
 }
\ No newline at end of file
diff --git a/src/ui/CorrespondanceTGElement.java b/src/ui/CorrespondanceTGElement.java
index a9110bee86..c30cdf36f2 100755
--- a/src/ui/CorrespondanceTGElement.java
+++ b/src/ui/CorrespondanceTGElement.java
@@ -189,15 +189,17 @@ public class CorrespondanceTGElement {
 		}
 		
 		ArrayList<ADComponent> listAD = new ArrayList<ADComponent>();
-		ADComponent adc;
+		ArrayList<ADComponent> listADs;
+		
 		for(TGComponent tgc:_list) {
-			adc = getADComponent(tgc);
-			if (adc != null) {
-				listAD.add(adc);
-				//System.out.println("Adding adc=" + adc + " from tgc=" + tgc);
+			listADs = getADComponents(tgc);
+			//System.out.println("List size:" + listADs.size());
+			if (listADs.size() > 0) {
+				listAD.addAll(listADs);
 			}
 		}
 		
+		//System.out.println("Final List size:" + listAD.size());
 		return listAD;
 	}
 	
@@ -231,6 +233,27 @@ public class CorrespondanceTGElement {
         return null;
     }
 	
+	public ArrayList<ADComponent> getADComponents(TGComponent tgc) {
+		ArrayList<ADComponent>  list = new ArrayList<ADComponent>();
+		TGComponent tmptgc;
+		Object o;
+		
+        int index = tg.indexOf(tgc);
+		if (index == -1) {
+			return list;
+		}
+		
+		for(int i=0; i<tg.size(); i++) {
+			tmptgc = (TGComponent)(tg.elementAt(i));
+			if (tmptgc == tgc) {
+				o = data.elementAt(i);
+				list.add((ADComponent)o);
+			}
+		}
+       
+        return list;
+    }
+	
 	public HwNode getHwNode(TGComponent tgc) {
         int index = tg.indexOf(tgc);
         if ((index != -1) && (data.size() > index)) {
diff --git a/src/ui/DesignPanelTranslator.java b/src/ui/DesignPanelTranslator.java
index 5d9068ee5f..a30dd99786 100755
--- a/src/ui/DesignPanelTranslator.java
+++ b/src/ui/DesignPanelTranslator.java
@@ -405,8 +405,9 @@ public class DesignPanelTranslator {
 						return;
 					}
 					s1 = TURTLEModeling.addTypeToDataReceiving(t, s1);
-					//System.out.println("Adding type done s1=" + s1);
+					
 					adag.setActionValue(s1);
+					//System.out.println("Adding correspondance tgc=" + tgc +  "adag=" + adag);
 					listE.addCor(adag, tgc);
 				} else if ((p != null) && (nbActions == 1)){
 					//System.out.println("Action state with param found " + p.getName() + " value:" + t.getExprValueFromActionState(s));
diff --git a/src/ui/GTURTLEModeling.java b/src/ui/GTURTLEModeling.java
index 4015bb16ab..f8a1374f07 100755
--- a/src/ui/GTURTLEModeling.java
+++ b/src/ui/GTURTLEModeling.java
@@ -5,7 +5,7 @@
  * This software is a computer program whose purpose is to allow the
  * edition of TURTLE analysis, design and deployment diagrams, to
  * allow the generation of RT-LOTOS or Java code from this diagram,
- * and at last to allow the analysis of formal validation traces
+ * and at last to almalow the analysis of formal validation traces
  * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP
  * from INRIA Rhone-Alpes.
  *
@@ -336,15 +336,18 @@ public class GTURTLEModeling {
 		TURTLE2UPPAAL turtle2uppaal = new TURTLE2UPPAAL(tm);
 		turtle2uppaal.setChoiceDeterministic(choices);
 		uppaal = turtle2uppaal.generateUPPAAL(debug, nb);
+		System.out.println("Building relation table");
 		uppaalTIFTable = turtle2uppaal.getRelationTIFUPPAAL();
+		System.out.println("Building relation table done");
 		uppaalTMLTable = null;
 		
 		languageID = UPPAAL;
 		mgui.setMode(MainGUI.UPPAAL_OK);
 		
 		try {
+			System.out.println("Saving specification in " + path + "\n");
 			turtle2uppaal.saveInFile(path);
-			System.out.println("UPPAAL specification has been generated in " + path);
+			System.out.println("UPPAAL specification has been generated in " + path + "\n");
 			return true;
 		} catch (FileException fe) {
 			System.out.println("Exception: " + fe.getMessage());
@@ -375,6 +378,7 @@ public class GTURTLEModeling {
 		//System.out.println("Searching for queries");
 		TURTLEPanel tp = mgui.getCurrentTURTLEPanel();
 		ArrayList<TGComponent> list = new ArrayList<TGComponent>();
+		ArrayList<TClass> tclasses;
 		tp.getAllCheckableTGComponent(list);
 		
 		ArrayList<String> listQ = new ArrayList<String>();
@@ -382,6 +386,8 @@ public class GTURTLEModeling {
 		if (uppaalTIFTable != null) {
 			ArrayList<ADComponent> listAD = listE.getADComponentCorrespondance(list);
 			
+			//System.out.println("List size:" + listAD.size());
+			
 			if (listAD == null) {
 				return null;
 			}
@@ -391,11 +397,19 @@ public class GTURTLEModeling {
 			for(ADComponent adc:listAD) {
 				if (adc != null) {
 					t = tm.findTClass(adc);
+					//System.out.println("Found class:" + t.getName());
 					if (t!= null) {
-						s = uppaalTIFTable.getRQuery(t, adc);
-						if (s != null) {
-							//System.out.println("Adding query:" + s);
-							listQ.add(s + "$" + adc);
+						tclasses = new ArrayList<TClass>();
+						tclasses.add(t);
+						// For handling tobjects
+						tm.addAllTClassesEndingWith(tclasses, "_" + t.getName());
+						for(TClass tc: tclasses) {
+							//System.out.println("Analyzing class:" + tc.getName());
+							s = uppaalTIFTable.getRQuery(tc, adc);
+							if (s != null) {
+								//System.out.println("Adding query:" + s);
+								listQ.add(s + "$" + adc);
+							}
 						}
 					}
 				}
@@ -2324,32 +2338,8 @@ public class GTURTLEModeling {
 		}
 	}
 
-	//Method added by Solange
-//	public int countPrimitives(TGComponent comp)
-//	{
-//	int cuenta=0, nb=0;
-//	if (comp.getType()==TGComponentManager.PROCSD_COMPONENT)
-//	{
-//	nb=comp.getNbInternalTGComponent();
-//	if(nb==0) // does not have ports, inner components, etc
-//	{
-//	cuenta++;
-//	}
-//	else
-//	{
-//	for (int j=0;j<nb;j++)
-//	{
-//	TGComponent tmp=comp.getInternalTGComponent(j);
-//	cuenta= cuenta + countPrimitives(tmp);
-//	}
-//	}
-//	}
-//	return(cuenta);
-//	}
-	//until here
-
 	public void copyModelingFromXML(TDiagramPanel tdp, String s, int X, int Y) throws MalformedModelingException {
-		//System.out.println("copyModelingFromXML");
+		System.out.println("copyModelingFromXML");
 		//System.out.println(s);
 		//System.out.println("copyModelingFromXML:");
 		//LinkedList ComponentsList=tdp.getComponentList();
@@ -2359,6 +2349,9 @@ public class GTURTLEModeling {
 		int cuenta=1;
 
 		s = decodeString(s);
+		
+		//System.out.println("copy=" + s);
+		
 		ByteArrayInputStream bais = new ByteArrayInputStream(s.getBytes());
 		if ((dbf == null) || (db == null)) {
 			throw new MalformedModelingException();
@@ -2396,6 +2389,8 @@ public class GTURTLEModeling {
 
 			// Managing diagrams
 			if (tdp instanceof TClassDiagramPanel) {
+				System.out.println("TClassDiagramPanel copy");
+				
 				nl = doc.getElementsByTagName("TClassDiagramPanelCopy");
 				docCopy = doc;
 
@@ -2444,6 +2439,7 @@ public class GTURTLEModeling {
 				docCopy = null;
 
 			} else if (tdp instanceof TActivityDiagramPanel) {
+				System.out.println("TActivityDiagramPanel copy");
 				nl = doc.getElementsByTagName("TActivityDiagramPanelCopy");
 
 				if (nl == null) {
@@ -3183,8 +3179,8 @@ public class GTURTLEModeling {
 		return sb.toString();
 	}
 
-	// Assumes a class diagram is already created
 	public void loadModelingFromXML(String s) throws MalformedModelingException {
+		
 		if (s == null) {
 			return;
 		}
@@ -3952,8 +3948,8 @@ public class GTURTLEModeling {
 		try {
 			NodeList activityDiagramNl = docCopy.getElementsByTagName("TActivityDiagramPanel");
 
-			//System.out.println("Loading activity diagram of " + newValue + "Before : " + oldValue);
-			//System.out.println(docCopy);
+			System.out.println("Loading activity diagram of " + newValue + "Before : " + oldValue);
+			System.out.println(docCopy);
 
 			if (activityDiagramNl == null) {
 				throw new MalformedModelingException();
diff --git a/src/ui/MainGUI.java b/src/ui/MainGUI.java
index 4e3d709e40..be35b22a5e 100755
--- a/src/ui/MainGUI.java
+++ b/src/ui/MainGUI.java
@@ -2230,6 +2230,14 @@ public	class MainGUI implements ActionListener, WindowListener, KeyListener {
         boolean b = false;
 		boolean ret = false;
 		
+		if (file == null) {
+						JOptionPane.showMessageDialog(frame,
+							"The project must be saved before any simulation or formal verification can be performed",
+							"Syntax analysis failed",
+							JOptionPane.INFORMATION_MESSAGE);
+			return false;
+		}
+		
         TURTLEPanel tp = getCurrentTURTLEPanel();
         if (tp instanceof AnalysisPanel) {
             try {
diff --git a/src/ui/TDiagramPanel.java b/src/ui/TDiagramPanel.java
index 60472c428e..340906b8d8 100755
--- a/src/ui/TDiagramPanel.java
+++ b/src/ui/TDiagramPanel.java
@@ -505,18 +505,11 @@ public abstract class TDiagramPanel extends JPanel implements GenericTree {
         if (s == null) {
             return null;
         }
-        //Added by Solange
-        //StringBuffer s2 =SMDInXML(false);
         
         StringBuffer sb = new StringBuffer(getXMLHead());
         sb.append("\n");
         sb.append(s);
         sb.append("\n");
-        //Added by Solange
-        //sb.append(s2);
-        //sb.append("\n");
-        //
-        //System.out.println("Tail of " + toString());
         sb.append(getXMLTail());
         return sb;
     }
diff --git a/src/ui/ad/TActivityDiagramToolBar.java b/src/ui/ad/TActivityDiagramToolBar.java
index f93f0292db..0bf7d79476 100755
--- a/src/ui/ad/TActivityDiagramToolBar.java
+++ b/src/ui/ad/TActivityDiagramToolBar.java
@@ -81,6 +81,11 @@ public class TActivityDiagramToolBar extends TToolBar {
 		mgui.actions[TGUIAction.AD_ARRAY_SET].setEnabled(b);
         mgui.actions[TGUIAction.ACT_TOGGLE_JAVA].setEnabled(b);
         mgui.actions[TGUIAction.ACT_ENHANCE].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/cd/TClassDiagramToolBar.java b/src/ui/cd/TClassDiagramToolBar.java
index 452292ffe1..05a9a2611f 100755
--- a/src/ui/cd/TClassDiagramToolBar.java
+++ b/src/ui/cd/TClassDiagramToolBar.java
@@ -76,6 +76,11 @@ public class TClassDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.ACT_TOGGLE_ATTRIBUTES].setEnabled(b);
         mgui.actions[TGUIAction.ACT_TOGGLE_GATES].setEnabled(b);
         mgui.actions[TGUIAction.ACT_TOGGLE_SYNCHRO].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/dd/TDeploymentDiagramToolBar.java b/src/ui/dd/TDeploymentDiagramToolBar.java
index e940e0c1f4..193c27c97e 100755
--- a/src/ui/dd/TDeploymentDiagramToolBar.java
+++ b/src/ui/dd/TDeploymentDiagramToolBar.java
@@ -66,6 +66,11 @@ public class TDeploymentDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.TDD_LINK].setEnabled(b);
         mgui.actions[TGUIAction.TDD_NODE].setEnabled(b);
         mgui.actions[TGUIAction.TDD_ARTIFACT].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/iod/InteractionOverviewDiagramToolBar.java b/src/ui/iod/InteractionOverviewDiagramToolBar.java
index 0fa7472b06..484b2ee823 100755
--- a/src/ui/iod/InteractionOverviewDiagramToolBar.java
+++ b/src/ui/iod/InteractionOverviewDiagramToolBar.java
@@ -74,6 +74,11 @@ public class InteractionOverviewDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.IOD_STOP].setEnabled(b);
         mgui.actions[TGUIAction.IOD_JUNCTION].setEnabled(b);
         mgui.actions[TGUIAction.ACT_ENHANCE].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
         
     }
     
diff --git a/src/ui/ncdd/NCDiagramToolBar.java b/src/ui/ncdd/NCDiagramToolBar.java
index 9980941292..644f6b8051 100755
--- a/src/ui/ncdd/NCDiagramToolBar.java
+++ b/src/ui/ncdd/NCDiagramToolBar.java
@@ -69,6 +69,11 @@ public class NCDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.NCDD_TRAFFIC_ARTIFACT].setEnabled(b);
 		mgui.actions[TGUIAction.NCDD_ROUTE_ARTIFACT].setEnabled(b);
 		mgui.actions[TGUIAction.ACT_TOGGLE_ATTR].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/osad/TURTLEOSActivityDiagramToolBar.java b/src/ui/osad/TURTLEOSActivityDiagramToolBar.java
index d039647414..d09d7d2056 100755
--- a/src/ui/osad/TURTLEOSActivityDiagramToolBar.java
+++ b/src/ui/osad/TURTLEOSActivityDiagramToolBar.java
@@ -69,6 +69,11 @@ public class TURTLEOSActivityDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.TOSAD_CHOICE].setEnabled(b);
         mgui.actions[TGUIAction.TOSAD_TIME_INTERVAL].setEnabled(b);
         mgui.actions[TGUIAction.TOSAD_INT_TIME_INTERVAL].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/oscd/TURTLEOSClassDiagramToolBar.java b/src/ui/oscd/TURTLEOSClassDiagramToolBar.java
index e1cd8c778f..898b5889a1 100755
--- a/src/ui/oscd/TURTLEOSClassDiagramToolBar.java
+++ b/src/ui/oscd/TURTLEOSClassDiagramToolBar.java
@@ -78,6 +78,11 @@ public class TURTLEOSClassDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.ACT_TOGGLE_ATTRIBUTES].setEnabled(b);
         mgui.actions[TGUIAction.ACT_TOGGLE_GATES].setEnabled(b);
         mgui.actions[TGUIAction.ACT_TOGGLE_SYNCHRO].setEnabled(b);*/
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/procsd/ProactiveCSDToolBar.java b/src/ui/procsd/ProactiveCSDToolBar.java
index 0f7dcb6cc3..ead61149b3 100755
--- a/src/ui/procsd/ProactiveCSDToolBar.java
+++ b/src/ui/procsd/ProactiveCSDToolBar.java
@@ -77,6 +77,12 @@ public class ProactiveCSDToolBar extends TToolBar {
         mgui.actions[TGUIAction.CONNECTOR_COMMENT].setEnabled(b);
         //Enable the new action created by Solange
         //mgui.actions[TGUIAction.PRUEBA_1].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
+		
             }
     
     protected void setButtons() {
diff --git a/src/ui/prosmd/ProactiveSMDToolBar.java b/src/ui/prosmd/ProactiveSMDToolBar.java
index 809b5636b6..cc4d40d949 100755
--- a/src/ui/prosmd/ProactiveSMDToolBar.java
+++ b/src/ui/prosmd/ProactiveSMDToolBar.java
@@ -85,6 +85,11 @@ public class ProactiveSMDToolBar extends TToolBar {
         mgui.actions[TGUIAction.AD_TIME_LIMITED_OFFER_WITH_LATENCY].setEnabled(b);
         mgui.actions[TGUIAction.ACT_TOGGLE_JAVA].setEnabled(b);
         mgui.actions[TGUIAction.ACT_ENHANCE].setEnabled(b);*/
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/sd/SequenceDiagramToolBar.java b/src/ui/sd/SequenceDiagramToolBar.java
index 7da5154fc0..0c05a8376b 100755
--- a/src/ui/sd/SequenceDiagramToolBar.java
+++ b/src/ui/sd/SequenceDiagramToolBar.java
@@ -77,6 +77,11 @@ public class SequenceDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.SD_RELATIVE_TIME_CONSTRAINT].setEnabled(b);
         mgui.actions[TGUIAction.SD_RELATIVE_TIME_CONSTRAINT_CONNECTOR].setEnabled(b);
         mgui.actions[TGUIAction.SD_ALIGN_INSTANCES].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/tmlad/TMLActivityDiagramToolBar.java b/src/ui/tmlad/TMLActivityDiagramToolBar.java
index 832ad85320..3f3aecc75f 100755
--- a/src/ui/tmlad/TMLActivityDiagramToolBar.java
+++ b/src/ui/tmlad/TMLActivityDiagramToolBar.java
@@ -88,6 +88,11 @@ public class TMLActivityDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.TMLAD_SEQUENCE].setEnabled(b);
         mgui.actions[TGUIAction.ACT_ENHANCE].setEnabled(b);
 		mgui.actions[TGUIAction.ACT_TOGGLE_INTERNAL_COMMENT].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/tmlcd/TMLTaskDiagramToolBar.java b/src/ui/tmlcd/TMLTaskDiagramToolBar.java
index 16657af518..c9080fc0e3 100755
--- a/src/ui/tmlcd/TMLTaskDiagramToolBar.java
+++ b/src/ui/tmlcd/TMLTaskDiagramToolBar.java
@@ -70,6 +70,11 @@ public class TMLTaskDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.ACT_TOGGLE_CHANNELS].setEnabled(b);
         mgui.actions[TGUIAction.ACT_TOGGLE_EVENTS].setEnabled(b);
         mgui.actions[TGUIAction.ACT_TOGGLE_REQUESTS].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/tmldd/TMLArchiDiagramToolBar.java b/src/ui/tmldd/TMLArchiDiagramToolBar.java
index 44ffd67edb..33f388c242 100755
--- a/src/ui/tmldd/TMLArchiDiagramToolBar.java
+++ b/src/ui/tmldd/TMLArchiDiagramToolBar.java
@@ -72,6 +72,9 @@ public class TMLArchiDiagramToolBar extends TToolBar {
 		mgui.actions[TGUIAction.TMLARCHI_COMMUNICATION_ARTIFACT].setEnabled(b);
 		mgui.actions[TGUIAction.TMLARCHI_MEMORYNODE].setEnabled(b);
 		mgui.actions[TGUIAction.ACT_TOGGLE_ATTR].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/ucd/UseCaseDiagramToolBar.java b/src/ui/ucd/UseCaseDiagramToolBar.java
index 89897243d1..bc15b5e8dd 100755
--- a/src/ui/ucd/UseCaseDiagramToolBar.java
+++ b/src/ui/ucd/UseCaseDiagramToolBar.java
@@ -69,6 +69,11 @@ public class UseCaseDiagramToolBar extends TToolBar {
         mgui.actions[TGUIAction.UCD_CONNECTOR_INCLUDE].setEnabled(b);
         mgui.actions[TGUIAction.UCD_CONNECTOR_EXTEND].setEnabled(b);
         mgui.actions[TGUIAction.UCD_CONNECTOR_SPECIA].setEnabled(b);
+		
+		mgui.actions[TGUIAction.ACT_ZOOM_MORE].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_ZOOM_LESS].setEnabled(false);
+		mgui.actions[TGUIAction.ACT_SHOW_ZOOM].setEnabled(false);
+		mgui.updateZoomInfo();
     }
     
     protected void setButtons() {
diff --git a/src/ui/window/JDialogUPPAALGeneration.java b/src/ui/window/JDialogUPPAALGeneration.java
index 8cc2748179..5f2b4a99a5 100755
--- a/src/ui/window/JDialogUPPAALGeneration.java
+++ b/src/ui/window/JDialogUPPAALGeneration.java
@@ -315,12 +315,16 @@ public class JDialogUPPAALGeneration extends javax.swing.JDialog implements Acti
 				result = mgui.gtm.generateUPPAALFromTML(pathCode, debug, size1, choices);
 			} else {
 				result = mgui.gtm.generateUPPAALFromTIF(pathCode, debug, nb1, choices);
+				jta.append("UPPAAL specification generated\n");
+				jta.append("Checking the regularity of the TIF specification\n");
+				System.out.println("Regularity?");
 				boolean b = mgui.gtm.isRegularTM();
 				if (b) {
 					jta.append("UPPAAL code was optimized since the TIF specification is regular\n");
 				} else {
 					jta.append("UPPAAL code was NOT optimized since the TIF specification is NOT regular\n");
 				}
+				System.out.println("Regularity done");
 			}
 			if (result) {
 				jta.append("UPPAAL code generated in " + pathCode);
diff --git a/src/ui/window/JDialogUPPAALValidation.java b/src/ui/window/JDialogUPPAALValidation.java
index 58767414a7..6553e1e5b4 100755
--- a/src/ui/window/JDialogUPPAALValidation.java
+++ b/src/ui/window/JDialogUPPAALValidation.java
@@ -325,7 +325,7 @@ public class JDialogUPPAALValidation extends javax.swing.JDialog implements Acti
 						}
 					}
 				} else {
-					jta.append("No component to analyze found on diagrams\n");
+					jta.append("No component to analyze accessibility found on diagrams\n");
 				}
 			}
 			
@@ -347,7 +347,7 @@ public class JDialogUPPAALValidation extends javax.swing.JDialog implements Acti
 						}
 					}
 				} else {
-					jta.append("No component found\n");
+					jta.append("No component to analyze liveness found on diagrams\n");
 				}
 			}
 			
diff --git a/src/uppaaldesc/UPPAALSpec.java b/src/uppaaldesc/UPPAALSpec.java
index 0f91408197..9553dcbd40 100755
--- a/src/uppaaldesc/UPPAALSpec.java
+++ b/src/uppaaldesc/UPPAALSpec.java
@@ -71,12 +71,12 @@ public class UPPAALSpec {
 		UPPAALTemplate template;
 		
 		globalDeclaration = "<declaration>\n//Global declarations\n" + Conversion.transformToXMLString(globalDeclaration) + "</declaration>\n";
-		String templatesString = "";
+		StringBuffer templatesString = new StringBuffer("");
 		
 		while(iterator.hasNext()) {
 			//System.out.println("Template!");
 			template = (UPPAALTemplate)(iterator.next());
-			templatesString += template.makeTemplate();
+			templatesString.append(template.makeTemplate());
 		}
 		
 		instanciations = "<system>\n//Instanciation \n" + Conversion.transformToXMLString(instanciations) + "</system>\n";
diff --git a/src/uppaaldesc/UPPAALTemplate.java b/src/uppaaldesc/UPPAALTemplate.java
index a7bef78701..14647b1c6b 100755
--- a/src/uppaaldesc/UPPAALTemplate.java
+++ b/src/uppaaldesc/UPPAALTemplate.java
@@ -119,35 +119,35 @@ public class UPPAALTemplate {
 		
     }
     
-    public String makeStringAutomata() {
+    public StringBuffer makeStringAutomata() {
+		StringBuffer ret = new StringBuffer("");
+		
 		if (initLocation == null) {
-			return "";
+			return ret;
 		}
 		
-		String ret = "";
-		
 		ListIterator iterator = locations.listIterator();
 		while(iterator.hasNext()) {
-			ret += ((UPPAALLocation)(iterator.next())).getXML();
+			ret.append(((UPPAALLocation)(iterator.next())).getXML());
 		}
 		
-		ret += "<init ref=\"" +initLocation.id + "\" />\n";
+		ret.append("<init ref=\"" +initLocation.id + "\" />\n");
 		
 		iterator = transitions.listIterator();
 		while(iterator.hasNext()) {
-			ret += ((UPPAALTransition)(iterator.next())).getXML();
+			ret.append(((UPPAALTransition)(iterator.next())).getXML());
 		}
 		return ret;
     }
 	
 	
-    public String makeTemplate() {
-		String fullString = "<template>\n";
-		fullString += "<name>" + name + "</name>\n";
-		fullString += "<parameter>" + Conversion.transformToXMLString(parameter)  + "</parameter>\n";
-		fullString += "<declaration>" + Conversion.transformToXMLString(declaration) + "</declaration>\n";
-		fullString += makeStringAutomata();
-		fullString += "</template>\n";
+    public StringBuffer makeTemplate() {
+		StringBuffer fullString = new StringBuffer("<template>\n");
+		fullString.append("<name>" + name + "</name>\n");
+		fullString.append("<parameter>" + Conversion.transformToXMLString(parameter)  + "</parameter>\n");
+		fullString.append("<declaration>" + Conversion.transformToXMLString(declaration) + "</declaration>\n");
+		fullString.append(makeStringAutomata());
+		fullString.append("</template>\n");
 		
 		return fullString;
     }
-- 
GitLab