diff --git a/src/main/java/avatartranslator/AvatarDataType.java b/src/main/java/avatartranslator/AvatarDataType.java
index 56f14b9a2ac57f9685c7b7eb03cc35d649f50e7e..47357c0aa360c42ee0712553d5d3f3f356674389 100644
--- a/src/main/java/avatartranslator/AvatarDataType.java
+++ b/src/main/java/avatartranslator/AvatarDataType.java
@@ -1,25 +1,27 @@
 package avatartranslator;
 
+import myutil.NameChecker;
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public class AvatarDataType {
+public class AvatarDataType extends AvatarElement implements NameChecker.NameStartWithUpperCase {
     public final static int INTEGER = 0;
     public final static int BOOLEAN = 1;
     public final static int DATATYPE = 2;
     public static Map<String,AvatarDataType> dataTypeMap = new HashMap<String,AvatarDataType>();
-    private String name;
-    private List<String> fieldStrings;
-    private List<Integer> fieldStringTypes;
-    private List<String> fieldNames;
-    private List<Integer> fieldTypes;
-    private List<String> dataTypeNames;
+
+    private List<String> fieldStrings; // list of all primitive fields, unrolling sub-datatypes
+    private List<Integer> fieldStringTypes; // list of primitive types associated to fieldStrings
+    private List<String> fieldNames; // list of direct fields
+    private List<Integer> fieldTypes; // types of direct fields
+    private List<String> dataTypeNames; // datatypes of direct fields (null for primitive types)
     private int fullSize;
 
-    public AvatarDataType(String _name) {
-        name = _name;
+    public AvatarDataType(String _name, Object _referenceObject) {
+        super(_name, _referenceObject);
         fieldStrings = new ArrayList<String>();
         fieldStringTypes = new ArrayList<Integer>();
         fieldNames = new ArrayList<String>();
@@ -27,7 +29,6 @@ public class AvatarDataType {
         dataTypeNames = new ArrayList<String>();
         fullSize = -1;
     }
-    public String getName() { return name; }
     public int getFullSize() { return fullSize; }
     public int getNbFields() { return fieldNames.size(); }
     public String getFieldName(int _i) { return fieldNames.get(_i); }
@@ -35,6 +36,7 @@ public class AvatarDataType {
     public int getFieldStringType(int _i) { return fieldStringTypes.get(_i); }
     public int getFieldType(int _i) { return fieldTypes.get(_i); }
     public String getDataTypeName(int _i) { return dataTypeNames.get(_i); }
+
     public void addField(String _fieldName, int _fieldType, String _dataTypeName) {
         if (fullSize != -1) return; // DataType has already been finalized
         if (_fieldType == AvatarDataType.INTEGER || _fieldType == AvatarDataType.BOOLEAN)
@@ -76,4 +78,47 @@ public class AvatarDataType {
         }
         adt.fullSize = size;
     }
+    public String toString() {
+        //Thread.currentThread().dumpStack();
+        StringBuffer sb = new StringBuffer("DataType:" + getName() + " ID=" + getID() + " \n");
+        int size = fieldNames.size();
+        for (int i = 0; i < size; i++) {
+            String type;
+            if (fieldTypes.get(i) == AvatarDataType.INTEGER) type = "Integer";
+            else if (fieldTypes.get(i) == AvatarDataType.BOOLEAN) type = "Boolean";
+            else type = dataTypeNames.get(i);
+            sb.append("  field: " + fieldNames.get(i) + ", type = " + type + "\n");
+        }
+        return sb.toString();
+    }
+    public String toStringRecursive() { return toString(); }
+    public String toShortString() { return toString(); }
+    public int getIndexOfFieldWithName(String _name) {
+        int cpt = 0;
+        for (String fieldName : fieldNames) {
+            if (fieldName.compareTo(_name) == 0) {
+                return cpt;
+            }
+            cpt++;
+        }
+        return -1;
+    }
+
+    public AvatarDataType advancedClone() {
+        AvatarDataType adt = new AvatarDataType(getName(), getReferenceObject());
+        int size = fieldNames.size();
+        for (int i=0; i < size; i++) {
+            adt.fieldNames.add(fieldNames.get(i));
+            adt.fieldTypes.add(fieldTypes.get(i));
+            adt.dataTypeNames.add(dataTypeNames.get(i));
+        }
+        size = fieldStrings.size();
+        for (int i=0; i < size; i++) {
+            adt.fieldStrings.add(fieldStrings.get(i));
+            adt.fieldStringTypes.add(fieldStringTypes.get(i));
+        }
+        adt.fullSize = fullSize;
+        return adt;
+    }
+
 }
diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java
index 06f28f937056e6e6af4ebe2a7b39a37d919aa44e..700c217a7a5283f3f83f06b19e446d4bfb90d6ac 100644
--- a/src/main/java/avatartranslator/AvatarSpecification.java
+++ b/src/main/java/avatartranslator/AvatarSpecification.java
@@ -44,6 +44,7 @@ import myutil.Conversion;
 import myutil.NameChecker;
 import myutil.TraceManager;
 import myutil.intboolsolver.IBSParamSpec;
+import org.apache.derby.iapi.types.DataType;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
diff --git a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java
index 9b59150679d113b550dc2eb46337d6e13c616b2f..3c949a6359de03ee53232b7f2e9720e77c715a6b 100644
--- a/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java
+++ b/src/main/java/avatartranslator/tosysmlv2/AvatarFromSysML.java
@@ -170,7 +170,7 @@ public class AvatarFromSysML {
     private class BuildDataType implements BiConsumer<String, StxDataType> {
         public BuildDataType(){}
         public void accept(String n, StxDataType d) {
-            AvatarDataType dataType = new AvatarDataType(d.getName());
+            AvatarDataType dataType = new AvatarDataType(d.getName(),null);
             AvatarDataType.dataTypeMap.put(d.getName(), dataType);
             avSpec.getDataTypes().add(dataType);
             int nbFields = d.getSize();
@@ -573,4 +573,16 @@ public class AvatarFromSysML {
             }
         }
     }
+    void rebuildDataTypes(AvatarSpecification as){}
+        // handle attribute list
+        // handle signal profiles
+        // handle methods (profiles and return type
+        // statemachine state: handle send action
+        // statemachine state: handle receive action
+        // statemachine transaction: handle method call
+        // statemachine transaction: handle assignment target
+        // statemachine transaction: handle right method call
+        // handle expressions in ui ???
+
+
 }
diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java
index 6f5f801b0a8cf36bc1376d9d4bbed46afcf0b6d8..8cd2a283fc37d83c8790199c0677ac5b13741075 100644
--- a/src/main/java/ui/AvatarDesignPanelTranslator.java
+++ b/src/main/java/ui/AvatarDesignPanelTranslator.java
@@ -87,6 +87,7 @@ public class AvatarDesignPanelTranslator {
     public AvatarSpecification generateAvatarSpecification(List<AvatarBDStateMachineOwner> _blocks) {
         List<AvatarBDBlock> blocks = new LinkedList<AvatarBDBlock>();
         List<AvatarBDLibraryFunction> libraryFunctions = new LinkedList<AvatarBDLibraryFunction>();
+        List<AvatarBDDataType> listOfDataTypes = new LinkedList<>();
 
         for (AvatarBDStateMachineOwner owner : _blocks)
             if (owner instanceof AvatarBDBlock)
@@ -100,15 +101,25 @@ public class AvatarDesignPanelTranslator {
 
         AvatarSpecification as = new AvatarSpecification("avatarspecification", adp);
 
+        //TraceManager.addDev("Getting graphical data types");
         if (adp != null) {
             AvatarBDPanel abdp = adp.getAvatarBDPanel();
             if (abdp != null) {
                 as.addApplicationCode(abdp.getMainCode());
+                for(TGComponent tgc: abdp.getAllComponentList()) {
+                    if (tgc instanceof AvatarBDDataType) {
+                        listOfDataTypes.add((AvatarBDDataType)(tgc));
+                    }
+                }
+                // Find data types
             }
         }
+
+        TraceManager.addDev("Nb of data types: " + listOfDataTypes.size());
+
         typeAttributesMap = new HashMap<String, List<TAttribute>>();
         nameTypeMap = new HashMap<String, String>();
-        createDataTypes(as);
+        createDataTypes(as, listOfDataTypes);
         createLibraryFunctions(as, libraryFunctions);
         createBlocks(as, blocks);
         //createInterfaces(as, interfaces);
@@ -1044,14 +1055,13 @@ public class AvatarDesignPanelTranslator {
             dataTypeList.add(d);
         }
     }
-    public void createDataTypes(AvatarSpecification as) {
+    public void createDataTypes(AvatarSpecification as, List<AvatarBDDataType> _dataTypes) {
         AvatarDataType.dataTypeMap.clear();
-        for (TGComponent tgc : adp.getAvatarBDPanel().getComponentList())
-            if (tgc instanceof AvatarBDDataType) {
-                AvatarBDDataType tgdt = (AvatarBDDataType)tgc;
-                String dtName = tgdt.getDataTypeName();
-                AvatarDataType dataType = new AvatarDataType(dtName);
-                List<TAttribute> fields = tgdt.getAttributeList();
+
+        for (AvatarBDDataType dtt : _dataTypes) {
+                String dtName = dtt.getDataTypeName();
+                AvatarDataType dataType = new AvatarDataType(dtName,dtt);
+                List<TAttribute> fields = dtt.getAttributeList();
                 for (TAttribute f : fields) {
                     if(f.getType() == TAttribute.INTEGER || f.getType() == TAttribute.NATURAL)
                         dataType.addField(f.getId(), AvatarDataType.INTEGER, null);
@@ -1061,7 +1071,7 @@ public class AvatarDesignPanelTranslator {
                         dataType.addField(f.getId(), AvatarDataType.DATATYPE, f.getTypeOther());
                 }
                 AvatarDataType.dataTypeMap.put(dtName, dataType);
-            }
+        }
         AvatarDataType.dataTypeMap.forEach(new FinalizeAvatarDataType(as.getDataTypes()));
     }
 
@@ -1080,7 +1090,7 @@ public class AvatarDesignPanelTranslator {
         aa.setInitialValue(_a.getInitialValue());
         aa.setAsConstant(_a.isConstant());
 
-        if ( (originAttribute != null) && (originAttribute.isConstant()) ) {
+        if ((originAttribute != null) && (originAttribute.isConstant())) {
             aa.setAsConstant(true);
         }
 
@@ -2385,6 +2395,7 @@ public class AvatarDesignPanelTranslator {
                     int index2 = actionText.indexOf(";");
 
                     if (index2 != -1) {
+
                         makeError(error, connector.tdp, block, connector, "transition action", actionText);
                     }
 
@@ -2944,7 +2955,7 @@ public class AvatarDesignPanelTranslator {
 
         String s = _input.substring(index0 + 1, index1).trim();
 
-        String end = _input.substring(index1+1).trim();
+        String end = _input.substring(index1 + 1).trim();
         //TraceManager.addDev("end>"  + end + "<");
         if (end.length() > 0) {
             return null;