diff --git a/modeling/AVATAR/testQuery.xml b/modeling/AVATAR/testQuery.xml
index ee7c50f73ccab0efcf146bb41988722211ee0b63..8b79961176c7a606dcee44f9ab74b3f7fb1e49a3 100644
--- a/modeling/AVATAR/testQuery.xml
+++ b/modeling/AVATAR/testQuery.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<TURTLEGMODELING version="1.0beta" ANIMATE_INTERACTIVE_SIMULATION="false" ACTIVATE_PENALTIES="true" UPDATE_INFORMATION_DIPLO_SIM="false" ANIMATE_WITH_INFO_DIPLO_SIM="true" OPEN_DIAG_DIPLO_SIM="false" LAST_SELECTED_MAIN_TAB="0" LAST_SELECTED_SUB_TAB="2">
+<TURTLEGMODELING version="1.0beta" ANIMATE_INTERACTIVE_SIMULATION="false" ACTIVATE_PENALTIES="true" UPDATE_INFORMATION_DIPLO_SIM="false" ANIMATE_WITH_INFO_DIPLO_SIM="true" OPEN_DIAG_DIPLO_SIM="false" LAST_SELECTED_MAIN_TAB="0" LAST_SELECTED_SUB_TAB="0">
 
 <Modeling type="AVATAR Design" nameTab="Design" tabs="Block Diagram$RandomGenerator$Reader" >
 <AVATARBlockDiagramPanel name="Block Diagram" minX="10" maxX="2500" minY="10" maxY="1500" zoom="1.0" >
diff --git a/src/main/java/avatartranslator/AvatarBlock.java b/src/main/java/avatartranslator/AvatarBlock.java
index 0d8cd59cb9a13d75f3160bf55af3b0908ee955cc..1136c88f3459e5f8e4dd581947ffbca7f643f7f7 100644
--- a/src/main/java/avatartranslator/AvatarBlock.java
+++ b/src/main/java/avatartranslator/AvatarBlock.java
@@ -71,6 +71,7 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         this.avspec = _avspec;
 
         attributes = new LinkedList<AvatarAttribute>();
+        constants = new LinkedList<AvatarAttribute>();
         methods = new LinkedList<AvatarMethod>();
         signals = new LinkedList<AvatarSignal>();
         asm = new AvatarStateMachine(this, "statemachineofblock__" + _name, _referenceObject);
@@ -142,6 +143,10 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
         return attributes;
     }
 
+    public List<AvatarAttribute> getConstants() {
+        return constants;
+    }
+
     public List<AvatarMethod> getMethods() {
         return methods;
     }
@@ -797,8 +802,12 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
                     toKeep = true;
                 }
                 for (AvatarStateMachineElement elt : asm.getListOfElements()) {
+
                     if (elt instanceof AvatarTransition) {
                         at = (AvatarTransition) elt;
+
+
+
                         for (AvatarAction aa : at.getActions()) {
                             if (aa instanceof AvatarActionAssignment) {
                                if (((AvatarActionAssignment) aa).leftHand.getName().compareTo(attr.name) == 0) {
@@ -822,6 +831,9 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
                             toKeep = true;
                         }
                     }
+
+
+
                     if (toKeep) {
                         break;
                     }
@@ -864,6 +876,33 @@ public class AvatarBlock extends AvatarElement implements AvatarStateMachineOwne
 
     }
 
+    // Returns the number of replaced queries
+    public int  replaceQueriesWithReadSignal(AvatarSignal _origin, AvatarSignal _newSignal) {
+        List<AvatarQueryOnSignal> elts = new LinkedList<>();
+        AvatarQueryOnSignal aqos;
+
+        // Getting all related ops
+        for(AvatarStateMachineElement elt: asm.getListOfElements()) {
+            if (elt instanceof AvatarQueryOnSignal) {
+                aqos = (AvatarQueryOnSignal) elt;
+                if (aqos.getSignal() == _origin) {
+                    elts.add(aqos);
+                }
+            }
+        }
+
+        // Replacing ops
+        for(AvatarQueryOnSignal q: elts) {
+            AvatarActionOnSignal aaosQuery = new AvatarActionOnSignal("query", _newSignal, q.getReferenceObject());
+            aaosQuery.addValue(q.getAttribute().getName());
+            asm.replace(q, aaosQuery);
+        }
+
+        return elts.size();
+
+
+    }
+
 
     @Override
     public AvatarBlock advancedClone(AvatarSpecification avspec) {
diff --git a/src/main/java/avatartranslator/AvatarBlockTemplate.java b/src/main/java/avatartranslator/AvatarBlockTemplate.java
index 7470f141fe95bb010be047100b52d704c0a6fc31..e344d6a5382941e0023677db886be02fe3c2147f 100644
--- a/src/main/java/avatartranslator/AvatarBlockTemplate.java
+++ b/src/main/java/avatartranslator/AvatarBlockTemplate.java
@@ -149,13 +149,16 @@ public class AvatarBlockTemplate {
     public static AvatarBlock getFifoBlock(String _name, AvatarSpecification _avspec, AvatarRelation _ar, Object _referenceRelation,
                                            AvatarSignal _sig1, AvatarSignal _sig2, int _sizeOfFifo, int FIFO_ID) {
         AvatarBlock ab = new AvatarBlock(_name, _avspec, _referenceRelation);
+        ab.setName(_name);
 
         // Create the read and write signals
         AvatarSignal write = new AvatarSignal("write", AvatarSignal.IN, _referenceRelation);
         AvatarSignal read = new AvatarSignal("read", AvatarSignal.OUT, _referenceRelation);
+        AvatarSignal queryS = new AvatarSignal("query", AvatarSignal.OUT, _referenceRelation);
 
         ab.addSignal(write); // corresponds to sig1
         ab.addSignal(read);  // corresponds to sig2
+        ab.addSignal(queryS);
 
 
         // Creating the attributes of the signals
@@ -167,6 +170,11 @@ public class AvatarBlockTemplate {
             read.addParameter(aa.advancedClone(null));
         }
 
+        AvatarAttribute queryA = new  AvatarAttribute("queryA", AvatarType.INTEGER, ab, _referenceRelation);
+        ab.addAttribute(queryA);
+        queryS.addParameter(queryA.advancedClone(null));
+
+
 
         // Creating the attributes to support the FIFO
         // For each parameter, we create an attribute that is similar to the one of e.g. sig1
@@ -303,6 +311,12 @@ public class AvatarBlockTemplate {
             at.addAction("size = size - 1");
         }
 
+        // Query
+        AvatarActionOnSignal aaosQuery = new AvatarActionOnSignal("query", queryS, _referenceRelation);
+        asm.addElement(aaosQuery);
+        aaosQuery.addValue("size");
+        at = makeAvatarEmptyTransitionBetween(ab, asm, main, aaosQuery, _referenceRelation);
+        at = makeAvatarEmptyTransitionBetween(ab, asm, aaosQuery, main, _referenceRelation);
 
         // Block is finished!
 
diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java
index 4766df8ba430b1f5a9cecbe24a63a6479c77c29a..4e7f4cead807512b6a68eef7e7d0501f1d1599ab 100644
--- a/src/main/java/avatartranslator/AvatarSpecification.java
+++ b/src/main/java/avatartranslator/AvatarSpecification.java
@@ -521,25 +521,44 @@ public class AvatarSpecification extends AvatarElement {
         return FIFO_ID;
     }
 
-    private int removeFIFO(AvatarRelation _ar, AvatarSignal _sig1, AvatarSignal _sig2, int _sizeOfInfiniteFifo, List<AvatarRelation> _oldOnes, List<AvatarRelation> _newOnes, int FIFO_ID) {
+    private int removeFIFO(AvatarRelation _ar, AvatarSignal _sig1, AvatarSignal _sig2, int _sizeOfInfiniteFifo, List<AvatarRelation> _oldOnes,
+                           List<AvatarRelation> _newOnes, int FIFO_ID) {
         // We create the new block, and the new relation towards the new block
-        String nameOfBlock = "FIFO__" + _sig1.getName() + "__" + _sig2.getName() + "__" + FIFO_ID;
+        String nameOfBlock = "FIFO_" + _sig1.getName() + "_" + _sig2.getName() + "_" + FIFO_ID;
         AvatarBlock fifoBlock = AvatarBlockTemplate.getFifoBlock(nameOfBlock, this, _ar, _ar.getReferenceObject(), _sig1, _sig2, _sizeOfInfiniteFifo, FIFO_ID);
         blocks.add(fifoBlock);
 
         // We now need to create the new relation
-        AvatarRelation newAR1 = new AvatarRelation("FIFO__write_" + FIFO_ID, _ar.block1, fifoBlock, _ar.getReferenceObject());
+        AvatarRelation newAR1 = new AvatarRelation("FIFO_write_" + FIFO_ID, _ar.block1, fifoBlock, _ar.getReferenceObject());
         newAR1.setAsynchronous(false);
         newAR1.setPrivate(_ar.isPrivate());
         newAR1.addSignals(_sig1, fifoBlock.getSignalByName("write"));
         _newOnes.add(newAR1);
 
-        AvatarRelation newAR2 = new AvatarRelation("FIFO__read_" + FIFO_ID, fifoBlock, _ar.block2, _ar.getReferenceObject());
+        AvatarRelation newAR2 = new AvatarRelation("FIFO_read_" + FIFO_ID, fifoBlock, _ar.block2, _ar.getReferenceObject());
         newAR2.setAsynchronous(false);
         newAR2.setPrivate(_ar.isPrivate());
         newAR2.addSignals(fifoBlock.getSignalByName("read"), _sig2);
         _newOnes.add(newAR2);
 
+        // We also add the query signals to the newAR2 relation
+
+
+        AvatarSignal queryS = new AvatarSignal("query_FIFO_read_" + FIFO_ID, AvatarSignal.IN, _sig2.getReferenceObject());
+        _ar.block2.addSignal(queryS);
+        AvatarAttribute queryA = new  AvatarAttribute("queryA", AvatarType.INTEGER, null, _sig2.getReferenceObject());
+        queryS.addParameter(queryA);
+
+        AvatarRelation newAR3 = new AvatarRelation("FIFO_query_" + FIFO_ID, fifoBlock, _ar.block2, _ar.getReferenceObject());
+        newAR3.setAsynchronous(false);
+        newAR3.setPrivate(_ar.isPrivate());
+        newAR2.addSignals(fifoBlock.getSignalByName("query"), queryS);
+        _newOnes.add(newAR3);
+
+        // Replace query in block2 for _sig2 by readOnSignal with signal queryS. Use the same attribute as before
+        _ar.block2.replaceQueriesWithReadSignal(_sig2, queryS);
+
+
         FIFO_ID++;
         return FIFO_ID;
     }
diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java
index 2e7d385a1401c1580a19f40383d8f34427d7642f..ca1357d51e158a8edf323260d3f01a143a46e690 100644
--- a/src/main/java/ui/GTURTLEModeling.java
+++ b/src/main/java/ui/GTURTLEModeling.java
@@ -9018,6 +9018,17 @@ public class GTURTLEModeling {
             SMDMap.put(asme, smdr);
             locMap.put(asme, smdr);
         }
+
+        if (asme instanceof AvatarQueryOnSignal) {
+            AvatarSMDQueryReceiveSignal smdqrs = new AvatarSMDQueryReceiveSignal(x, y, smp.getMinX(), smp.getMaxX(), smp.getMinY(), smp.getMaxY(), false, null,
+                    smp);
+            smdqrs.setNames(((AvatarQueryOnSignal) asme).getAttribute().getName(), ((AvatarQueryOnSignal) asme).getSignal().getName());
+            smp.addComponent(smdqrs, x, y, false, true);
+            tgcomp = smdqrs;
+            SMDMap.put(asme, smdqrs);
+            locMap.put(asme, smdqrs);
+        }
+
         if (asme instanceof AvatarActionOnSignal) {
             avatartranslator.AvatarSignal sig = ((AvatarActionOnSignal) asme).getSignal();
             if (sig.isIn()) {
@@ -9176,6 +9187,8 @@ public class GTURTLEModeling {
                 typeIds[i] = attr.getName();
                 i++;
             }
+
+
             //TraceManager.addDev("Adding signal " + sig + " with name=" + name);
             bl.addSignal(new ui.AvatarSignal(sig.getInOut(), name, types, typeIds));
         }
@@ -9200,6 +9213,26 @@ public class GTURTLEModeling {
                 bl.addCryptoElements();
             }
         }
+
+        for (AvatarAttribute attr : ab.getConstants()) {
+            int type = 5;
+            if (attr.getType() == AvatarType.BOOLEAN) {
+                type = 4;
+            }
+            if (attr.getType() == AvatarType.INTEGER) {
+                type = 0;
+            }
+            if (attr.hasInitialValue()) {
+                bl.addAttribute(new TAttribute(0, attr.getName(), attr.getInitialValue(), type));
+            } else {
+                bl.addAttribute(new TAttribute(0, attr.getName(), attr.getType().getDefaultInitialValue(), type));
+            }
+            if (attr.getName().contains("key_") || attr.getName().contains("privKey_")) {
+                hasCrypto = true;
+                bl.addCryptoElements();
+            }
+        }
+
         for (avatartranslator.AvatarMethod method : ab.getMethods()) {
             bl.addMethodIfApplicable(method.toString().replaceAll(" = 0", ""));
         }
@@ -9700,6 +9733,7 @@ public class GTURTLEModeling {
         AvatarStartState start = asm.getStartState();
 
         addStates(start, smx, smy, smp, bl, SMDMap, locMap, tranDestMap, tranSourceMap);
+
         //Add transitions
         for (AvatarTransition t : tranSourceMap.keySet()) {
             if (tranSourceMap.get(t) == null || tranDestMap.get(t) == null || locMap.get(tranDestMap.get(t)) == null) {
diff --git a/src/main/java/ui/avatarsmd/AvatarSMDQueryReceiveSignal.java b/src/main/java/ui/avatarsmd/AvatarSMDQueryReceiveSignal.java
index b64d547a297187b64cbb1e244d990a744bc27ec2..c109da75661c0769a86d982ab2ebf25160dd3e9c 100644
--- a/src/main/java/ui/avatarsmd/AvatarSMDQueryReceiveSignal.java
+++ b/src/main/java/ui/avatarsmd/AvatarSMDQueryReceiveSignal.java
@@ -378,6 +378,13 @@ public class AvatarSMDQueryReceiveSignal extends AvatarSMDBasicCanBeDisabledComp
 		}
 		return value.substring(0, index).trim();
 	}
+
+
+
+	public void setNames(String _attributeName, String _sigName) {
+    	value = _attributeName + " =? " + _sigName;
+	}
+
 	
 
 
diff --git a/src/main/java/ui/window/JDialogAvatarModelChecker.java b/src/main/java/ui/window/JDialogAvatarModelChecker.java
index 84c38a8d972d15c202cd60df3844c8f767cf19d3..8a59e1f5ebd3bd2c6d973c927e6a515bcbe8fa0a 100644
--- a/src/main/java/ui/window/JDialogAvatarModelChecker.java
+++ b/src/main/java/ui/window/JDialogAvatarModelChecker.java
@@ -982,6 +982,13 @@ public class JDialogAvatarModelChecker extends javax.swing.JFrame implements Act
             
             TraceManager.addDev("Model checking done");
 
+            if (generateDesignSelected) {
+                TraceManager.addDev("Drawing modified avatar spec");
+                if ((mgui != null) && (spec != null)) {
+                    mgui.drawAvatarSpecification(amc.getReworkedAvatarSpecification());
+                }
+            }
+
 
 
             //TraceManager.addDev("RG:" + amc.statesToString() + "\n\n");