diff --git a/docs/diagrams/BDD.png b/docs/diagrams/BDD.png
new file mode 100644
index 0000000000000000000000000000000000000000..bc98ff284996b21e0eef2c529af0062d66cd6f3d
Binary files /dev/null and b/docs/diagrams/BDD.png differ
diff --git a/docs/diagrams/Nodes.png b/docs/diagrams/Nodes.png
new file mode 100644
index 0000000000000000000000000000000000000000..95eae8fdadf165c28bd37c0b1752ae7dfa18136e
Binary files /dev/null and b/docs/diagrams/Nodes.png differ
diff --git a/docs/diagrams/TT.png b/docs/diagrams/TT.png
new file mode 100644
index 0000000000000000000000000000000000000000..e337b87899ff19f55a61f39930c5c82f7d373853
Binary files /dev/null and b/docs/diagrams/TT.png differ
diff --git a/docs/diagrams/Tree.png b/docs/diagrams/Tree.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e1ed238507797b89575853ec035989bd5b13115
Binary files /dev/null and b/docs/diagrams/Tree.png differ
diff --git a/metamodels/BDD.ecore b/metamodels/BDD.ecore
new file mode 100644
index 0000000000000000000000000000000000000000..69350fbd450a55e45775ea7ba17238af4ebddd35
--- /dev/null
+++ b/metamodels/BDD.ecore
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore">
+  <ecore:EPackage name="PrimitiveTypes">
+    <eClassifiers xsi:type="ecore:EDataType" name="String"/>
+    <eClassifiers xsi:type="ecore:EDataType" name="Boolean"/>
+  </ecore:EPackage>
+  <ecore:EPackage name="BDD">
+    <eClassifiers xsi:type="ecore:EClass" name="BDD">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="ports" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Port" containment="true" eOpposite="/1/Port/owner"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="tree" ordered="false" lowerBound="1" eType="/1/Tree" containment="true" eOpposite="/1/Tree/ownerBDD"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Port" abstract="true">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" ordered="false" unique="false" lowerBound="1" eType="/0/String"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="owner" ordered="false" lowerBound="1" eType="/1/BDD" eOpposite="/1/BDD/ports"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="InputPort" eSuperTypes="/1/Port">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="subtrees" ordered="false" upperBound="-1" eType="/1/Subtree" eOpposite="/1/Subtree/port"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="OutputPort" eSuperTypes="/1/Port">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="assignments" ordered="false" upperBound="-1" eType="/1/Assignment" eOpposite="/1/Assignment/port"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Tree" abstract="true">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="ownerBDD" ordered="false" eType="/1/BDD" eOpposite="/1/BDD/tree"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="ownerSubtreeForZero" ordered="false" eType="/1/Subtree" eOpposite="/1/Subtree/treeForZero"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="ownerSubtreeForOne" ordered="false" eType="/1/Subtree" eOpposite="/1/Subtree/treeForOne"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Leaf" eSuperTypes="/1/Tree">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="assignments" ordered="false" lowerBound="1" upperBound="-1" eType="/1/Assignment" containment="true" eOpposite="/1/Assignment/owner"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Assignment">
+      <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" ordered="false" unique="false" lowerBound="1" eType="/0/Boolean"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="port" ordered="false" lowerBound="1" eType="/1/OutputPort" eOpposite="/1/OutputPort/assignments"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="owner" ordered="false" lowerBound="1" eType="/1/Leaf" eOpposite="/1/Leaf/assignments"/>
+    </eClassifiers>
+    <eClassifiers xsi:type="ecore:EClass" name="Subtree" eSuperTypes="/1/Tree">
+      <eStructuralFeatures xsi:type="ecore:EReference" name="port" ordered="false" lowerBound="1" eType="/1/InputPort" eOpposite="/1/InputPort/subtrees"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="treeForZero" ordered="false" lowerBound="1" eType="/1/Tree" containment="true" eOpposite="/1/Tree/ownerSubtreeForZero"/>
+      <eStructuralFeatures xsi:type="ecore:EReference" name="treeForOne" ordered="false" lowerBound="1" eType="/1/Tree" containment="true" eOpposite="/1/Tree/ownerSubtreeForOne"/>
+    </eClassifiers>
+  </ecore:EPackage>
+</xmi:XMI>
diff --git a/metamodels/BDD.km3 b/metamodels/BDD.km3
new file mode 100644
index 0000000000000000000000000000000000000000..1f75c4271cb10fa8a6fb556f3e3fcb766b83c4ce
--- /dev/null
+++ b/metamodels/BDD.km3
@@ -0,0 +1,50 @@
+
+
+package BDD {
+
+   class BDD {
+      attribute name : String;
+      reference ports[1-*] container : Port oppositeOf owner;
+      reference tree container : Tree oppositeOf ownerBDD;
+   }
+
+   abstract class Port {
+      attribute name : String;
+      reference owner : BDD oppositeOf ports;
+   }
+
+   class InputPort extends Port {
+      reference subtrees[*] : Subtree oppositeOf port;
+   }
+
+   class OutputPort extends Port {
+      reference assignments[*] : Assignment oppositeOf port;
+   }
+
+   abstract class Tree {
+      reference ownerBDD[0-1] : BDD oppositeOf tree;
+      reference ownerSubtreeForZero[0-1] : Subtree oppositeOf treeForZero;
+      reference ownerSubtreeForOne[0-1] : Subtree oppositeOf treeForOne;
+   }
+
+   class Leaf extends Tree {
+      reference assignments[1-*] container : Assignment oppositeOf owner;
+   }
+
+   class Assignment {
+      attribute value : Boolean;
+      reference port : OutputPort oppositeOf assignments;
+      reference owner : Leaf oppositeOf assignments;
+   }
+
+   class Subtree extends Tree {
+      reference port : InputPort oppositeOf subtrees;
+      reference treeForZero container : Tree oppositeOf ownerSubtreeForZero;
+      reference treeForOne container : Tree oppositeOf ownerSubtreeForOne;
+   }
+}
+   
+package PrimitiveTypes {
+   datatype String;
+   datatype Boolean;
+}
diff --git a/models/OUT.bddmodel b/models/OUT.bddmodel
new file mode 100644
index 0000000000000000000000000000000000000000..26319428ab14c367af79965904f6f25eee1653f9
--- /dev/null
+++ b/models/OUT.bddmodel
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<BDD xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="BDD" name="Test">
+  <ports xsi:type="InputPort" name="a" subtrees="//@tree"/>
+  <ports xsi:type="InputPort" name="b" subtrees="//@tree/@treeForOne/@treeForZero //@tree/@treeForZero"/>
+  <ports xsi:type="InputPort" name="c" subtrees="//@tree/@treeForOne/@treeForZero/@treeForOne //@tree/@treeForZero/@treeForOne //@tree/@treeForOne/@treeForZero/@treeForZero"/>
+  <ports xsi:type="InputPort" name="d" subtrees="//@tree/@treeForOne //@tree/@treeForZero/@treeForOne/@treeForZero"/>
+  <ports xsi:type="OutputPort" name="s" assignments="//@tree/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForZero/@treeForOne/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForOne/@treeForZero/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForZero/@treeForOne/@assignments.0"/>
+  <tree xsi:type="Subtree" port="//@ports.0">
+    <treeForZero xsi:type="Subtree" port="//@ports.1">
+      <treeForZero xsi:type="Leaf">
+        <assignments value="false" port="//@ports.4"/>
+      </treeForZero>
+      <treeForOne xsi:type="Subtree" port="//@ports.2">
+        <treeForZero xsi:type="Subtree" port="//@ports.3">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForOne>
+        </treeForZero>
+        <treeForOne xsi:type="Leaf">
+          <assignments value="false" port="//@ports.4"/>
+        </treeForOne>
+      </treeForOne>
+    </treeForZero>
+    <treeForOne xsi:type="Subtree" port="//@ports.3">
+      <treeForZero xsi:type="Subtree" port="//@ports.1">
+        <treeForZero xsi:type="Subtree" port="//@ports.2">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForOne>
+        </treeForZero>
+        <treeForOne xsi:type="Subtree" port="//@ports.2">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForOne>
+        </treeForOne>
+      </treeForZero>
+      <treeForOne xsi:type="Leaf">
+        <assignments value="false" port="//@ports.4"/>
+      </treeForOne>
+    </treeForOne>
+  </tree>
+</BDD>
diff --git a/models/Test.bdd b/models/Test.bdd
new file mode 100644
index 0000000000000000000000000000000000000000..65bf5dca7274180d06959513b860a5c7ba45e61a
--- /dev/null
+++ b/models/Test.bdd
@@ -0,0 +1,27 @@
+bdd Test (in a, in b, in c, in d, out s) {
+  subtree a {
+    F:subtree b {
+        F:leaf s = F
+        T:subtree c {
+            F:subtree d {
+                F:leaf s = T
+                T:leaf s = F
+              }
+            T:leaf s = F
+          }
+      }
+    T:subtree d {
+        F:subtree b {
+            F:subtree c {
+                F:leaf s = F
+                T:leaf s = T
+              }
+            T:subtree c {
+                F:leaf s = T
+                T:leaf s = F
+              }
+          }
+        T:leaf s = F
+      }
+  }
+}
\ No newline at end of file
diff --git a/models/Test.bddmodel b/models/Test.bddmodel
new file mode 100644
index 0000000000000000000000000000000000000000..6ffe94e40fb5c1439c9b729837d9158526d90937
--- /dev/null
+++ b/models/Test.bddmodel
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<BDD xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="BDD" name="Test">
+  <ports xsi:type="InputPort" name="a" subtrees="//@tree"/>
+  <ports xsi:type="InputPort" name="b" subtrees="//@tree/@treeForOne/@treeForZero //@tree/@treeForZero"/>
+  <ports xsi:type="InputPort" name="c" subtrees="//@tree/@treeForOne/@treeForZero/@treeForOne //@tree/@treeForZero/@treeForOne //@tree/@treeForOne/@treeForZero/@treeForZero"/>
+  <ports xsi:type="InputPort" name="d" subtrees="//@tree/@treeForOne //@tree/@treeForZero/@treeForOne/@treeForZero"/>
+  <ports xsi:type="OutputPort" name="s" assignments="//@tree/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForZero/@treeForOne/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForOne/@treeForOne/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForZero/@treeForZero/@assignments.0 //@tree/@treeForZero/@treeForOne/@treeForZero/@treeForOne/@assignments.0 //@tree/@treeForOne/@treeForZero/@treeForOne/@treeForZero/@assignments.0"/>
+  <tree xsi:type="Subtree" port="//@ports.0">
+    <treeForZero xsi:type="Subtree" port="//@ports.1">
+      <treeForZero xsi:type="Leaf">
+        <assignments value="false" port="//@ports.4"/>
+      </treeForZero>
+      <treeForOne xsi:type="Subtree" port="//@ports.2">
+        <treeForZero xsi:type="Subtree" port="//@ports.3">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForOne>
+        </treeForZero>
+        <treeForOne xsi:type="Leaf">
+          <assignments value="false" port="//@ports.4"/>
+        </treeForOne>
+      </treeForOne>
+    </treeForZero>
+    <treeForOne xsi:type="Subtree" port="//@ports.3">
+      <treeForZero xsi:type="Subtree" port="//@ports.1">
+        <treeForZero xsi:type="Subtree" port="//@ports.2">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForOne>
+        </treeForZero>
+        <treeForOne xsi:type="Subtree" port="//@ports.2">
+          <treeForZero xsi:type="Leaf">
+            <assignments value="true" port="//@ports.4"/>
+          </treeForZero>
+          <treeForOne xsi:type="Leaf">
+            <assignments value="false" port="//@ports.4"/>
+          </treeForOne>
+        </treeForOne>
+      </treeForZero>
+      <treeForOne xsi:type="Leaf">
+        <assignments value="false" port="//@ports.4"/>
+      </treeForOne>
+    </treeForOne>
+  </tree>
+</BDD>
diff --git a/models/Test.tt b/models/Test.tt
new file mode 100644
index 0000000000000000000000000000000000000000..5dc021bdd8b1c34770ebe570d4c075cf4ef318f9
--- /dev/null
+++ b/models/Test.tt
@@ -0,0 +1,14 @@
+
+truth table Test (in a, in b, in c, in d, out s)
+{
+   {a=F, b=F,           s=F}
+   {a=F, b=T, c=F, d=F, s=T}
+   {a=F, b=T, c=F, d=T, s=F}
+   {a=F, b=T, c=T,      s=F}
+   {a=T, b=F, c=F, d=F, s=F}
+   {a=T, b=F, c=T, d=F, s=T}
+   {a=T, d=T,           s=F}
+   {a=T, b=T, c=F, d=F, s=T}
+   {a=T, b=T, c=T, d=F, s=F}
+}
+
diff --git a/models/Test.ttmodel b/models/Test.ttmodel
new file mode 100644
index 0000000000000000000000000000000000000000..9f3da5e374bb96648c7e6cb0e7ba4581308454a6
--- /dev/null
+++ b/models/Test.ttmodel
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<TruthTable xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="TT" location="2:1-13:2" name="Test">
+  <ports xsi:type="InputPort" location="2:19-2:23" name="a" cells="//@rows.0/@cells.0 //@rows.1/@cells.0 //@rows.2/@cells.0 //@rows.3/@cells.0 //@rows.4/@cells.0 //@rows.5/@cells.0 //@rows.6/@cells.0 //@rows.7/@cells.0 //@rows.8/@cells.0"/>
+  <ports xsi:type="InputPort" location="2:25-2:29" name="b" cells="//@rows.0/@cells.1 //@rows.1/@cells.1 //@rows.2/@cells.1 //@rows.3/@cells.1 //@rows.4/@cells.1 //@rows.5/@cells.1 //@rows.7/@cells.1 //@rows.8/@cells.1"/>
+  <ports xsi:type="InputPort" location="2:31-2:35" name="c" cells="//@rows.1/@cells.2 //@rows.2/@cells.2 //@rows.3/@cells.2 //@rows.4/@cells.2 //@rows.5/@cells.2 //@rows.7/@cells.2 //@rows.8/@cells.2"/>
+  <ports xsi:type="InputPort" location="2:37-2:41" name="d" cells="//@rows.1/@cells.3 //@rows.2/@cells.3 //@rows.4/@cells.3 //@rows.5/@cells.3 //@rows.6/@cells.1 //@rows.7/@cells.3 //@rows.8/@cells.3"/>
+  <ports xsi:type="OutputPort" location="2:43-2:48" name="s" cells="//@rows.0/@cells.2 //@rows.1/@cells.4 //@rows.2/@cells.4 //@rows.3/@cells.3 //@rows.4/@cells.4 //@rows.5/@cells.4 //@rows.6/@cells.2 //@rows.7/@cells.4 //@rows.8/@cells.4"/>
+  <rows location="4:4-4:29">
+    <cells location="4:5-4:8" value="false" port="//@ports.0"/>
+    <cells location="4:10-4:13" value="false" port="//@ports.1"/>
+    <cells location="4:25-4:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="5:4-5:29">
+    <cells location="5:5-5:8" value="false" port="//@ports.0"/>
+    <cells location="5:10-5:13" value="true" port="//@ports.1"/>
+    <cells location="5:15-5:18" value="false" port="//@ports.2"/>
+    <cells location="5:20-5:23" value="false" port="//@ports.3"/>
+    <cells location="5:25-5:28" value="true" port="//@ports.4"/>
+  </rows>
+  <rows location="6:4-6:29">
+    <cells location="6:5-6:8" value="false" port="//@ports.0"/>
+    <cells location="6:10-6:13" value="true" port="//@ports.1"/>
+    <cells location="6:15-6:18" value="false" port="//@ports.2"/>
+    <cells location="6:20-6:23" value="true" port="//@ports.3"/>
+    <cells location="6:25-6:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="7:4-7:29">
+    <cells location="7:5-7:8" value="false" port="//@ports.0"/>
+    <cells location="7:10-7:13" value="true" port="//@ports.1"/>
+    <cells location="7:15-7:18" value="true" port="//@ports.2"/>
+    <cells location="7:25-7:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="8:4-8:29">
+    <cells location="8:5-8:8" value="true" port="//@ports.0"/>
+    <cells location="8:10-8:13" value="false" port="//@ports.1"/>
+    <cells location="8:15-8:18" value="false" port="//@ports.2"/>
+    <cells location="8:20-8:23" value="false" port="//@ports.3"/>
+    <cells location="8:25-8:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="9:4-9:29">
+    <cells location="9:5-9:8" value="true" port="//@ports.0"/>
+    <cells location="9:10-9:13" value="false" port="//@ports.1"/>
+    <cells location="9:15-9:18" value="true" port="//@ports.2"/>
+    <cells location="9:20-9:23" value="false" port="//@ports.3"/>
+    <cells location="9:25-9:28" value="true" port="//@ports.4"/>
+  </rows>
+  <rows location="10:4-10:29">
+    <cells location="10:5-10:8" value="true" port="//@ports.0"/>
+    <cells location="10:10-10:13" value="true" port="//@ports.3"/>
+    <cells location="10:25-10:28" value="false" port="//@ports.4"/>
+  </rows>
+  <rows location="11:4-11:29">
+    <cells location="11:5-11:8" value="true" port="//@ports.0"/>
+    <cells location="11:10-11:13" value="true" port="//@ports.1"/>
+    <cells location="11:15-11:18" value="false" port="//@ports.2"/>
+    <cells location="11:20-11:23" value="false" port="//@ports.3"/>
+    <cells location="11:25-11:28" value="true" port="//@ports.4"/>
+  </rows>
+  <rows location="12:4-12:29">
+    <cells location="12:5-12:8" value="true" port="//@ports.0"/>
+    <cells location="12:10-12:13" value="true" port="//@ports.1"/>
+    <cells location="12:15-12:18" value="true" port="//@ports.2"/>
+    <cells location="12:20-12:23" value="false" port="//@ports.3"/>
+    <cells location="12:25-12:28" value="false" port="//@ports.4"/>
+  </rows>
+</TruthTable>