diff --git a/src/main/java/attacktrees/AttackNode.java b/src/main/java/attacktrees/AttackNode.java
index fd12ae3cff2b09fc8793106b833bd9c22067279f..ffcf9e0b1bb775cfec57c7b1854519d8240ae53c 100644
--- a/src/main/java/attacktrees/AttackNode.java
+++ b/src/main/java/attacktrees/AttackNode.java
@@ -87,6 +87,9 @@ public abstract class AttackNode extends AttackElement {
     public ArrayList<Attack> getInputAttacks() {
         return inputAttacks;
     }
+    public ArrayList<Integer> getInputValues() {
+        return inputValues;
+    }
 
     public void addInputAttack(Attack _attack, Integer _val) {
         inputAttacks.add(_attack);
diff --git a/src/main/java/ui/AttackTreePanel.java b/src/main/java/ui/AttackTreePanel.java
index 778c01e53828ffed3a90c3f887a9a116644ef930..f1fa1e2df4440df9b058774ed83084a47c098176 100644
--- a/src/main/java/ui/AttackTreePanel.java
+++ b/src/main/java/ui/AttackTreePanel.java
@@ -41,6 +41,7 @@
 
 package ui;
 
+import attacktrees.AttackTree;
 import myutil.GraphicLib;
 import ui.atd.AttackTreeDiagramPanel;
 import ui.atd.AttackTreeDiagramToolbar;
@@ -187,4 +188,6 @@ public class AttackTreePanel extends TURTLEPanel {
 
     }
 
+
+
 }
diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java
index c813bc093ae6b1f099a671ed7b0a8bb1ad6b0844..37325cddcb819a05973543fbeb9779a7a626c351 100644
--- a/src/main/java/ui/MainGUI.java
+++ b/src/main/java/ui/MainGUI.java
@@ -1883,6 +1883,25 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per
         return tabs.get(index);
     }
 
+    public void drawAttackTreeDiagram(AttackTree _at) {
+        DateFormat dateFormat = new SimpleDateFormat("_yyyyMMdd_HHmmss");
+        Date date = new Date();
+        String dateAndTime = dateFormat.format(date);
+        String tabName = "AttackTree_" + dateAndTime;
+        TraceManager.addDev("Drawing AttackTreee Spec in " + tabName);
+        TraceManager.addDev("Draw AT 1");
+        int index = createAttackTree(tabName);
+        TraceManager.addDev("Draw AT 2, in tab index=" + index);
+        AttackTreePanel atp = (AttackTreePanel) (tabs.elementAt(index));
+        TraceManager.addDev("Draw AT 3");
+        atp.addAttackTreeDiagram(tabName);
+        atp.atdp.drawable = false;
+        atp.atdp.drawFromAttackTreeModel(_at);
+        atp.atdp.drawable = true;
+        atp.atdp.repaint();
+        TraceManager.addDev("Draw AT 4");
+    }
+
     public void drawAvatarSpecification(AvatarSpecification av) {
         DateFormat dateFormat = new SimpleDateFormat("_yyyyMMdd_HHmmss");
         Date date = new Date();
diff --git a/src/main/java/ui/atd/AttackTreeDiagramPanel.java b/src/main/java/ui/atd/AttackTreeDiagramPanel.java
index 1565cad54391a509c1c236fe753623e9178a5a87..e7bdd1d97d660f28df2a27186b880198a3b73a67 100644
--- a/src/main/java/ui/atd/AttackTreeDiagramPanel.java
+++ b/src/main/java/ui/atd/AttackTreeDiagramPanel.java
@@ -43,13 +43,21 @@ package ui.atd;
 
 //import java.awt.*;
 
+import attacktrees.Attack;
+import attacktrees.AttackElement;
+import attacktrees.AttackNode;
+import attacktrees.AttackTree;
+import avatartranslator.AvatarElement;
+import avatartranslator.avatarucd.AvatarActor;
 import myutil.NameChecker;
+import myutil.TraceManager;
 import ui.*;
+import ui.ucd.TGConnectorInclude;
+import ui.ucd.TGConnectorUseCase;
+import ui.ucd.UCDActor;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.ListIterator;
+import java.awt.*;
+import java.util.*;
 
 //import org.w3c.dom.*;
 //import org.xml.sax.*;
@@ -167,5 +175,121 @@ public class AttackTreeDiagramPanel extends TDiagramPanel implements TDPWithAttr
 			componentList.add(tgc1);
 		}
 	}
+
+    public String drawFromAttackTreeModel(AttackTree _at)  {
+        Attack root = null;
+
+        // find the root attack
+        for(Attack att: _at.getAttacks()) {
+            if (att.isRoot()) {
+                root = att;
+                break;
+            }
+        }
+
+        if (root == null) {
+            return "No root attack";
+        }
+
+        HashMap<AttackElement, TGComponent> mapOfComponents = new HashMap<>();
+
+
+        return drawAttackFromAttackTreeModel(mapOfComponents, _at, root, null, -1, 600, 100, 1200);
+    }
+
+    public String drawAttackFromAttackTreeModel(HashMap<AttackElement, TGComponent> _mapOfComponents, AttackTree _at, Attack _att,
+                                                ATDConstraint _const, int _valueConst, int _x, int _y, int _length) {
+
+        // We draw the attack
+        ATDAttack attack = new ATDAttack(_x, _y, getMinX(), getMaxX(), getMinY(), getMaxY(), true, null, this);
+        attack.setValue(_att.getName());
+        addBuiltComponent(attack);
+        _mapOfComponents.put(_att, attack);
+
+        // If the constraint is non-null, we link the attack to the constraint
+        if (_const != null) {
+            TGConnectingPoint p1 = attack.closerFreeTGConnectingPoint(_const.getX(), _const.getY(), false, true);
+            TGConnectingPoint p2 = _const.closerFreeTGConnectingPoint(attack.getX(), attack.getY(), true, false);
+
+            if (p1 != null && p2 != null) {
+                p1.setFree(false);
+                p2.setFree(false);
+
+                TGConnector conn = null;
+                Vector<Point> points = new Vector<Point>();
+                conn = new ATDAttackConnector(0, 0, 0, 0, 0, 0, true, null,
+                        this, p1, p2, points);
+                if (_valueConst != -1) {
+                    conn.setValue("" + _valueConst);
+                }
+
+                if (conn != null) {
+                    addComponent(conn, 0, 0, false, true);
+                }
+            }
+        }
+
+        // We look for the constraint linked to this attack
+        AttackNode nextNode = null;
+        for(AttackNode node: _at.getAttackNodes()) {
+            if (node.getResultingAttack() == _att) {
+                nextNode = node;
+                break;
+            }
+        }
+
+        // Leaf attack?
+        if (nextNode == null) {
+            return null;
+        }
+
+        // We create the ATDConstraint
+        _y = _y + 70;
+        ATDConstraint constraint = new ATDConstraint(_x, _y, getMinX(), getMaxX(), getMinY(), getMaxY(), true, null, this);
+        constraint.setValue(nextNode.getName());
+        addBuiltComponent(constraint);
+        _mapOfComponents.put(nextNode, constraint);
+
+        TGConnectingPoint p1 = constraint.closerFreeTGConnectingPoint(attack.getX(), attack.getY(), false, true);
+        TGConnectingPoint p2 = attack.closerFreeTGConnectingPoint(constraint.getX(), constraint.getY(), true, false);
+
+        if (p1 != null && p2 != null) {
+            p1.setFree(false);
+            p2.setFree(false);
+
+            TGConnector conn = null;
+            Vector<Point> points = new Vector<Point>();
+            conn = new ATDAttackConnector(0, 0, 0, 0, 0, 0, true, null,
+                    this, p1, p2, points);
+            if (_valueConst != -1) {
+                conn.setValue("" + _valueConst);
+            }
+
+            if (conn != null) {
+                addComponent(conn, 0, 0, false, true);
+            }
+        }
+
+        // We now create all the sub attacks
+        int size = nextNode.getInputAttacks().size();
+        int currentBeg = _x - _length/2;
+        int slotSize = _length / size;
+        for(int i=0; i<size ; i++) {
+            Attack nextAttack = nextNode.getInputAttacks().get(i);
+            Integer nextValue = nextNode.getInputValues().get(i);
+
+            String s = drawAttackFromAttackTreeModel(_mapOfComponents, _at, nextAttack, constraint, nextValue, currentBeg+ slotSize/2 , _y+70,
+                    slotSize);
+            currentBeg += slotSize;
+
+            if (s != null) {
+                return s;
+            }
+
+        }
+
+
+        return null;
+    }
     
 }