Merge "OCL2AC to Henshin: util plug-in."
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/.classpath b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/.classpath
new file mode 100644
index 0000000..8a39664
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/.classpath
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
+		<accessrules>
+			<accessrule kind="accessible" pattern="&apos;de/unimarburg/swt/ocl2ac/**&apos;"/>
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+		<accessrules>
+			<accessrule kind="accessible" pattern="**/simplification/**"/>
+		</accessrules>
+	</classpathentry>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/.project b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/.project
new file mode 100644
index 0000000..5b9e0af
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>de.unimarburg.swt.ocl2ac.utils</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/META-INF/MANIFEST.MF b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..1cd99c3
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/META-INF/MANIFEST.MF
@@ -0,0 +1,23 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Utils
+Bundle-SymbolicName: de.unimarburg.swt.ocl2ac.utils;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: de.unimarburg.swt.ocl2ac.utils.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.emf.ecore;bundle-version="2.11.2",
+ org.eclipse.emf.henshin.model;bundle-version="1.4.0",
+ de.unimarburg.swt.ocl2ac.gc2ac;bundle-version="1.0.0",
+ org.eclipse.emf.henshin.editor,
+ org.eclipse.emf.henshin.interpreter;bundle-version="1.4.0",
+ de.unimarburg.swt.ocl2ac.model;bundle-version="1.0.0",
+ org.eclipse.emf.edit.ui;bundle-version="2.12.0",
+ org.eclipse.ui.ide;bundle-version="3.12.3",
+ org.apache.commons.io;bundle-version="2.2.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Bundle-ActivationPolicy: lazy
+Export-Package: de.unimarburg.swt.ocl2ac.utils.henshin.simplification,
+ de.unimarburg.swt.ocl2ac.utils.printer,
+ de.unimarburg.swt.ocl2ac.utils.viewer
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/build.properties b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/build.properties
new file mode 100644
index 0000000..619699d
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/build.properties
@@ -0,0 +1,9 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               icons/,\
+               supplementary/,\
+               pattern/,\
+               bin/
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/import.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/import.png
new file mode 100644
index 0000000..710385b
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/import.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/integrator-32.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/integrator-32.png
new file mode 100644
index 0000000..8e2a107
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/integrator-32.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/latex.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/latex.png
new file mode 100644
index 0000000..575c41a
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/latex.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/ocl2ac-32.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/ocl2ac-32.png
new file mode 100644
index 0000000..9af1da2
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/ocl2ac-32.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/ocl2ac16.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/ocl2ac16.png
new file mode 100644
index 0000000..895beb1
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/ocl2ac16.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/print1.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/print1.png
new file mode 100644
index 0000000..c2557ba
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/print1.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/print2.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/print2.png
new file mode 100644
index 0000000..c81fcd6
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/print2.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/printButton.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/printButton.png
new file mode 100644
index 0000000..5a22b3b
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/printButton.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/simplify.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/simplify.png
new file mode 100644
index 0000000..1822e77
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/simplify.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/translator.png b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/translator.png
new file mode 100644
index 0000000..16aa40d
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/icons/translator.png
Binary files differ
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/pattern/patterns.henshin b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/pattern/patterns.henshin
new file mode 100644
index 0000000..37cba53
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/pattern/patterns.henshin
@@ -0,0 +1,226 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<henshin:Module xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:henshin="http://www.eclipse.org/emf/2011/Henshin" xmi:id="_4SHVUE30EeiepIYRFpjorw">
+  <imports href="http://www.eclipse.org/emf/2011/Henshin#/"/>
+  <units xsi:type="henshin:Rule" xmi:id="_5MBY0E30EeiepIYRFpjorw" name="find_NC_GR_OR">
+    <parameters xmi:id="_VIzMwE31EeiepIYRFpjorw" name="paramNC" kind="OUT"/>
+    <parameters xmi:id="_VIzMwU31EeiepIYRFpjorw" name="paramG" kind="OUT"/>
+    <parameters xmi:id="_VIzMwk31EeiepIYRFpjorw" name="paramOR" kind="OUT"/>
+    <lhs xmi:id="_5MqSAE30EeiepIYRFpjorw" name="Lhs">
+      <nodes xmi:id="_GFCSoE31EeiepIYRFpjorw" name="paramNC" outgoing="_JdVEIE31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition"/>
+      </nodes>
+      <nodes xmi:id="_GrTocE31EeiepIYRFpjorw" name="paramG" incoming="_JdVEIE31EeiepIYRFpjorw" outgoing="_KYY-ME31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph"/>
+      </nodes>
+      <nodes xmi:id="_IfJkoE31EeiepIYRFpjorw" name="paramOR" incoming="_KYY-ME31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Or"/>
+      </nodes>
+      <edges xmi:id="_JdVEIE31EeiepIYRFpjorw" source="_GFCSoE31EeiepIYRFpjorw" target="_GrTocE31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition/conclusion"/>
+      </edges>
+      <edges xmi:id="_KYY-ME31EeiepIYRFpjorw" source="_GrTocE31EeiepIYRFpjorw" target="_IfJkoE31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph/formula"/>
+      </edges>
+    </lhs>
+    <rhs xmi:id="_5Mq5EE30EeiepIYRFpjorw" name="Rhs">
+      <nodes xmi:id="_GFCSoU31EeiepIYRFpjorw" name="paramNC" outgoing="_JdVEIU31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition"/>
+      </nodes>
+      <nodes xmi:id="_GrUPgE31EeiepIYRFpjorw" name="paramG" incoming="_JdVEIU31EeiepIYRFpjorw" outgoing="_KYY-MU31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph"/>
+      </nodes>
+      <nodes xmi:id="_IfJkoU31EeiepIYRFpjorw" name="paramOR" incoming="_KYY-MU31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Or"/>
+      </nodes>
+      <edges xmi:id="_JdVEIU31EeiepIYRFpjorw" source="_GFCSoU31EeiepIYRFpjorw" target="_GrUPgE31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition/conclusion"/>
+      </edges>
+      <edges xmi:id="_KYY-MU31EeiepIYRFpjorw" source="_GrUPgE31EeiepIYRFpjorw" target="_IfJkoU31EeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph/formula"/>
+      </edges>
+    </rhs>
+    <mappings xmi:id="_GFC5sE31EeiepIYRFpjorw" origin="_GFCSoE31EeiepIYRFpjorw" image="_GFCSoU31EeiepIYRFpjorw"/>
+    <mappings xmi:id="_GrUPgU31EeiepIYRFpjorw" origin="_GrTocE31EeiepIYRFpjorw" image="_GrUPgE31EeiepIYRFpjorw"/>
+    <mappings xmi:id="_IfJkok31EeiepIYRFpjorw" origin="_IfJkoE31EeiepIYRFpjorw" image="_IfJkoU31EeiepIYRFpjorw"/>
+  </units>
+  <units xsi:type="henshin:Rule" xmi:id="_AOvbkE4fEeiepIYRFpjorw" name="find_NC_GR_NOT_OR">
+    <parameters xmi:id="_AOvbkU4fEeiepIYRFpjorw" name="paramNC" kind="OUT"/>
+    <parameters xmi:id="_AOvbkk4fEeiepIYRFpjorw" name="paramG" kind="OUT"/>
+    <parameters xmi:id="_AOvbk04fEeiepIYRFpjorw" name="paramOR" kind="OUT"/>
+    <lhs xmi:id="_AOvblE4fEeiepIYRFpjorw" name="Lhs">
+      <nodes xmi:id="_AOvblU4fEeiepIYRFpjorw" name="paramNC" outgoing="_AOvbmE4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition"/>
+      </nodes>
+      <nodes xmi:id="_AOvblk4fEeiepIYRFpjorw" name="paramG" incoming="_AOvbmE4fEeiepIYRFpjorw" outgoing="_DsIIcE4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph"/>
+      </nodes>
+      <nodes xmi:id="_AOvbl04fEeiepIYRFpjorw" name="paramOR" incoming="_EJpx8E4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Or"/>
+      </nodes>
+      <nodes xmi:id="_DJOPsE4fEeiepIYRFpjorw" incoming="_DsIIcE4fEeiepIYRFpjorw" outgoing="_EJpx8E4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Not"/>
+      </nodes>
+      <edges xmi:id="_AOvbmE4fEeiepIYRFpjorw" source="_AOvblU4fEeiepIYRFpjorw" target="_AOvblk4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition/conclusion"/>
+      </edges>
+      <edges xmi:id="_DsIIcE4fEeiepIYRFpjorw" source="_AOvblk4fEeiepIYRFpjorw" target="_DJOPsE4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph/formula"/>
+      </edges>
+      <edges xmi:id="_EJpx8E4fEeiepIYRFpjorw" source="_DJOPsE4fEeiepIYRFpjorw" target="_AOvbl04fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//UnaryFormula/child"/>
+      </edges>
+    </lhs>
+    <rhs xmi:id="_AOvbmk4fEeiepIYRFpjorw" name="Rhs">
+      <nodes xmi:id="_AOvbm04fEeiepIYRFpjorw" name="paramNC" outgoing="_AOvbnk4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition"/>
+      </nodes>
+      <nodes xmi:id="_AOvbnE4fEeiepIYRFpjorw" name="paramG" incoming="_AOvbnk4fEeiepIYRFpjorw" outgoing="_DsIvgE4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph"/>
+      </nodes>
+      <nodes xmi:id="_AOvbnU4fEeiepIYRFpjorw" name="paramOR" incoming="_EJpx8U4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Or"/>
+      </nodes>
+      <nodes xmi:id="_DJO2wE4fEeiepIYRFpjorw" incoming="_DsIvgE4fEeiepIYRFpjorw" outgoing="_EJpx8U4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Not"/>
+      </nodes>
+      <edges xmi:id="_AOvbnk4fEeiepIYRFpjorw" source="_AOvbm04fEeiepIYRFpjorw" target="_AOvbnE4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition/conclusion"/>
+      </edges>
+      <edges xmi:id="_DsIvgE4fEeiepIYRFpjorw" source="_AOvbnE4fEeiepIYRFpjorw" target="_DJO2wE4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph/formula"/>
+      </edges>
+      <edges xmi:id="_EJpx8U4fEeiepIYRFpjorw" source="_DJO2wE4fEeiepIYRFpjorw" target="_AOvbnU4fEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//UnaryFormula/child"/>
+      </edges>
+    </rhs>
+    <mappings xmi:id="_AOvboE4fEeiepIYRFpjorw" origin="_AOvblU4fEeiepIYRFpjorw" image="_AOvbm04fEeiepIYRFpjorw"/>
+    <mappings xmi:id="_AOvboU4fEeiepIYRFpjorw" origin="_AOvblk4fEeiepIYRFpjorw" image="_AOvbnE4fEeiepIYRFpjorw"/>
+    <mappings xmi:id="_AOvbok4fEeiepIYRFpjorw" origin="_AOvbl04fEeiepIYRFpjorw" image="_AOvbnU4fEeiepIYRFpjorw"/>
+    <mappings xmi:id="_DJO2wU4fEeiepIYRFpjorw" origin="_DJOPsE4fEeiepIYRFpjorw" image="_DJO2wE4fEeiepIYRFpjorw"/>
+  </units>
+  <units xsi:type="henshin:Rule" xmi:id="_1rD6EE4hEeiepIYRFpjorw" name="find_NotNot">
+    <parameters xmi:id="_CWN-EE4iEeiepIYRFpjorw" name="outerNot" kind="OUT"/>
+    <parameters xmi:id="_CWN-EU4iEeiepIYRFpjorw" name="innerNot" kind="OUT"/>
+    <lhs xmi:id="_1rFIME4hEeiepIYRFpjorw" name="Lhs">
+      <nodes xmi:id="_5__6AE4hEeiepIYRFpjorw" name="outerNot" outgoing="_8ZjLUE4hEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Not"/>
+      </nodes>
+      <nodes xmi:id="_7yNegE4hEeiepIYRFpjorw" name="innerNot" incoming="_8ZjLUE4hEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Not"/>
+      </nodes>
+      <edges xmi:id="_8ZjLUE4hEeiepIYRFpjorw" source="_5__6AE4hEeiepIYRFpjorw" target="_7yNegE4hEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//UnaryFormula/child"/>
+      </edges>
+    </lhs>
+    <rhs xmi:id="_1rFIMU4hEeiepIYRFpjorw" name="Rhs">
+      <nodes xmi:id="_5__6AU4hEeiepIYRFpjorw" name="outerNot" outgoing="_8ZjLUU4hEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Not"/>
+      </nodes>
+      <nodes xmi:id="_7yNegU4hEeiepIYRFpjorw" name="innerNot" incoming="_8ZjLUU4hEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Not"/>
+      </nodes>
+      <edges xmi:id="_8ZjLUU4hEeiepIYRFpjorw" source="_5__6AU4hEeiepIYRFpjorw" target="_7yNegU4hEeiepIYRFpjorw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//UnaryFormula/child"/>
+      </edges>
+    </rhs>
+    <mappings xmi:id="_5__6Ak4hEeiepIYRFpjorw" origin="_5__6AE4hEeiepIYRFpjorw" image="_5__6AU4hEeiepIYRFpjorw"/>
+    <mappings xmi:id="_7yNegk4hEeiepIYRFpjorw" origin="_7yNegE4hEeiepIYRFpjorw" image="_7yNegU4hEeiepIYRFpjorw"/>
+  </units>
+  <units xsi:type="henshin:Rule" xmi:id="_dLaJoE-oEei34uiBkjGJBw" name="find_NC_GR_AND">
+    <parameters xmi:id="_dLaJoU-oEei34uiBkjGJBw" name="paramNC" kind="OUT"/>
+    <parameters xmi:id="_dLaJok-oEei34uiBkjGJBw" name="paramG" kind="OUT"/>
+    <parameters xmi:id="_f8LoIE-oEei34uiBkjGJBw" name="paramAND" kind="OUT"/>
+    <lhs xmi:id="_dLaJpE-oEei34uiBkjGJBw" name="Lhs">
+      <nodes xmi:id="_dLaJpU-oEei34uiBkjGJBw" name="paramNC" outgoing="_dLaJqE-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition"/>
+      </nodes>
+      <nodes xmi:id="_dLaJpk-oEei34uiBkjGJBw" name="paramG" incoming="_dLaJqE-oEei34uiBkjGJBw" outgoing="_dLaJqU-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph"/>
+      </nodes>
+      <nodes xmi:id="_dLaJp0-oEei34uiBkjGJBw" name="paramAND" incoming="_dLaJqU-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//And"/>
+      </nodes>
+      <edges xmi:id="_dLaJqE-oEei34uiBkjGJBw" source="_dLaJpU-oEei34uiBkjGJBw" target="_dLaJpk-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition/conclusion"/>
+      </edges>
+      <edges xmi:id="_dLaJqU-oEei34uiBkjGJBw" source="_dLaJpk-oEei34uiBkjGJBw" target="_dLaJp0-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph/formula"/>
+      </edges>
+    </lhs>
+    <rhs xmi:id="_dLaJqk-oEei34uiBkjGJBw" name="Rhs">
+      <nodes xmi:id="_dLaJq0-oEei34uiBkjGJBw" name="paramNC" outgoing="_dLaJrk-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition"/>
+      </nodes>
+      <nodes xmi:id="_dLaJrE-oEei34uiBkjGJBw" name="paramG" incoming="_dLaJrk-oEei34uiBkjGJBw" outgoing="_dLaJr0-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph"/>
+      </nodes>
+      <nodes xmi:id="_dLaJrU-oEei34uiBkjGJBw" name="paramAND" incoming="_dLaJr0-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//And"/>
+      </nodes>
+      <edges xmi:id="_dLaJrk-oEei34uiBkjGJBw" source="_dLaJq0-oEei34uiBkjGJBw" target="_dLaJrE-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition/conclusion"/>
+      </edges>
+      <edges xmi:id="_dLaJr0-oEei34uiBkjGJBw" source="_dLaJrE-oEei34uiBkjGJBw" target="_dLaJrU-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph/formula"/>
+      </edges>
+    </rhs>
+    <mappings xmi:id="_dLaJsE-oEei34uiBkjGJBw" origin="_dLaJpU-oEei34uiBkjGJBw" image="_dLaJq0-oEei34uiBkjGJBw"/>
+    <mappings xmi:id="_dLaJsU-oEei34uiBkjGJBw" origin="_dLaJpk-oEei34uiBkjGJBw" image="_dLaJrE-oEei34uiBkjGJBw"/>
+    <mappings xmi:id="_dLaJsk-oEei34uiBkjGJBw" origin="_dLaJp0-oEei34uiBkjGJBw" image="_dLaJrU-oEei34uiBkjGJBw"/>
+  </units>
+  <units xsi:type="henshin:Rule" xmi:id="_j-8S8E-oEei34uiBkjGJBw" name="find_NC_GR_NOT_AND">
+    <parameters xmi:id="_j-8S8U-oEei34uiBkjGJBw" name="paramNC" kind="OUT"/>
+    <parameters xmi:id="_j-8S8k-oEei34uiBkjGJBw" name="paramG" kind="OUT"/>
+    <parameters xmi:id="_m16gEE-oEei34uiBkjGJBw" name="paramAND" kind="OUT"/>
+    <lhs xmi:id="_j-8S9E-oEei34uiBkjGJBw" name="Lhs">
+      <nodes xmi:id="_j-8S9U-oEei34uiBkjGJBw" name="paramNC" outgoing="_j-8S-U-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition"/>
+      </nodes>
+      <nodes xmi:id="_j-8S9k-oEei34uiBkjGJBw" name="paramG" incoming="_j-8S-U-oEei34uiBkjGJBw" outgoing="_j-8S-k-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph"/>
+      </nodes>
+      <nodes xmi:id="_j-8S90-oEei34uiBkjGJBw" name="paramAND" incoming="_j-8S-0-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//And"/>
+      </nodes>
+      <nodes xmi:id="_j-8S-E-oEei34uiBkjGJBw" incoming="_j-8S-k-oEei34uiBkjGJBw" outgoing="_j-8S-0-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Not"/>
+      </nodes>
+      <edges xmi:id="_j-8S-U-oEei34uiBkjGJBw" source="_j-8S9U-oEei34uiBkjGJBw" target="_j-8S9k-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition/conclusion"/>
+      </edges>
+      <edges xmi:id="_j-8S-k-oEei34uiBkjGJBw" source="_j-8S9k-oEei34uiBkjGJBw" target="_j-8S-E-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph/formula"/>
+      </edges>
+      <edges xmi:id="_j-8S-0-oEei34uiBkjGJBw" source="_j-8S-E-oEei34uiBkjGJBw" target="_j-8S90-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//UnaryFormula/child"/>
+      </edges>
+    </lhs>
+    <rhs xmi:id="_j-8S_E-oEei34uiBkjGJBw" name="Rhs">
+      <nodes xmi:id="_j-8S_U-oEei34uiBkjGJBw" name="paramNC" outgoing="_j-8TAU-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition"/>
+      </nodes>
+      <nodes xmi:id="_j-8S_k-oEei34uiBkjGJBw" name="paramG" incoming="_j-8TAU-oEei34uiBkjGJBw" outgoing="_j-8TAk-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph"/>
+      </nodes>
+      <nodes xmi:id="_j-8S_0-oEei34uiBkjGJBw" name="paramAND" incoming="_j-8TA0-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//And"/>
+      </nodes>
+      <nodes xmi:id="_j-8TAE-oEei34uiBkjGJBw" incoming="_j-8TAk-oEei34uiBkjGJBw" outgoing="_j-8TA0-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Not"/>
+      </nodes>
+      <edges xmi:id="_j-8TAU-oEei34uiBkjGJBw" source="_j-8S_U-oEei34uiBkjGJBw" target="_j-8S_k-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//NestedCondition/conclusion"/>
+      </edges>
+      <edges xmi:id="_j-8TAk-oEei34uiBkjGJBw" source="_j-8S_k-oEei34uiBkjGJBw" target="_j-8TAE-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//Graph/formula"/>
+      </edges>
+      <edges xmi:id="_j-8TA0-oEei34uiBkjGJBw" source="_j-8TAE-oEei34uiBkjGJBw" target="_j-8S_0-oEei34uiBkjGJBw">
+        <type href="http://www.eclipse.org/emf/2011/Henshin#//UnaryFormula/child"/>
+      </edges>
+    </rhs>
+    <mappings xmi:id="_j-8TBE-oEei34uiBkjGJBw" origin="_j-8S9U-oEei34uiBkjGJBw" image="_j-8S_U-oEei34uiBkjGJBw"/>
+    <mappings xmi:id="_j-8TBU-oEei34uiBkjGJBw" origin="_j-8S9k-oEei34uiBkjGJBw" image="_j-8S_k-oEei34uiBkjGJBw"/>
+    <mappings xmi:id="_j-8TBk-oEei34uiBkjGJBw" origin="_j-8S90-oEei34uiBkjGJBw" image="_j-8S_0-oEei34uiBkjGJBw"/>
+    <mappings xmi:id="_j-8TB0-oEei34uiBkjGJBw" origin="_j-8S-E-oEei34uiBkjGJBw" image="_j-8TAE-oEei34uiBkjGJBw"/>
+  </units>
+</henshin:Module>
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/pattern/patterns.henshin_diagram b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/pattern/patterns.henshin_diagram
new file mode 100644
index 0000000..c58fc33
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/pattern/patterns.henshin_diagram
@@ -0,0 +1,321 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<notation:Diagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:henshin="http://www.eclipse.org/emf/2011/Henshin" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmi:id="_UW5sUE7SEei7O4rItkntnw" type="Henshin" measurementUnit="Pixel">
+  <children xmi:type="notation:Shape" xmi:id="_UhAqkE7SEei7O4rItkntnw" type="2001" fontName="Segoe UI" italic="true" lineColor="0">
+    <children xmi:type="notation:DecorationNode" xmi:id="_UhAqkk7SEei7O4rItkntnw" type="5001"/>
+    <children xmi:type="notation:DecorationNode" xmi:id="_UhAqk07SEei7O4rItkntnw" type="7001">
+      <children xmi:type="notation:Shape" xmi:id="_UhxfkE7SEei7O4rItkntnw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_Uhxfkk7SEei7O4rItkntnw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_Uhxfk07SEei7O4rItkntnw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UhxflE7SEei7O4rItkntnw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_UhxflU7SEei7O4rItkntnw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_Uhxflk7SEei7O4rItkntnw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_GFCSoE31EeiepIYRFpjorw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UhxfkU7SEei7O4rItkntnw"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_Uhxfl07SEei7O4rItkntnw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_UhxfmU7SEei7O4rItkntnw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_Uhxfmk7SEei7O4rItkntnw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_Uhxfm07SEei7O4rItkntnw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_UhxfnE7SEei7O4rItkntnw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_UhxfnU7SEei7O4rItkntnw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_GrTocE31EeiepIYRFpjorw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UhxfmE7SEei7O4rItkntnw" x="252" y="5"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_Uhxfnk7SEei7O4rItkntnw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_UhxfoE7SEei7O4rItkntnw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UhxfoU7SEei7O4rItkntnw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_Uhxfok7SEei7O4rItkntnw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_Uhxfo07SEei7O4rItkntnw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_UhxfpE7SEei7O4rItkntnw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_IfJkoE31EeiepIYRFpjorw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Uhxfn07SEei7O4rItkntnw" x="416" y="5"/>
+      </children>
+    </children>
+    <element xmi:type="henshin:Rule" href="patterns.henshin#_5MBY0E30EeiepIYRFpjorw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UhAqkU7SEei7O4rItkntnw" y="88" width="524" height="93"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_UhGxME7SEei7O4rItkntnw" type="2001" fontName="Segoe UI" italic="true" lineColor="0">
+    <children xmi:type="notation:DecorationNode" xmi:id="_UhGxMk7SEei7O4rItkntnw" type="5001"/>
+    <children xmi:type="notation:DecorationNode" xmi:id="_UhGxM07SEei7O4rItkntnw" type="7001">
+      <children xmi:type="notation:Shape" xmi:id="_UjA1sE7SEei7O4rItkntnw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1sk7SEei7O4rItkntnw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1s07SEei7O4rItkntnw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1tE7SEei7O4rItkntnw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_UjA1tU7SEei7O4rItkntnw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_UjA1tk7SEei7O4rItkntnw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_AOvblU4fEeiepIYRFpjorw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UjA1sU7SEei7O4rItkntnw" x="12" y="16"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_UjA1t07SEei7O4rItkntnw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1uU7SEei7O4rItkntnw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1uk7SEei7O4rItkntnw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1u07SEei7O4rItkntnw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_UjA1vE7SEei7O4rItkntnw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_UjA1vU7SEei7O4rItkntnw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_AOvblk4fEeiepIYRFpjorw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UjA1uE7SEei7O4rItkntnw" x="241" y="16"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_UjA1vk7SEei7O4rItkntnw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1wE7SEei7O4rItkntnw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1wU7SEei7O4rItkntnw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1wk7SEei7O4rItkntnw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_UjA1w07SEei7O4rItkntnw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_UjA1xE7SEei7O4rItkntnw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_AOvbl04fEeiepIYRFpjorw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UjA1v07SEei7O4rItkntnw" x="569" y="6"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_UjA1xU7SEei7O4rItkntnw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1x07SEei7O4rItkntnw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1yE7SEei7O4rItkntnw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjA1yU7SEei7O4rItkntnw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_UjA1yk7SEei7O4rItkntnw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_UjA1y07SEei7O4rItkntnw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_DJOPsE4fEeiepIYRFpjorw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UjA1xk7SEei7O4rItkntnw" x="427" y="16"/>
+      </children>
+    </children>
+    <element xmi:type="henshin:Rule" href="patterns.henshin#_AOvbkE4fEeiepIYRFpjorw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UhGxMU7SEei7O4rItkntnw" y="193" width="657" height="110"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_UhGxNE7SEei7O4rItkntnw" type="2001" fontName="Segoe UI" italic="true" lineColor="0">
+    <children xmi:type="notation:DecorationNode" xmi:id="_UhGxNk7SEei7O4rItkntnw" type="5001"/>
+    <children xmi:type="notation:DecorationNode" xmi:id="_UhGxN07SEei7O4rItkntnw" type="7001">
+      <children xmi:type="notation:Shape" xmi:id="_UjNDBU7SEei7O4rItkntnw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjNDB07SEei7O4rItkntnw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjNDCE7SEei7O4rItkntnw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjNDCU7SEei7O4rItkntnw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_UjNDCk7SEei7O4rItkntnw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_UjNDC07SEei7O4rItkntnw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_5__6AE4hEeiepIYRFpjorw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UjNDBk7SEei7O4rItkntnw"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_UjNDDE7SEei7O4rItkntnw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjNDDk7SEei7O4rItkntnw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjNDD07SEei7O4rItkntnw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_UjNDEE7SEei7O4rItkntnw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_UjNDEU7SEei7O4rItkntnw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_UjNDEk7SEei7O4rItkntnw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_7yNegE4hEeiepIYRFpjorw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UjNDDU7SEei7O4rItkntnw" x="182" y="8"/>
+      </children>
+    </children>
+    <element xmi:type="henshin:Rule" href="patterns.henshin#_1rD6EE4hEeiepIYRFpjorw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UhGxNU7SEei7O4rItkntnw" y="318"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_dLZikE-oEei34uiBkjGJBw" type="2001" fontName="Segoe UI" italic="true" lineColor="0">
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLZikU-oEei34uiBkjGJBw" type="5001"/>
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLZikk-oEei34uiBkjGJBw" type="7001">
+      <children xmi:type="notation:Shape" xmi:id="_dLZik0-oEei34uiBkjGJBw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_dLZilE-oEei34uiBkjGJBw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_dLZilU-oEei34uiBkjGJBw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_dLZilk-oEei34uiBkjGJBw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_dLZil0-oEei34uiBkjGJBw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_dLZimE-oEei34uiBkjGJBw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_dLaJpU-oEei34uiBkjGJBw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dLZimU-oEei34uiBkjGJBw"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_dLZimk-oEei34uiBkjGJBw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_dLZim0-oEei34uiBkjGJBw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_dLZinE-oEei34uiBkjGJBw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_dLZinU-oEei34uiBkjGJBw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_dLZink-oEei34uiBkjGJBw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_dLZin0-oEei34uiBkjGJBw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_dLaJpk-oEei34uiBkjGJBw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dLZioE-oEei34uiBkjGJBw" x="252" y="5"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_dLZioU-oEei34uiBkjGJBw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_dLZiok-oEei34uiBkjGJBw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_dLZio0-oEei34uiBkjGJBw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_dLZipE-oEei34uiBkjGJBw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_dLZipU-oEei34uiBkjGJBw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_dLZipk-oEei34uiBkjGJBw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_dLaJp0-oEei34uiBkjGJBw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dLZip0-oEei34uiBkjGJBw" x="416" y="5"/>
+      </children>
+    </children>
+    <element xmi:type="henshin:Rule" href="patterns.henshin#_dLaJoE-oEei34uiBkjGJBw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_dLZiqE-oEei34uiBkjGJBw" x="15" y="594" width="524" height="93"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_j-7r4E-oEei34uiBkjGJBw" type="2001" fontName="Segoe UI" italic="true" lineColor="0">
+    <children xmi:type="notation:DecorationNode" xmi:id="_j-7r4U-oEei34uiBkjGJBw" type="5001"/>
+    <children xmi:type="notation:DecorationNode" xmi:id="_j-7r4k-oEei34uiBkjGJBw" type="7001">
+      <children xmi:type="notation:Shape" xmi:id="_j-7r40-oEei34uiBkjGJBw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r5E-oEei34uiBkjGJBw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r5U-oEei34uiBkjGJBw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r5k-oEei34uiBkjGJBw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_j-7r50-oEei34uiBkjGJBw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_j-7r6E-oEei34uiBkjGJBw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_j-8S9U-oEei34uiBkjGJBw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_j-7r6U-oEei34uiBkjGJBw" x="12" y="16"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_j-7r6k-oEei34uiBkjGJBw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r60-oEei34uiBkjGJBw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r7E-oEei34uiBkjGJBw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r7U-oEei34uiBkjGJBw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_j-7r7k-oEei34uiBkjGJBw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_j-7r70-oEei34uiBkjGJBw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_j-8S9k-oEei34uiBkjGJBw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_j-7r8E-oEei34uiBkjGJBw" x="241" y="16"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_j-7r8U-oEei34uiBkjGJBw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r8k-oEei34uiBkjGJBw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r80-oEei34uiBkjGJBw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r9E-oEei34uiBkjGJBw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_j-7r9U-oEei34uiBkjGJBw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_j-7r9k-oEei34uiBkjGJBw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_j-8S90-oEei34uiBkjGJBw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_j-7r90-oEei34uiBkjGJBw" x="603" y="11"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_j-7r-E-oEei34uiBkjGJBw" type="3001" fontName="Segoe UI">
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r-U-oEei34uiBkjGJBw" type="5002"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r-k-oEei34uiBkjGJBw" type="5003"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_j-7r-0-oEei34uiBkjGJBw" type="7002">
+          <styles xmi:type="notation:SortingStyle" xmi:id="_j-7r_E-oEei34uiBkjGJBw"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_j-7r_U-oEei34uiBkjGJBw"/>
+        </children>
+        <element xmi:type="henshin:Node" href="patterns.henshin#_j-8S-E-oEei34uiBkjGJBw"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_j-7r_k-oEei34uiBkjGJBw" x="439" y="16"/>
+      </children>
+    </children>
+    <element xmi:type="henshin:Rule" href="patterns.henshin#_j-8S8E-oEei34uiBkjGJBw"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_j-7r_0-oEei34uiBkjGJBw" x="23" y="735" width="723" height="110"/>
+  </children>
+  <styles xmi:type="notation:DiagramStyle" xmi:id="_UW5sUU7SEei7O4rItkntnw"/>
+  <element xmi:type="henshin:Module" href="patterns.henshin#_4SHVUE30EeiepIYRFpjorw"/>
+  <edges xmi:type="notation:Connector" xmi:id="_UjZQME7SEei7O4rItkntnw" type="4001" source="_UjNDBU7SEei7O4rItkntnw" target="_UjNDDE7SEei7O4rItkntnw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_UjZQM07SEei7O4rItkntnw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_UjZQNE7SEei7O4rItkntnw" x="-5" y="-9"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_UjZQNU7SEei7O4rItkntnw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_UjZQNk7SEei7O4rItkntnw" x="-2" y="19"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_UjZQMU7SEei7O4rItkntnw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_8ZjLUE4hEeiepIYRFpjorw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_UjZQMk7SEei7O4rItkntnw" points="[9, 21, 0, 11]$[0, -11, -9, -21]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_dLuSsE-oEei34uiBkjGJBw" type="4001" source="_UhxfkE7SEei7O4rItkntnw" target="_Uhxfl07SEei7O4rItkntnw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLuSs0-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_dLuStE-oEei34uiBkjGJBw" y="40"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLu5wE-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_dLu5wU-oEei34uiBkjGJBw" y="60"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_dLuSsU-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_JdVEIE31EeiepIYRFpjorw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_dLuSsk-oEei34uiBkjGJBw" points="[74, 5, -144, 0]$[178, 0, -40, -5]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_dLvg0E-oEei34uiBkjGJBw" type="4001" source="_Uhxfl07SEei7O4rItkntnw" target="_Uhxfnk7SEei7O4rItkntnw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLvg00-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_dLvg1E-oEei34uiBkjGJBw" y="40"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLvg1U-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_dLwH4E-oEei34uiBkjGJBw" y="60"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_dLvg0U-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_KYY-ME31EeiepIYRFpjorw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_dLvg0k-oEei34uiBkjGJBw" points="[41, 0, -118, 0]$[124, 0, -35, 0]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_dLwu8E-oEei34uiBkjGJBw" type="4001" source="_dLZik0-oEei34uiBkjGJBw" target="_dLZimk-oEei34uiBkjGJBw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLwu80-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_dLwu9E-oEei34uiBkjGJBw" x="-2" y="-14"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLwu9U-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_dLwu9k-oEei34uiBkjGJBw" x="-4" y="13"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_dLwu8U-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_dLaJqE-oEei34uiBkjGJBw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_dLwu8k-oEei34uiBkjGJBw" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_dLxWAE-oEei34uiBkjGJBw" type="4001" source="_dLZimk-oEei34uiBkjGJBw" target="_dLZioU-oEei34uiBkjGJBw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLx9EE-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_dLx9EU-oEei34uiBkjGJBw" x="2" y="-6"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_dLx9Ek-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_dLx9E0-oEei34uiBkjGJBw" x="1" y="13"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_dLxWAU-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_dLaJqU-oEei34uiBkjGJBw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_dLxWAk-oEei34uiBkjGJBw" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_j_BygE-oEei34uiBkjGJBw" type="4001" source="_UjA1sE7SEei7O4rItkntnw" target="_UjA1t07SEei7O4rItkntnw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_Byg0-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_ByhE-oEei34uiBkjGJBw" y="40"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_ByhU-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_Byhk-oEei34uiBkjGJBw" y="60"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_j_BygU-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_AOvbmE4fEeiepIYRFpjorw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_j_Bygk-oEei34uiBkjGJBw" points="[74, 0, -121, 0]$[155, 0, -40, 0]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_j_CZkE-oEei34uiBkjGJBw" type="4001" source="_UjA1t07SEei7O4rItkntnw" target="_UjA1xU7SEei7O4rItkntnw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_CZk0-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_CZlE-oEei34uiBkjGJBw" y="40"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_CZlU-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_CZlk-oEei34uiBkjGJBw" y="60"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_j_CZkU-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_DsIIcE4fEeiepIYRFpjorw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_j_CZkk-oEei34uiBkjGJBw" points="[41, 0, -135, 0]$[146, 0, -30, 0]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_j_DAoE-oEei34uiBkjGJBw" type="4001" source="_UjA1xU7SEei7O4rItkntnw" target="_UjA1vk7SEei7O4rItkntnw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_DAo0-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_DApE-oEei34uiBkjGJBw" y="40"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_DApU-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_DApk-oEei34uiBkjGJBw" y="60"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_j_DAoU-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_EJpx8E4fEeiepIYRFpjorw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_j_DAok-oEei34uiBkjGJBw" points="[31, -3, -116, 7]$[112, -8, -35, 2]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_j_H5IE-oEei34uiBkjGJBw" type="4001" source="_j-7r40-oEei34uiBkjGJBw" target="_j-7r6k-oEei34uiBkjGJBw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_IgME-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_IgMU-oEei34uiBkjGJBw" x="-3" y="-14"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_IgMk-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_IgM0-oEei34uiBkjGJBw" x="-3" y="13"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_j_H5IU-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_j-8S-U-oEei34uiBkjGJBw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_j_H5Ik-oEei34uiBkjGJBw" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_j_JHQE-oEei34uiBkjGJBw" type="4001" source="_j-7r6k-oEei34uiBkjGJBw" target="_j-7r-E-oEei34uiBkjGJBw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_JHQ0-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_JHRE-oEei34uiBkjGJBw" x="-1" y="-19"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_JHRU-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_JHRk-oEei34uiBkjGJBw" x="1" y="13"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_j_JHQU-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_j-8S-k-oEei34uiBkjGJBw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_j_JHQk-oEei34uiBkjGJBw" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+  </edges>
+  <edges xmi:type="notation:Connector" xmi:id="_j_JuUE-oEei34uiBkjGJBw" type="4001" source="_j-7r-E-oEei34uiBkjGJBw" target="_j-7r8U-oEei34uiBkjGJBw">
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_JuU0-oEei34uiBkjGJBw" type="6001">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_JuVE-oEei34uiBkjGJBw" x="-3" y="-9"/>
+    </children>
+    <children xmi:type="notation:DecorationNode" xmi:id="_j_JuVU-oEei34uiBkjGJBw" type="6002">
+      <layoutConstraint xmi:type="notation:Location" xmi:id="_j_JuVk-oEei34uiBkjGJBw" x="3" y="18"/>
+    </children>
+    <styles xmi:type="notation:FontStyle" xmi:id="_j_JuUU-oEei34uiBkjGJBw" fontName="Segoe UI"/>
+    <element xmi:type="henshin:Edge" href="patterns.henshin#_j-8S-0-oEei34uiBkjGJBw"/>
+    <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_j_JuUk-oEei34uiBkjGJBw" points="[0, 0, 0, 0]$[0, 0, 0, 0]"/>
+  </edges>
+</notation:Diagram>
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/plugin.xml b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/plugin.xml
new file mode 100644
index 0000000..ccc2205
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/plugin.xml
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            id="de.unimarburg.swt.ocl2ac.objectContribution1"
+            objectClass="nestedcondition.NestedConstraint">
+         <menu
+               icon="icons/ocl2ac16.png"
+               id="ocl2ac.ngc.menu1"
+               label="OCL2AC_Nested Graph Constraints"
+               path="additions">
+            <separator
+                  name="main">
+            </separator>
+         </menu>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.NGCLaxGenerationActionLongVersion"
+               icon="icons/latex.png"
+               id="ocl2ac.action.GenGCLV"
+               label="Generating Latex File for Presenting Graph Constraint (Long Version)"
+               menubarPath="ocl2ac.ngc.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.NGCLaxGenerationActionShortVersion"
+               icon="icons/latex.png"
+               id="ocl2ac.action.GenGCSV"
+               label="Generating Latex File for Presenting Graph Constraint (Short Version)"
+               menubarPath="ocl2ac.ngc.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.NGCPrintViewActionLongVersion"
+               icon="icons/print1.png"
+               id="ocl2ac.action.printnestedconstraint"
+               label="Print and View Nested Graph Constraint (Long Version)"
+               menubarPath="ocl2ac.ngc.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.NGCPrintViewActionShortVersion"
+               icon="icons/print1.png"
+               id="ocl2ac.action.printnestedconstraint"
+               label="Print and View Nested Graph Constraint (Short Version)"
+               menubarPath="ocl2ac.ngc.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.NGCPrintOpenActionLongVersion"
+               icon="icons/print2.png"
+               id="ocl2ac.action.printnestedconstraintOpLV"
+               label="Print and Open Nested Graph Constraint (Long Version)"
+               menubarPath="ocl2ac.ngc.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.NGCPrintOpenActionShortVersion"
+               icon="icons/print2.png"
+               id="ocl2ac.action.printnestedconstraintOpSV"
+               label="Print and Open Nested Graph Constraint (Short Version)"
+               menubarPath="ocl2ac.ngc.menu1/main"
+               style="push">
+         </action>
+      </objectContribution>
+   </extension>
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            id="henshin.popupmenu.objectcontribution"
+            objectClass="org.eclipse.emf.henshin.model.Rule">
+         <menu
+               icon="icons/ocl2ac16.png"
+               id="henshin.menu1"
+               label="OCL2AC_Henshin"
+               path="additions">
+            <separator
+                  name="main">
+            </separator>
+         </menu>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.HenshinNACLaxGenerationActionLongVersion"
+               enablesFor="1"
+               icon="icons/latex.png"
+               id="henshin.action.nac.GenACLV"
+               label="Generating Latex File for Presenting Application Condition (Long Version)"
+               menubarPath="henshin.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.HenshinNACLaxGenerationActionShortVersion"
+               enablesFor="1"
+               icon="icons/latex.png"
+               id="henshin.action.nac.GenACSV"
+               label="Generating Latex File for Presenting Application Condition (Short Version)"
+               menubarPath="henshin.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.HenshinNACPrintViewActionLongVersion"
+               enablesFor="1"
+               icon="icons/print1.png"
+               id="henshin.action.nac.printlv"
+               label="Print and View Application Condition (Long Version)"
+               menubarPath="henshin.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.HenshinNACPrintViewActionShortVersion"
+               enablesFor="1"
+               icon="icons/print1.png"
+               id="henshin.action.nac.printsv"
+               label="Print and View Application Condition (Short Version)"
+               menubarPath="henshin.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.HenshinNACPrintOpenActionLongVersion"
+               enablesFor="1"
+               icon="icons/print2.png"
+               id="henshin.action.nac.printOpLV"
+               label="Print and Open Application Condition (Long Version)"
+               menubarPath="henshin.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.HenshinNACPrintOpenActionShortVersion"
+               enablesFor="1"
+               icon="icons/print2.png"
+               id="henshin.action.nac.printOpSV"
+               label="Print and Open Application Condition (Short Version)"
+               menubarPath="henshin.menu1/main"
+               style="push">
+         </action>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.HenshinNACSimplifierAction"
+               enablesFor="1"
+               icon="icons/simplify.png"
+               id="henshin.action.nac.simplify"
+               label="Simplify Application Condition"
+               menubarPath="henshin.menu1/main"
+               style="push">
+         </action>
+      </objectContribution>
+      <objectContribution
+            id="henshin.popupmenu.objectcontribution"
+            objectClass="org.eclipse.emf.henshin.model.Module">
+         <menu
+               icon="icons/ocl2ac16.png"
+               id="henshin.menu1"
+               label="OCL2AC_Henshin"
+               path="additions">
+            <separator
+                  name="main">
+            </separator>
+         </menu>
+         <action
+               class="de.unimarburg.swt.ocl2ac.utils.printer.actions.HenshinAllRuleNACSimplifierAction"
+               enablesFor="1"
+               id="henshin.action.nac.simplify.all"
+               label="Simplify Application Conditions of All Rules "
+               menubarPath="henshin.menu1/main"
+               style="push">
+         </action>
+      </objectContribution>
+   </extension>
+   <extension
+         point="org.eclipse.ui.views">
+      <view
+            class="de.unimarburg.swt.ocl2ac.utils.viewer.PDFViewer"
+            icon="icons/ocl2ac16.png"
+            id="nas.ocl2ac.viewer.PDFViewer"
+            name="PDF Viewer">
+      </view>
+   </extension>
+
+</plugin>
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/Activator.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/Activator.java
new file mode 100644
index 0000000..f9412ef
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/Activator.java
@@ -0,0 +1,59 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "de.unimarburg.swt.ocl2ac.utils"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.
+	 * BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.
+	 * BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/EdgeMapping.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/EdgeMapping.java
new file mode 100644
index 0000000..396a70b
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/EdgeMapping.java
@@ -0,0 +1,29 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.henshin.simplification;
+
+import org.eclipse.emf.henshin.model.Edge;
+
+public class EdgeMapping {
+
+	private Edge sourceEdge;
+
+	public EdgeMapping(Edge sourceEdge, Edge targetEdge) {
+		this.sourceEdge = sourceEdge;
+		this.targetEdge = targetEdge;
+	}
+
+	private Edge targetEdge;
+
+	public Edge getSourceEdge() {
+		return sourceEdge;
+	}
+
+	public Edge getTargetEdge() {
+		return targetEdge;
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/EquivalencesSimplifier.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/EquivalencesSimplifier.java
new file mode 100644
index 0000000..10f320b
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/EquivalencesSimplifier.java
@@ -0,0 +1,789 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.henshin.simplification;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.TreeIterator;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.henshin.model.And;
+import org.eclipse.emf.henshin.model.Attribute;
+import org.eclipse.emf.henshin.model.BinaryFormula;
+import org.eclipse.emf.henshin.model.Edge;
+import org.eclipse.emf.henshin.model.Formula;
+import org.eclipse.emf.henshin.model.Graph;
+import org.eclipse.emf.henshin.model.HenshinFactory;
+import org.eclipse.emf.henshin.model.NestedCondition;
+import org.eclipse.emf.henshin.model.Node;
+import org.eclipse.emf.henshin.model.Or;
+import org.eclipse.emf.henshin.model.UnaryFormula;
+
+public class EquivalencesSimplifier {
+
+	private Formula formula;
+	private HenshinFactory factory;
+
+	public EquivalencesSimplifier(Formula formula) {
+		this.formula = formula;
+		this.factory = HenshinFactory.eINSTANCE;
+	}
+
+	public boolean simplify() {
+
+		if (simplifyExists()) {
+			return simplify();
+		}
+		return true;
+	}
+
+	private boolean insert(EObject container, Formula oldContent, Formula newContent) {
+		if (container instanceof NestedCondition) {
+			NestedCondition constraint = (NestedCondition) container;
+			constraint.getConclusion().setFormula(newContent);
+			return true;
+		}
+		if (container instanceof Graph) {
+			Graph qlc = (Graph) container;
+			qlc.setFormula(newContent);
+			return true;
+		}
+		if (container instanceof Formula) {
+			Formula f = (Formula) container;
+			if (f instanceof UnaryFormula) {
+				UnaryFormula not = (UnaryFormula) f;
+				not.setChild(newContent);
+				return true;
+			}
+
+			if (f instanceof BinaryFormula) {
+				BinaryFormula binaryFormula = (BinaryFormula) f;
+				if (binaryFormula.getLeft() == oldContent) {
+					binaryFormula.setLeft(newContent);
+					return true;
+				}
+				if (binaryFormula.getRight() == oldContent) {
+					binaryFormula.setRight(newContent);
+					return true;
+				}
+			}
+
+		}
+		return false;
+	}
+
+	public boolean simplifyExists() {
+		TreeIterator<EObject> iter = formula.eAllContents();
+		while (iter.hasNext()) {
+			EObject eObject = iter.next();
+			if (isExistsCondition(eObject)) {
+				NestedCondition outerCondition = (NestedCondition) eObject;
+
+				if (isExistsCondition(outerCondition.getConclusion().getFormula())) {
+					NestedCondition innerCondition = (NestedCondition) outerCondition.getConclusion().getFormula();
+
+					if (isLeaf(innerCondition)) {
+						Graph outerGraph = outerCondition.getConclusion();
+						Graph innerGraph = innerCondition.getConclusion();
+
+						// E1.c
+						if (isSubGraph(outerGraph, innerGraph)) {
+							outerCondition.setConclusion(innerGraph);
+							System.out.println("(1) Equivalence E1.c");
+							return true;
+						}
+						if (isSubGraph(innerGraph, outerGraph)) {
+							outerCondition.getConclusion().setFormula(null);
+							System.out.println("(2) Equivalence E1.c");
+							return true;
+						}
+
+						// E1.b
+						if (areClanDisjoint(innerGraph, outerGraph)) {
+							EList<Node> innerNodes = innerGraph.getNodes();
+							innerGraph.getNodes().clear();
+							outerGraph.getNodes().addAll(innerNodes);
+							EList<Edge> innerEdges = innerGraph.getEdges();
+							innerGraph.getEdges().clear();
+							outerGraph.getEdges().addAll(innerEdges);
+							outerCondition.getConclusion().setFormula(null);
+							System.out.println("Equivalence E1.b");
+							return true;
+						}
+
+						// E1.a
+						if (haveIntersection(innerGraph, outerGraph)) {
+							EList<Intersection> intersections = getIntersections(outerGraph, innerGraph);
+							EObject container = outerCondition.eContainer();
+							if (intersections.size() == 1) {
+								NestedCondition condition = factory.createNestedCondition();
+								condition.setConclusion(glue(outerGraph, intersections.get(0), innerGraph));
+								insert(container, outerCondition, condition);
+								System.out.println("(1) Equivalence E1.a");
+								return true;
+							}
+							// TODO manage or
+							Or orFormula = factory.createOr();
+							Or orRight = null;
+							for (Intersection intersection : intersections) {
+								NestedCondition condition = factory.createNestedCondition();
+								condition.setConclusion(glue(outerCondition.getConclusion(), intersection,
+										innerCondition.getConclusion()));
+								orFormula.setLeft(condition);
+								// condition.getConclusion().setFormula(null);
+								orFormula.setLeft(condition);
+								orRight = factory.createOr();
+								orFormula.setRight(orRight);
+								orFormula = orRight;
+								// TODO call the henshin cleaner to refactor
+								// having or onleft only
+							}
+							insert(container, outerCondition, orFormula);
+							System.out.println("(2) Equivalence E1.a");
+							return true;
+						}
+
+						// E3 case 1
+						if (hasOnlyOneNode(innerGraph)) {
+							Node innerNode = innerGraph.getNodes().get(0);
+							if (hasTwoNames(innerNode)) {
+								String name1 = getNames(innerNode.getName()).get(0);
+								String name2 = getNames(innerNode.getName()).get(1);
+								if (containsExactlyOne(outerGraph, name1, name2)) {
+									rename(outerGraph, name1, name2);
+									outerCondition.getConclusion().setFormula(null);
+									System.out.println("Equivalence E3'");
+									return true;
+								}
+							}
+						}
+
+					}
+					System.err.println("not a leaf");
+				}
+				if (isAndFormula(outerCondition.getConclusion().getFormula())) {
+					And andFormula = (And) outerCondition.getConclusion().getFormula();
+					// if (andFormula.getArguments().size() == 2) {
+					if (isExistsCondition(andFormula.getLeft()) && isExistsCondition(andFormula.getRight())) {
+						NestedCondition cond1 = (NestedCondition) andFormula.getLeft();
+						NestedCondition cond2 = (NestedCondition) andFormula.getRight();
+						if (isLeaf(cond1) && isLeaf(cond2)) {
+							Graph gr = outerCondition.getConclusion();
+							Graph gr1 = cond1.getConclusion();
+							Graph gr2 = cond2.getConclusion();
+							if (hasOnlyOneNode(gr) && hasOnlyOneNode(gr2)) {
+								Node node = gr.getNodes().get(0);
+								Node node2 = gr2.getNodes().get(0);
+								if (haveSameTypes(node, node2) && hasOneName(node) && hasTwoNames(node2)) {
+									String name = node.getName();
+									String name1 = node2.getName().split("=")[0];
+									String name2 = node2.getName().split("=")[1];
+									if (name.equals(name1) || name.equals(name2)) {
+										if (containsExactlyOne(gr1, name1, name2)) {
+											rename(gr1, name1, name2);
+											outerCondition.getConclusion().setFormula(cond1);
+											System.out.println("Equivalence E3");
+											return true;
+										}
+									}
+								}
+							}
+							if (hasOnlyOneNode(gr) && hasOnlyOneNode(gr1)) {
+								Node node = gr.getNodes().get(0);
+								Node node1 = gr1.getNodes().get(0);
+								if (haveSameTypes(node, node1) && hasOneName(node) && hasTwoNames(node1)) {
+									String name = node.getName();
+									String name1 = node1.getName().split("=")[0];
+									String name2 = node1.getName().split("=")[1];
+									if (name.equals(name1) || name.equals(name2)) {
+										if (containsExactlyOne(gr2, name1, name2)) {
+											rename(gr2, name1, name2);
+											outerCondition.getConclusion().setFormula(cond2);
+											System.out.println("Equivalence E3");
+											return true;
+										}
+									}
+								}
+							}
+							System.out.println("=> haveRecurringNodes: " + haveRecurringNodes(gr1, gr2));
+							System.out.println(
+									"=> containsEachRecurringNode: " + containsEachRecurringNode(gr, gr1, gr2));
+							if (haveRecurringNodes(gr1, gr2)) {
+								if (containsEachRecurringNode(gr, gr1, gr2)
+										|| containsNoRecurringNodeType(gr, gr1, gr2)) {
+									if (haveIntersection(gr1, gr2)) {
+										EList<Intersection> intersections = getIntersections(gr1, gr2);
+										if (intersections.size() == 1) {
+											NestedCondition condition = factory.createNestedCondition();
+											condition.setConclusion((glue(gr1, intersections.get(0), gr2)));
+											// condition.getConclusion().setFormula(null);
+											outerCondition.getConclusion().setFormula(condition);
+											System.out.println("Equivalence E2.a");
+											return true;
+										}
+										// TODO Manager OR
+										Or or = factory.createOr();
+										Or orRight = null;
+										for (Intersection intersection : intersections) {
+											NestedCondition condition = factory.createNestedCondition();
+											condition.setConclusion((glue(gr1, intersection, gr2)));
+											// condition.getConclusion().setFormula(null);
+											or.setLeft(condition);
+											orRight = factory.createOr();
+											or.setRight(orRight);
+											or = orRight;
+											// TODO Test it and call cleaner
+										}
+										outerCondition.getConclusion().setFormula(or);
+										System.out.println("Equivalence E2.a");
+										return true;
+									}
+								}
+							}
+						}
+					}
+					// }
+				}
+			}
+			if (isAndFormula(eObject)) {
+				And andFormula = (And) eObject;
+				// if (andFormula.getArguments().size() == 2) {
+				if (isExistsCondition(andFormula.getLeft()) && isExistsCondition(andFormula.getRight())) {
+					NestedCondition cond1 = (NestedCondition) andFormula.getLeft();
+					NestedCondition cond2 = (NestedCondition) andFormula.getRight();
+					if (isLeaf(cond1) && isLeaf(cond2)) {
+						Graph gr1 = cond1.getConclusion();
+						Graph gr2 = cond2.getConclusion();
+						if (areClanDisjoint(gr1, gr2) && areNodeNameDisjoint(gr1, gr2)) {
+							EList<Node> nodes = gr2.getNodes();
+							gr2.getNodes().clear();
+							gr1.getNodes().addAll(nodes);
+							EList<Edge> edges = gr2.getEdges();
+							gr2.getEdges().clear();
+							gr1.getEdges().addAll(edges);
+							EObject container = andFormula.eContainer();
+							insert(container, andFormula, cond1);
+							System.out.println("Equivalence E2.b");
+							return true;
+						}
+					}
+				}
+				// }
+
+			}
+		}
+
+		System.err.println("return false");
+		return false;
+	}
+
+	/**
+	 * 
+	 * @param gr1
+	 * @param gr2
+	 * @return
+	 */
+	private boolean haveRecurringNodes(Graph gr1, Graph gr2) {
+		EList<Node> recurringNodes = collectRecurringNodes(gr1, gr2);
+		return (!recurringNodes.isEmpty());
+	}
+
+	/**
+	 * 
+	 * @param gr
+	 * @param gr1
+	 * @param gr2
+	 * @return
+	 */
+	private boolean containsEachRecurringNode(Graph gr, Graph gr1, Graph gr2) {
+		EList<Node> recurringNodes = collectRecurringNodes(gr1, gr2);
+		for (Node recurringNode : recurringNodes) {
+			boolean occurs = false;
+			String nodeName = recurringNode.getName();
+			EClass type = recurringNode.getType();
+			for (Node node : gr.getNodes()) {
+				if (node.getName().equals(nodeName) && node.getType() == type) {
+					occurs = true;
+					break;
+				}
+			}
+			if (!occurs) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 
+	 * @param gr
+	 * @param gr1
+	 * @param gr2
+	 * @return
+	 */
+	private boolean containsNoRecurringNodeType(Graph gr, Graph gr1, Graph gr2) {
+		EList<Node> recurringNodes = collectRecurringNodes(gr1, gr2);
+		boolean occurs = false;
+		for (Node recurringNode : recurringNodes) {
+			EClass type = recurringNode.getType();
+			for (Node node : gr.getNodes()) {
+				if (node.getType() == type) {
+					occurs = true;
+					break;
+				}
+			}
+		}
+		return !occurs;
+	}
+
+	private EList<Node> collectRecurringNodes(Graph gr1, Graph gr2) {
+		EList<Node> recurringNodes = new BasicEList<Node>();
+		for (Node node1 : gr1.getNodes()) {
+			String nodeName = node1.getName();
+			EClass type = node1.getType();
+			for (Node node2 : gr2.getNodes()) {
+				if (node2.getName().equals(nodeName) && node2.getType() == type) {
+					recurringNodes.add(node1);
+					break;
+				}
+			}
+		}
+		return recurringNodes;
+	}
+
+	/**
+	 * 
+	 * @param graph
+	 * @param name1
+	 * @param name2
+	 */
+	private void rename(Graph graph, String name1, String name2) {
+		String newName = name1 + "=" + name2;
+		for (Node node : graph.getNodes()) {
+			if (node.getName().equals(name1) || node.getName().equals(name2)) {
+				node.setName(newName);
+			}
+		}
+	}
+
+	/**
+	 * 
+	 * 
+	 * @param graph
+	 * @param name1
+	 * @param name2
+	 * @return
+	 */
+	private boolean containsExactlyOne(Graph graph, String name1, String name2) {
+		boolean exists1 = false;
+		boolean exists2 = false;
+		for (Node node : graph.getNodes()) {
+			if (node.getName().equals(name1))
+				exists1 = true;
+			if (node.getName().equals(name2))
+				exists2 = true;
+		}
+		return ((exists1 && !exists2) || (!exists1 && exists2));
+	}
+
+	/**
+	 * 
+	 * 
+	 * @param node
+	 * @return
+	 */
+	private boolean hasTwoNames(Node node) {
+		return (node.getName().split("=").length == 2);
+	}
+
+	/**
+	 * 
+	 * 
+	 * @param node
+	 * @return
+	 */
+	private boolean hasOneName(Node node) {
+		return (node.getName().split("=").length == 1);
+	}
+
+	/**
+	 * OK
+	 * 
+	 * @param node1
+	 * @param node2
+	 * @return
+	 */
+	private boolean haveSameTypes(Node node1, Node node2) {
+		return (node1.getType() == node2.getType());
+	}
+
+	/**
+	 * 
+	 * 
+	 * @param graph
+	 * @return
+	 */
+	private boolean hasOnlyOneNode(Graph graph) {
+		return (graph.getNodes().size() == 1 && graph.getEdges().isEmpty());
+	}
+
+	/**
+	 * OK
+	 * 
+	 * @param gr1
+	 * @param intersection
+	 * @param gr2
+	 * @return
+	 */
+	private Graph glue(Graph gr1, Intersection intersection, Graph gr2) {
+		Graph graph = intersection.getSourceGraph();
+
+		for (Node node : gr1.getNodes()) {
+			if (!intersection.containsSource(node)) {
+				Node nodeCopy = EcoreUtil.copy(node);
+				intersection.addNodeMapping(new NodeMapping(nodeCopy, node));
+				graph.getNodes().add(nodeCopy);
+			}
+		}
+		for (Node node : gr2.getNodes()) {
+			if (!intersection.containsTarget(node)) {
+				Node nodeCopy = EcoreUtil.copy(node);
+				intersection.addNodeMapping(new NodeMapping(nodeCopy, node));
+				graph.getNodes().add(nodeCopy);
+			}
+		}
+
+		for (Edge edge : gr1.getEdges()) {
+			if (!intersection.containsTarget(edge)) {
+				Edge edgeCopy = EcoreUtil.copy(edge);
+				edgeCopy.setSource(intersection.getSourceNode1(edge.getSource()));
+				edgeCopy.setTarget(intersection.getSourceNode1(edge.getTarget()));
+				graph.getEdges().add(edgeCopy);
+			}
+		}
+		for (Edge edge : gr2.getEdges()) {
+			if (!intersection.containsTarget(edge)) {
+				Edge edgeCopy = EcoreUtil.copy(edge);
+				edgeCopy.setSource(intersection.getSourceNode(edge.getSource()));
+				edgeCopy.setTarget(intersection.getSourceNode(edge.getTarget()));
+				graph.getEdges().add(edgeCopy);
+			}
+		}
+		return graph;
+	}
+
+	private EList<Intersection> getIntersections(Graph gr1, Graph gr2) {
+		EList<Intersection> intersections = new BasicEList<Intersection>();
+		EList<Graph> subGraphs = new BasicEList<Graph>();
+		fillSubGraphs(subGraphs, gr1);
+		for (Graph graph : subGraphs) {
+			if (isSubGraph(graph, gr2)) {
+				intersections.add(getIntersection(graph, gr2));
+			}
+		}
+		return intersections;
+	}
+
+	private Intersection getIntersection(Graph subGraph, Graph graph) {
+		Intersection intersection = new Intersection();
+		for (Node n1 : subGraph.getNodes()) {
+			for (Node n2 : graph.getNodes()) {
+				if (n1.getType() == n2.getType() && n1.getName().equals(n2.getName())) {
+					intersection.addNodeMapping(new NodeMapping(n1, n2));
+				}
+			}
+		}
+		for (Edge e1 : subGraph.getEdges()) {
+			Node src1 = e1.getSource();
+			NodeMapping srcMapping = getMapping(intersection.getNodeMappings(), src1);
+			Node tgt1 = e1.getTarget();
+			NodeMapping tgtMapping = getMapping(intersection.getNodeMappings(), tgt1);
+			for (Edge e2 : graph.getEdges()) {
+				Node src2 = e2.getSource();
+				Node tgt2 = e2.getTarget();
+				if (e1.getType() == e2.getType() && srcMapping.getTargetNode() == src2
+						&& tgtMapping.getTargetNode() == tgt2) {
+					intersection.addEdgeMapping(new EdgeMapping(e1, e2));
+					break;
+				}
+			}
+		}
+		return intersection;
+	}
+
+	private void fillSubGraphs(EList<Graph> subGraphs, Graph graph) {
+		EList<Edge> edges = cloneEdges(graph);
+		for (Edge edge : edges) {
+			graph.getEdges().remove(edge);
+			Graph gr = EcoreUtil.copy(graph);
+			graph.getEdges().add(edge);
+			testAndFill(subGraphs, gr);
+		}
+		EList<Node> nodes = cloneNodes(graph);
+		for (Node node : nodes) {
+			if (!isConnected(node, graph)) {
+				graph.getNodes().remove(node);
+				Graph gr = EcoreUtil.copy(graph);
+				graph.getNodes().add(node);
+				if (!isEmptyGraph(gr)) {
+					testAndFill(subGraphs, gr);
+				}
+			}
+		}
+	}
+
+	private boolean isEmptyGraph(Graph graph) {
+		return (graph.getNodes().isEmpty() && graph.getEdges().isEmpty());
+	}
+
+	private boolean isConnected(Node node, Graph graph) {
+		for (Edge edge : graph.getEdges()) {
+			if (edge.getSource() == node)
+				return true;
+			if (edge.getTarget() == node)
+				return true;
+		}
+		return false;
+	}
+
+	private void testAndFill(EList<Graph> graphs, Graph graph) {
+		if (!contains(graphs, graph)) {
+			graphs.add(graph);
+			fillSubGraphs(graphs, graph);
+		}
+	}
+
+	private boolean contains(EList<Graph> graphs, Graph graph) {
+		for (Graph gr : graphs) {
+			if (isSameGraph(gr, graph)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	private boolean isSameGraph(Graph gr1, Graph gr2) {
+		return (isSubGraph(gr1, gr2) && isSubGraph(gr2, gr1));
+	}
+
+	private EList<Node> cloneNodes(Graph graph) {
+		EList<Node> nodes = new BasicEList<Node>();
+		for (Node node : graph.getNodes()) {
+			nodes.add(node);
+		}
+		return nodes;
+	}
+
+	private EList<Edge> cloneEdges(Graph graph) {
+		EList<Edge> edges = new BasicEList<Edge>();
+		for (Edge edge : graph.getEdges()) {
+			edges.add(edge);
+		}
+		return edges;
+	}
+
+	/**
+	 * 
+	 * 
+	 * @param gr1
+	 * @param gr2
+	 * @return
+	 */
+	private boolean areNodeNameDisjoint(Graph gr1, Graph gr2) {
+		List<String> names1 = getNodeNames(gr1);
+		List<String> names2 = getNodeNames(gr2);
+		for (String str1 : names1) {
+			for (String str2 : names2) {
+				if (str1.equals(str2)) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+
+	private List<String> getNodeNames(Graph graph) {
+		List<String> names = new ArrayList<String>();
+		for (Node node : graph.getNodes()) {
+			names.addAll(getNames(node.getName()));
+		}
+		return names;
+	}
+
+	private List<String> getNames(String name) {
+		String[] names = name.split("=");
+		return Arrays.asList(names);
+	}
+
+	/**
+	 * 
+	 * 
+	 * @param gr1
+	 * @param gr2
+	 * @return
+	 */
+	private boolean haveIntersection(Graph gr1, Graph gr2) {
+		EList<Intersection> intersections = getIntersections(gr1, gr2);
+		return !intersections.isEmpty();
+	}
+
+	/**
+	 * 
+	 * @param gr1
+	 * @param gr2
+	 * @return
+	 */
+	private boolean areClanDisjoint(Graph gr1, Graph gr2) {
+		for (Node n1 : gr1.getNodes()) {
+			EList<EClass> clan1 = getClan(n1.getType());
+			for (Node n2 : gr2.getNodes()) {
+				if (clan1.contains(n2.getType())) {
+					return false;
+				}
+			}
+		}
+		for (Node n2 : gr2.getNodes()) {
+			EList<EClass> clan2 = getClan(n2.getType());
+			for (Node n1 : gr1.getNodes()) {
+				if (clan2.contains(n1.getType())) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+
+	private EList<EClass> getClan(EClass eClass) {
+		EList<EClass> eClasses = new BasicEList<EClass>();
+		eClasses.add(eClass);
+		eClasses.addAll(getAllSubclasses(eClass));
+		return eClasses;
+	}
+
+	private EList<EClass> getAllSubclasses(EClass eClass) {
+		EList<EClass> eClasses = new BasicEList<EClass>();
+		EPackage ePackage = eClass.getEPackage();
+		TreeIterator<EObject> iter = ePackage.eAllContents();
+		while (iter.hasNext()) {
+			EObject eObject = iter.next();
+			if (eObject instanceof EClass) {
+				EClass clazz = (EClass) eObject;
+				if (clazz.getEAllSuperTypes().contains(eClass)) {
+					eClasses.add(clazz);
+				}
+			}
+		}
+		return eClasses;
+	}
+
+	/**
+	 * 
+	 * 
+	 * @param graphA
+	 * @param graphB
+	 * @return
+	 */
+	public boolean isSubGraph(Graph graphA, Graph graphB) {
+		HashMap<Node, Node> mappingNodeA2NodeB = new HashMap<Node, Node>();
+		for (Node nodeA : graphA.getNodes()) {
+			for (Node nodeB : graphB.getNodes()) {
+				if (nodeA.getType() == nodeB.getType()) {
+					if (getNames(nodeB.getName()).containsAll(getNames(nodeA.getName()))) {
+
+						// TODO check it attribute
+						if (nodeB.getAttributes().containsAll(nodeA.getAttributes())) {
+							boolean attISO = true;
+							for (Attribute a : nodeA.getAttributes()) {
+								if (getBy(a, nodeB.getAttributes()) == null)
+									attISO = false;
+							}
+							if (attISO)
+								mappingNodeA2NodeB.put(nodeA, nodeB);
+						}
+
+					}
+				}
+			}
+		}
+		if (graphA.getNodes().size() != mappingNodeA2NodeB.size()) {
+			return false;
+		}
+		for (Edge edgeA : graphA.getEdges()) {
+			Node srcEdgeA = edgeA.getSource();
+			Node tgtEdgeA = edgeA.getTarget();
+
+			boolean edgeIsMapped = false;
+			for (Edge edgeB : graphB.getEdges()) {
+				Node srcEdgeB = edgeB.getSource();
+				Node tgtEdgeB = edgeB.getTarget();
+				if (edgeA.getType() == edgeB.getType() && mappingNodeA2NodeB.get(srcEdgeA) == srcEdgeB
+						&& mappingNodeA2NodeB.get(tgtEdgeA) == tgtEdgeB) {
+					edgeIsMapped = true;
+					break;
+				}
+			}
+			if (!edgeIsMapped) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	/**
+	 * 
+	 * 
+	 * @param a
+	 * @param ls
+	 * @return
+	 */
+	private Attribute getBy(Attribute a, EList<Attribute> ls) {
+		for (Attribute b : ls) {
+			if (b.getType() == a.getType() && b.getValue() == a.getValue()) {
+				return b;
+			}
+		}
+
+		return null;
+	}
+
+	private NodeMapping getMapping(EList<NodeMapping> nodeMappings, Node node) {
+		for (NodeMapping nm : nodeMappings) {
+			if (nm.getSourceNode() == node) {
+				return nm;
+			}
+		}
+		return null;
+	}
+
+	private boolean isLeaf(NestedCondition nestedCondition) {
+		if (nestedCondition.getConclusion() == null)
+			return true;
+		else if (nestedCondition.getConclusion() != null && nestedCondition.getConclusion().getFormula() == null)
+			return true;
+		return false;
+	}
+
+	private boolean isAndFormula(EObject eObject) {
+		if (eObject instanceof And)
+			return true;
+		else
+			return false;
+	}
+
+	private boolean isExistsCondition(EObject eObject) {
+		if (eObject instanceof NestedCondition)
+			return true;
+		else
+			return false;
+	}
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/HenshinNACSimplifier.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/HenshinNACSimplifier.java
new file mode 100644
index 0000000..1ca1b2e
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/HenshinNACSimplifier.java
@@ -0,0 +1,507 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.henshin.simplification;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.henshin.interpreter.Match;
+import org.eclipse.emf.henshin.model.And;
+import org.eclipse.emf.henshin.model.Attribute;
+import org.eclipse.emf.henshin.model.BinaryFormula;
+import org.eclipse.emf.henshin.model.Edge;
+import org.eclipse.emf.henshin.model.Graph;
+import org.eclipse.emf.henshin.model.NestedCondition;
+import org.eclipse.emf.henshin.model.Node;
+import org.eclipse.emf.henshin.model.Not;
+import org.eclipse.emf.henshin.model.Or;
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.model.UnaryFormula;
+
+import de.unimarburg.swt.ocl2ac.utils.Activator;
+
+public class HenshinNACSimplifier {
+
+	private static final String PATTERN_HENSHIN_RELATIVE_PATH_NAME = "pattern/patterns.henshin";
+	private static final String PATTERN_HENSHIN_PATH_NAME = getFullPath(PATTERN_HENSHIN_RELATIVE_PATH_NAME);
+	private static final String FIND_NC_GR_OR = "find_NC_GR_OR";
+	private static final String FIND_NC_GR_NOT_OR = "find_NC_GR_NOT_OR";
+	private static final String FIND_NOTNOT = "find_NotNot";
+	private static final String FIND_NC_GR_AND = "find_NC_GR_AND";
+	private static final String FIND_NC_GR_NOT_AND = "find_NC_GR_NOT_AND";
+
+	private static ArrayList<Graph> lsAndGraphs = new ArrayList<Graph>();
+	private static ArrayList<Graph> lsOrGraphs = new ArrayList<Graph>();
+
+	/**
+	 * 
+	 * @param rule
+	 */
+	public static void simplifyOrGraphsInAC(Rule rule) {
+		NasHenshinCommand henCmd = new NasHenshinCommand(PATTERN_HENSHIN_PATH_NAME, rule.getLhs().getFormula());
+		Rule rulePattern = (Rule) henCmd.getGrammarModule().getUnit(FIND_NC_GR_OR);
+		List<Match> matches = henCmd.findAllMatches(rulePattern);
+		Iterator<Match> iterator = matches.iterator();
+		markAndRemoveUnwantedGraphsInOr(rulePattern, iterator);
+		Rule rulePattern2 = (Rule) henCmd.getGrammarModule().getUnit(FIND_NC_GR_NOT_OR);
+		List<Match> matches2 = henCmd.findAllMatches(rulePattern2);
+		Iterator<Match> iterator2 = matches2.iterator();
+		markAndRemoveUnwantedGraphsInOr(rulePattern2, iterator2);
+	}
+
+	/**
+	 * 
+	 * @param rule
+	 */
+	public static void simplifyAndGraphsInAC(Rule rule) {
+		NasHenshinCommand henCmd = new NasHenshinCommand(PATTERN_HENSHIN_PATH_NAME, rule.getLhs().getFormula());
+		Rule rulePattern = (Rule) henCmd.getGrammarModule().getUnit(FIND_NC_GR_AND);
+		List<Match> matches = henCmd.findAllMatches(rulePattern);
+		Iterator<Match> iterator = matches.iterator();
+		markAndRemoveUnwantedGraphsInAnd(rulePattern, iterator);
+		Rule rulePattern2 = (Rule) henCmd.getGrammarModule().getUnit(FIND_NC_GR_NOT_AND);
+		List<Match> matches2 = henCmd.findAllMatches(rulePattern2);
+		Iterator<Match> iterator2 = matches2.iterator();
+		markAndRemoveUnwantedGraphsInAnd(rulePattern2, iterator2);
+	}
+
+	/**
+	 * 
+	 * @param rule
+	 */
+	public static void eliminateNotNotFromNAC(Rule rule) {
+		NasHenshinCommand henCmd = new NasHenshinCommand(PATTERN_HENSHIN_PATH_NAME, rule.getLhs().getFormula());
+		Rule rulePattern3 = (Rule) henCmd.getGrammarModule().getUnit(FIND_NOTNOT);
+		List<Match> matches3 = henCmd.findAllMatches(rulePattern3);
+		Iterator<Match> iterator3 = matches3.iterator();
+		while (iterator3.hasNext()) {
+			Match match = iterator3.next();
+			Not outerNot = (Not) match.getParameterValue(rulePattern3.getParameter("outerNot"));
+			Not innerNot = (Not) match.getParameterValue(rulePattern3.getParameter("innerNot"));
+			if (outerNot.eContainer() instanceof Graph) {
+				((Graph) outerNot.eContainer()).setFormula(innerNot.getChild());
+			} else if (outerNot.eContainer() instanceof BinaryFormula) {
+				BinaryFormula binaryFormula = (BinaryFormula) outerNot.eContainer();
+				if (binaryFormula.getLeft() == outerNot) {
+					binaryFormula.setLeft(innerNot.getChild());
+				} else if (binaryFormula.getRight() == outerNot) {
+					binaryFormula.setRight(innerNot.getChild());
+				}
+			}
+		}
+	}
+
+	/**
+	 * 
+	 * @param rulePattern
+	 * @param iterator
+	 */
+	private static void markAndRemoveUnwantedGraphsInOr(Rule rulePattern, Iterator<Match> iterator) {
+		while (iterator.hasNext()) {
+			Match match = iterator.next();
+			Or orContainer = (Or) match.getParameterValue(rulePattern.getParameter("paramOR"));
+			lsOrGraphs.clear();
+
+			// collect graphs among only OR operators
+			collecGraphsOfOnlyORs(orContainer);
+
+			if (lsOrGraphs.size() > 0) {
+				// finding the smallest subgraphs by comparing and marking them
+				// with null in the list.
+				for (int i = 0; i < lsOrGraphs.size() - 1; i++) {
+					for (int j = i + 1; j < lsOrGraphs.size(); j++) {
+						if (isSubGraph(lsOrGraphs.get(i), lsOrGraphs.get(j))) {
+							System.out.println(
+									lsOrGraphs.get(i).getName() + " is subgraphof " + lsOrGraphs.get(j).getName());
+							lsOrGraphs.set(j, null);
+						} else if (isSubGraph(lsOrGraphs.get(j), lsOrGraphs.get(i))) {
+							System.out.println(
+									lsOrGraphs.get(j).getName() + " is subgraphof " + lsOrGraphs.get(i).getName());
+							lsOrGraphs.set(i, null);
+							break;
+						}
+					}
+				}
+				lsOrGraphs.removeIf(Objects::isNull);
+
+				// manage the unwanted graphs, e.g., by setting them null
+				removeMarkedGraphs(orContainer);
+			}
+		}
+	}
+
+	/**
+	 * 
+	 * @param rulePattern
+	 * @param iterator
+	 */
+	private static void markAndRemoveUnwantedGraphsInAnd(Rule rulePattern, Iterator<Match> iterator) {
+		while (iterator.hasNext()) {
+			Match match = iterator.next();
+			And andContainer = (And) match.getParameterValue(rulePattern.getParameter("paramAND"));
+			lsAndGraphs.clear();
+
+			// collect graphs among only OR operators
+			collecGraphsOfOnlyANDs(andContainer);
+
+			if (lsAndGraphs.size() > 0) {
+				// finding the smallest subgraphs by comparing and marking them
+				// with null in the list.
+				for (int i = 0; i < lsAndGraphs.size() - 1; i++) {
+					for (int j = i + 1; j < lsAndGraphs.size(); j++) {
+						if (isSubGraph(lsAndGraphs.get(i), lsAndGraphs.get(j))) {
+							System.out.println(
+									lsAndGraphs.get(i).getName() + " is subgraphof " + lsAndGraphs.get(j).getName());
+							lsAndGraphs.set(i, null);
+							break;
+						} else if (isSubGraph(lsAndGraphs.get(j), lsAndGraphs.get(i))) {
+							System.out.println(
+									lsAndGraphs.get(j).getName() + " is subgraphof " + lsAndGraphs.get(i).getName());
+							lsAndGraphs.set(j, null);
+						}
+					}
+				}
+				lsAndGraphs.removeIf(Objects::isNull);
+				// manage the unwanted graphs, e.g., by setting them null
+				removeMarkedGraphs(andContainer);
+			}
+		}
+	}
+
+	/**
+	 * collect the graphs among only OR operators in the same level
+	 * 
+	 * @param or
+	 */
+	private static void collecGraphsOfOnlyORs(Or or) {
+		if (or.getLeft() instanceof Or) {
+			collecGraphsOfOnlyORs((Or) or.getLeft());
+		} else if (or.getLeft() instanceof NestedCondition) {
+			NestedCondition leftNC = (NestedCondition) or.getLeft();
+			Graph conclusion = leftNC.getConclusion();
+			lsOrGraphs.add(conclusion);
+		} else if (or.getLeft() instanceof UnaryFormula) {
+			Not left = (Not) or.getLeft();
+			if (left.getChild() instanceof NestedCondition) {
+				NestedCondition leftNC = (NestedCondition) left.getChild();
+				Graph conclusion = leftNC.getConclusion();
+				lsOrGraphs.add(conclusion);
+			}
+		} else {
+			// there is a mixing between OR operators and other operators in the
+			// same level
+			lsOrGraphs.clear();
+			return;
+		}
+
+		if (or.getRight() instanceof Or) {
+			collecGraphsOfOnlyORs((Or) or.getRight());
+		} else if (or.getLeft() instanceof NestedCondition) {
+			NestedCondition rightNC = (NestedCondition) or.getRight();
+			Graph conclusion = rightNC.getConclusion();
+			lsOrGraphs.add(conclusion);
+		} else if (or.getRight() instanceof UnaryFormula) {
+			Not right = (Not) or.getRight();
+			if (right.getChild() instanceof NestedCondition) {
+				NestedCondition rightNC = (NestedCondition) right.getChild();
+				Graph conclusion = rightNC.getConclusion();
+				lsOrGraphs.add(conclusion);
+			}
+		} else {
+			// there is a mixing between OR operators and other operators in the
+			// same level
+			lsOrGraphs.clear();
+			return;
+		}
+
+	}
+
+	/**
+	 * collect the graphs among only OR operators in the same level
+	 * 
+	 * @param and
+	 */
+	private static void collecGraphsOfOnlyANDs(And and) {
+		if (and.getLeft() instanceof And) {
+			collecGraphsOfOnlyANDs((And) and.getLeft());
+		} else if (and.getLeft() instanceof NestedCondition) {
+			NestedCondition leftNC = (NestedCondition) and.getLeft();
+			Graph conclusion = leftNC.getConclusion();
+			lsAndGraphs.add(conclusion);
+		} else if (and.getLeft() instanceof UnaryFormula) {
+			Not left = (Not) and.getLeft();
+			if (left.getChild() instanceof NestedCondition) {
+				NestedCondition leftNC = (NestedCondition) left.getChild();
+				Graph conclusion = leftNC.getConclusion();
+				lsAndGraphs.add(conclusion);
+			}
+		} else {
+			// there is a mixing between OR operators and other operators in the
+			// same level
+			lsAndGraphs.clear();
+			return;
+		}
+
+		if (and.getRight() instanceof And) {
+			collecGraphsOfOnlyANDs((And) and.getRight());
+		} else if (and.getLeft() instanceof NestedCondition) {
+			NestedCondition rightNC = (NestedCondition) and.getRight();
+			Graph conclusion = rightNC.getConclusion();
+			lsAndGraphs.add(conclusion);
+		} else if (and.getRight() instanceof UnaryFormula) {
+			Not right = (Not) and.getRight();
+			if (right.getChild() instanceof NestedCondition) {
+				NestedCondition rightNC = (NestedCondition) right.getChild();
+				Graph conclusion = rightNC.getConclusion();
+				lsAndGraphs.add(conclusion);
+			}
+		} else {
+			// there is a mixing between OR operators and other operators in the
+			// same level
+			lsAndGraphs.clear();
+			return;
+		}
+
+	}
+
+	/**
+	 * Remove unwanted subgraphs and refactor the condition.
+	 * 
+	 * @param or
+	 */
+	private static void removeMarkedGraphs(Or or) {
+		if (or.getLeft() instanceof Or) {
+			collecGraphsOfOnlyORs((Or) or.getLeft());
+		} else if (or.getLeft() instanceof NestedCondition) {
+			NestedCondition leftNC = (NestedCondition) or.getLeft();
+			Graph conclusion = leftNC.getConclusion();
+			if (!lsOrGraphs.contains(conclusion)) {
+				or.setLeft(null);
+				refactorLeftChild(or);
+			}
+		} else if (or.getLeft() instanceof UnaryFormula) {
+			Not left = (Not) or.getLeft();
+			if (left.getChild() instanceof NestedCondition) {
+				NestedCondition leftNC = (NestedCondition) left.getChild();
+				Graph conclusion = leftNC.getConclusion();
+				if (!lsOrGraphs.contains(conclusion)) {
+					or.setLeft(null);
+					refactorLeftChild(or);
+				}
+			}
+		}
+
+		if (or.getRight() instanceof Or) {
+			collecGraphsOfOnlyORs((Or) or.getRight());
+		} else if (or.getLeft() instanceof NestedCondition) {
+			NestedCondition rightNC = (NestedCondition) or.getRight();
+			Graph conclusion = rightNC.getConclusion();
+			if (!lsOrGraphs.contains(conclusion)) {
+				or.setRight(null);
+				refactorRightChild(or);
+			}
+		} else if (or.getRight() instanceof UnaryFormula) {
+			Not right = (Not) or.getRight();
+			if (right.getChild() instanceof NestedCondition) {
+				NestedCondition rightNC = (NestedCondition) right.getChild();
+				Graph conclusion = rightNC.getConclusion();
+				if (!lsOrGraphs.contains(conclusion)) {
+					or.setRight(null);
+					refactorRightChild(or);
+				}
+			}
+		}
+
+	}
+
+	/**
+	 * Remove unwanted subgraphs and refactor the condition.
+	 * 
+	 * @param and
+	 */
+	private static void removeMarkedGraphs(And and) {
+		if (and.getLeft() instanceof And) {
+			collecGraphsOfOnlyANDs((And) and.getLeft());
+		} else if (and.getLeft() instanceof NestedCondition) {
+			NestedCondition leftNC = (NestedCondition) and.getLeft();
+			Graph conclusion = leftNC.getConclusion();
+			if (!lsAndGraphs.contains(conclusion)) {
+				and.setLeft(null);
+				refactorLeftChild(and);
+			}
+		} else if (and.getLeft() instanceof UnaryFormula) {
+			Not left = (Not) and.getLeft();
+			if (left.getChild() instanceof NestedCondition) {
+				NestedCondition leftNC = (NestedCondition) left.getChild();
+				Graph conclusion = leftNC.getConclusion();
+				if (!lsAndGraphs.contains(conclusion)) {
+					and.setLeft(null);
+					refactorLeftChild(and);
+				}
+			}
+		}
+
+		if (and.getRight() instanceof And) {
+			collecGraphsOfOnlyANDs((And) and.getRight());
+		} else if (and.getLeft() instanceof NestedCondition) {
+			NestedCondition rightNC = (NestedCondition) and.getRight();
+			Graph conclusion = rightNC.getConclusion();
+			if (!lsAndGraphs.contains(conclusion)) {
+				and.setRight(null);
+				refactorRightChild(and);
+			}
+		} else if (and.getRight() instanceof UnaryFormula) {
+			Not right = (Not) and.getRight();
+			if (right.getChild() instanceof NestedCondition) {
+				NestedCondition rightNC = (NestedCondition) right.getChild();
+				Graph conclusion = rightNC.getConclusion();
+				if (!lsAndGraphs.contains(conclusion)) {
+					and.setRight(null);
+					refactorRightChild(and);
+				}
+			}
+		}
+
+	}
+
+	/**
+	 * 
+	 * @param bnf
+	 */
+	private static void refactorRightChild(BinaryFormula bnf) {
+		if (bnf.eContainer() instanceof Graph) {
+			Graph gc = (Graph) bnf.eContainer();
+			gc.setFormula(bnf.getLeft());
+		} else if (bnf.eContainer() instanceof BinaryFormula) {
+			BinaryFormula conf = (BinaryFormula) bnf.eContainer();
+			if (conf.getLeft() == bnf) {
+				conf.setLeft(bnf.getLeft());
+			} else if (conf.getRight() == bnf) {
+				conf.setRight(bnf.getLeft());
+			}
+		} else if (bnf.eContainer() instanceof Not) {
+			Not not = (Not) bnf.eContainer();
+			not.setChild(bnf.getLeft());
+		}
+	}
+
+	/**
+	 * 
+	 * @param bnf
+	 */
+	private static void refactorLeftChild(BinaryFormula bnf) {
+		if (bnf.eContainer() instanceof Graph) {
+			Graph gc = (Graph) bnf.eContainer();
+			gc.setFormula(bnf.getRight());
+		} else if (bnf.eContainer() instanceof BinaryFormula) {
+			BinaryFormula b = (BinaryFormula) bnf.eContainer();
+			if (b.getLeft() == bnf) {
+				b.setLeft(bnf.getRight());
+			} else if (b.getRight() == bnf) {
+				b.setRight(bnf.getRight());
+			}
+		} else if (bnf.eContainer() instanceof Not) {
+			Not not = (Not) bnf.eContainer();
+			not.setChild(bnf.getRight());
+		}
+	}
+
+	/**
+	 * 
+	 * @param a
+	 * @param ls
+	 * @return
+	 */
+	private static Attribute getBy(Attribute a, EList<Attribute> ls) {
+		for (Attribute b : ls) {
+			if (b.getType() == a.getType() && b.getValue() == a.getValue()) {
+				return b;
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * 
+	 * 
+	 * @param graphA
+	 * @param graphB
+	 * @return
+	 */
+	public static boolean isSubGraph(Graph graphA, Graph graphB) {
+		HashMap<Node, Node> mappingNodeA2NodeB = new HashMap<Node, Node>();
+		for (Node nodeA : graphA.getNodes()) {
+			for (Node nodeB : graphB.getNodes()) {
+				if (nodeA.getType() == nodeB.getType()) {
+					if (getNames(nodeB.getName()).containsAll(getNames(nodeA.getName()))) {
+
+						// TODO check it attribute
+						if (nodeB.getAttributes().containsAll(nodeA.getAttributes())) {
+							boolean attISO = true;
+							for (Attribute a : nodeA.getAttributes()) {
+								if (getBy(a, nodeB.getAttributes()) == null)
+									attISO = false;
+							}
+							if (attISO)
+								mappingNodeA2NodeB.put(nodeA, nodeB);
+						}
+
+						// mappingNodeA2NodeB.put(nodeA, nodeB);
+					}
+				}
+			}
+		}
+		if (graphA.getNodes().size() != mappingNodeA2NodeB.size()) {
+			return false;
+		}
+		for (Edge edgeA : graphA.getEdges()) {
+			Node srcEdgeA = edgeA.getSource();
+			Node tgtEdgeA = edgeA.getTarget();
+
+			boolean edgeIsMapped = false;
+			for (Edge edgeB : graphB.getEdges()) {
+				Node srcEdgeB = edgeB.getSource();
+				Node tgtEdgeB = edgeB.getTarget();
+				if (edgeA.getType() == edgeB.getType() && mappingNodeA2NodeB.get(srcEdgeA) == srcEdgeB
+						&& mappingNodeA2NodeB.get(tgtEdgeA) == tgtEdgeB) {
+					edgeIsMapped = true;
+					break;
+				}
+			}
+			if (!edgeIsMapped) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	private static List<String> getNames(String name) {
+		String[] names = name.split("=");
+		return Arrays.asList(names);
+	}
+
+	private static String getFullPath(String path) {
+		URL url = FileLocator.find(Activator.getDefault().getBundle(), new Path(path), Collections.EMPTY_MAP);
+		URL fileUrl = null;
+		try {
+			fileUrl = FileLocator.toFileURL(url);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return fileUrl.getPath();
+	}
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/Intersection.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/Intersection.java
new file mode 100644
index 0000000..f682158
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/Intersection.java
@@ -0,0 +1,112 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.henshin.simplification;
+
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.henshin.model.Edge;
+import org.eclipse.emf.henshin.model.Graph;
+import org.eclipse.emf.henshin.model.Node;
+
+public class Intersection {
+
+	public Graph getSourceGraph() {
+		return (Graph) nodeMappings.get(0).getSourceNode().eContainer();
+	}
+
+	private EList<NodeMapping> nodeMappings;
+
+	public EList<NodeMapping> getNodeMappings() {
+		return nodeMappings;
+	}
+
+	public EList<EdgeMapping> getEdgeMappings() {
+		return edgeMappings;
+	}
+
+	private EList<EdgeMapping> edgeMappings;
+
+	public Intersection() {
+		nodeMappings = new BasicEList<NodeMapping>();
+		edgeMappings = new BasicEList<EdgeMapping>();
+	}
+
+	public void addNodeMapping(NodeMapping nodeMapping) {
+		nodeMappings.add(nodeMapping);
+	}
+
+	public void addEdgeMapping(EdgeMapping edgeMapping) {
+		edgeMappings.add(edgeMapping);
+	}
+
+	public boolean containsTarget(Node node) {
+		for (NodeMapping mapping : nodeMappings) {
+			if (mapping.getTargetNode() == node) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public boolean containsTarget(Edge edge) {
+		for (EdgeMapping mapping : edgeMappings) {
+			if (mapping.getTargetEdge() == edge) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public Node getSourceNode(Node node) {
+		for (NodeMapping mapping : nodeMappings) {
+			if (mapping.getTargetNode() == node) {
+				return mapping.getSourceNode();
+			}
+		}
+		return null;
+	}
+
+	public String toString() {
+		StringBuffer result = new StringBuffer();
+		result.append("Node Mappings:");
+		for (NodeMapping nodeMapping : nodeMappings) {
+			result.append("\n- from ");
+			result.append(nodeMapping.getSourceNode().toString());
+			result.append(" to ");
+			result.append(nodeMapping.getTargetNode().toString());
+			result.append("\n- graphs: " + nodeMapping.getSourceNode().eContainer() + " and "
+					+ nodeMapping.getTargetNode().eContainer());
+		}
+		result.append("\nEdge Mappings: ");
+		for (EdgeMapping edgeMapping : edgeMappings) {
+			result.append("\n- between ");
+			result.append(edgeMapping.getSourceEdge().toString());
+			result.append(" and ");
+			result.append(edgeMapping.getTargetEdge().toString());
+		}
+		return result.toString();
+	}
+
+	public boolean containsSource(Node node) {
+		for (NodeMapping mapping : nodeMappings) {
+			Node sourceNode = mapping.getSourceNode();
+			if (sourceNode.getName().equals(node.getName()) && sourceNode.getType() == node.getType()) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public Node getSourceNode1(Node node) {
+		for (NodeMapping mapping : nodeMappings) {
+			Node targetNode = mapping.getTargetNode();
+			if (targetNode.getName().equals(node.getName()) && targetNode.getType() == node.getType()) {
+				return mapping.getSourceNode();
+			}
+		}
+		return null;
+	}
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/NasHenshinCommand.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/NasHenshinCommand.java
new file mode 100644
index 0000000..fb0fc93
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/NasHenshinCommand.java
@@ -0,0 +1,96 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.henshin.simplification;
+
+import java.util.List;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
+import org.eclipse.emf.henshin.interpreter.EGraph;
+import org.eclipse.emf.henshin.interpreter.Engine;
+import org.eclipse.emf.henshin.interpreter.Match;
+import org.eclipse.emf.henshin.interpreter.UnitApplication;
+import org.eclipse.emf.henshin.interpreter.impl.EGraphImpl;
+import org.eclipse.emf.henshin.interpreter.impl.EngineImpl;
+import org.eclipse.emf.henshin.interpreter.impl.ProfilingApplicationMonitor;
+import org.eclipse.emf.henshin.interpreter.impl.UnitApplicationImpl;
+import org.eclipse.emf.henshin.interpreter.util.InterpreterUtil;
+import org.eclipse.emf.henshin.model.Module;
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.model.Unit;
+import org.eclipse.emf.henshin.model.resource.HenshinResourceSet;
+
+public class NasHenshinCommand {
+
+	private EObject root;
+	private Engine engine;
+	private EGraph graph;
+	private Module grammarModule;
+	private String henshinFilePathName;
+	private UnitApplication mainUnitApplication;
+	private ProfilingApplicationMonitor monitor;
+
+	public NasHenshinCommand(String henshinFilePathName, EObject root) {
+		this.root = root;
+		this.henshinFilePathName = henshinFilePathName;
+		initGrammar();
+	}
+
+	private void initGrammar() {
+		// Load the transformation module
+		ResourceSet resourceSet = new ResourceSetImpl();
+		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap()
+				.put(Resource.Factory.Registry.DEFAULT_EXTENSION, new XMIResourceFactoryImpl());
+		URI uri = URI.createFileURI(henshinFilePathName);
+		Resource resource = resourceSet.getResource(uri, true);
+		grammarModule = (Module) resource.getContents().get(0);
+		// Initialize the interpreter
+		graph = new EGraphImpl(root);
+		engine = new EngineImpl();
+		engine.getOptions().put(Engine.OPTION_DETERMINISTIC, false);
+	}
+
+	public UnitApplication prepareUnitApplication(Unit unit) {
+		mainUnitApplication = new UnitApplicationImpl(engine, graph, unit, null);
+		return mainUnitApplication;
+	}
+
+	public boolean run(Unit unit) {
+		// Initialize the transformation units
+		mainUnitApplication = new UnitApplicationImpl(engine, graph, unit, null);
+		// Initialize the monitor
+		monitor = new ProfilingApplicationMonitor();
+		return mainUnitApplication.execute(monitor);
+	}
+
+	public boolean run(UnitApplication mainUnitApplication) {
+		// Initialize the monitor
+		monitor = new ProfilingApplicationMonitor();
+		return mainUnitApplication.execute(monitor);
+	}
+
+	public void save() {
+		HenshinResourceSet hrs = new HenshinResourceSet();
+		hrs.saveEObject(getRoot(), getRoot().eResource().getURI());
+	}
+
+	public List<Match> findAllMatches(Rule rule) {
+		return InterpreterUtil.findAllMatches(engine, rule, graph, null);
+	}
+
+	public EObject getRoot() {
+		return root;
+	}
+
+	public Module getGrammarModule() {
+		return grammarModule;
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/NodeMapping.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/NodeMapping.java
new file mode 100644
index 0000000..1241949
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/henshin/simplification/NodeMapping.java
@@ -0,0 +1,29 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.henshin.simplification;
+
+import org.eclipse.emf.henshin.model.Node;
+
+public class NodeMapping {
+
+	private Node sourceNode;
+
+	public NodeMapping(Node sourceNode, Node targetNode) {
+		this.sourceNode = sourceNode;
+		this.targetNode = targetNode;
+	}
+
+	private Node targetNode;
+
+	public Node getSourceNode() {
+		return sourceNode;
+	}
+
+	public Node getTargetNode() {
+		return targetNode;
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/CopyCommand.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/CopyCommand.java
new file mode 100644
index 0000000..5b226c2
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/CopyCommand.java
@@ -0,0 +1,60 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URL;
+import java.util.Collections;
+
+import org.apache.commons.io.FileUtils;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+
+import de.unimarburg.swt.ocl2ac.utils.Activator;
+
+public class CopyCommand {
+
+	public static final String TEX_FOLDER = "supplementary";
+	private URI uri;
+
+	public CopyCommand(URI uri) {
+		this.uri = uri;
+	}
+
+	public void copy() {
+		String texFolderPath = getFullPath(TEX_FOLDER);
+		File srcDir = new File(texFolderPath);
+		System.err.println(srcDir.exists() + " " + texFolderPath);
+
+		File targetDir = new File(uri.getPath());
+		System.err.println(targetDir.exists());
+
+		try {
+			FileUtils.copyDirectory(srcDir, targetDir, true);
+			System.err.println("Copy From:" + srcDir);
+			System.err.println("Copy To:" + targetDir);
+
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+	}
+
+	private String getFullPath(String path) {
+		URL url = FileLocator.find(Activator.getDefault().getBundle(), new Path(path), Collections.EMPTY_MAP);
+		URL fileUrl = null;
+		try {
+			fileUrl = FileLocator.toFileURL(url);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return fileUrl.getPath();
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/CoreCommand.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/CoreCommand.java
new file mode 100644
index 0000000..7d823df
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/CoreCommand.java
@@ -0,0 +1,149 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer;
+
+import java.awt.Desktop;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.concurrent.TimeUnit;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+public class CoreCommand {
+
+	/**
+	 * 
+	 * @param latexFilePath
+	 * @param outputFolderPath
+	 */
+	public void executePDFLatexCommand(String latexFilePath, String outputFolderPath) {
+		String command = "pdflatex -output-directory " + outputFolderPath + " " + latexFilePath;
+		ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", command);
+		builder.redirectErrorStream(true);
+		Process p = null;
+		try {
+			p = builder.start();
+			boolean waitFor = p.waitFor(5, TimeUnit.SECONDS);
+			// int waitFor = p.waitFor();
+			BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
+			String line;
+			while (true) {
+				line = r.readLine();
+				if (line == null) {
+					break;
+				}
+				System.out.println(line);
+			}
+			if (!waitFor) {
+				System.err.println("Timeout: The latex file is not compiled.");
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			p.destroy();
+		}
+	}
+
+	public void runFile(File file) {
+		ProcessBuilder builder = new ProcessBuilder("cmd.exe", "/c", file.getPath());
+		builder.redirectErrorStream(true);
+		Process p;
+		try {
+			p = builder.start();
+			BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream()));
+			String line;
+			while (true) {
+				line = r.readLine();
+				if (line == null) {
+					break;
+				}
+				System.out.println(line);
+			}
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} finally {
+		}
+	}
+
+	/**
+	 * 
+	 * @param pdfFile
+	 */
+	public void desktopRun(File pdfFile) {
+		if (Desktop.isDesktopSupported()) {
+			try {
+				Desktop.getDesktop().open(pdfFile);
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		} else {
+			System.out.println("Awt Desktop is not supported!");
+		}
+	}
+
+	public void browseFile(String filePath) {
+		Display display = new Display();
+
+		Shell shell = new Shell(display);
+		Browser browser = new Browser(shell, SWT.NONE);
+		browser.setUrl(filePath);
+
+		shell.setLocation(100, 100);
+		shell.setLayout(new FillLayout());
+		shell.layout(true);
+		shell.setVisible(true);
+		shell.open();
+
+		while (!shell.isDisposed())
+			if (!display.readAndDispatch())
+				display.sleep();
+
+		display.dispose();
+	}
+
+	public static void refreshFolders() {
+		try {
+			getActualProject().refreshLocal(IProject.DEPTH_INFINITE, null);
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+	@SuppressWarnings("finally")
+	private static IProject getActualProject() {
+		IProject actualProject = null;
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		try {
+			IEditorPart editorPart = window.getActivePage().getActiveEditor();
+			if (editorPart != null) {
+				IEditorInput input = editorPart.getEditorInput();
+				if (input instanceof IFileEditorInput) {
+					IFileEditorInput fileInput = (IFileEditorInput) input;
+					actualProject = fileInput.getFile().getProject();
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			return actualProject;
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/HenshinNACPrinter.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/HenshinNACPrinter.java
new file mode 100644
index 0000000..e91fbf7
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/HenshinNACPrinter.java
@@ -0,0 +1,289 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.net.URI;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.henshin.model.And;
+import org.eclipse.emf.henshin.model.AttributeCondition;
+import org.eclipse.emf.henshin.model.BinaryFormula;
+import org.eclipse.emf.henshin.model.Formula;
+import org.eclipse.emf.henshin.model.Or;
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.model.UnaryFormula;
+import org.eclipse.emf.henshin.model.Xor;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+import de.unimarburg.swt.ocl2ac.gc2ac.util.GraphAdapter;
+import graph.Graph;
+import graph.util.extensions.Constants;
+import graph.util.extensions.GraphPrinter;
+import laxcondition.util.extensions.LaxConditionConstants;
+
+public class HenshinNACPrinter {
+
+	private org.eclipse.emf.henshin.model.Formula henFormula;
+	private static final String HENSHIN = ".henshin";
+	private StringBuffer result;
+	private int openBrackets;
+	private boolean shortversion;
+	private GraphPrinter graphPrinter;
+	private Rule henRule;
+	private EPackage ePackage;
+	private String texfolderPath;
+	private String outputFilePath;
+	private boolean isRHS = false;
+
+	public static final String RIGHTARROW = "\\hookrightarrow";
+
+	public HenshinNACPrinter(Rule henRule, EPackage ePackage, boolean shortversion) {
+		this.openBrackets = 0;
+		this.shortversion = shortversion;
+		this.henRule = henRule;
+		this.henFormula = this.henRule.getLhs().getFormula();
+		this.ePackage = ePackage;
+	}
+
+	public void setHenFormula(Formula henFormula) {
+		this.henFormula = henFormula;
+		this.isRHS = true;
+	}
+
+	public void printDocument() {
+		this.graphPrinter = new GraphPrinter(null);
+		result = new StringBuffer(graphPrinter.printPreambel2());
+		result.append(Constants.BEGIN_DOCUMENT);
+		String henshinRuleNameInLatex = this.henRule.getName();
+		if (henshinRuleNameInLatex.contains("_"))
+			henshinRuleNameInLatex = henshinRuleNameInLatex.replaceAll("_", "\\\\_");
+		String header = null;
+		if (shortversion)
+			header = "ShortVersion";
+		else
+			header = "LongVersion";
+
+		if (isRHS) {
+			header += "-RightApplicationCondition-Rule-";
+		} else
+			header += "-NegativeApplicationCondition-Rule-";
+
+		result.append(LaxConditionConstants.START2);
+		printHenFormula(this.henFormula);
+
+		for (AttributeCondition henAttributeCondition : this.henRule.getAttributeConditions()) {
+			result.append(Constants.SPACE + cr() + LaxConditionConstants.LAND + cr() + Constants.SPACE);
+			// print opening bracket
+			result.append(left() + Constants.SPACE);
+			result.append(henAttributeCondition.getConditionText());
+			// print closing bracket
+			result.append(Constants.SPACE + right());
+		}
+
+		result.append(LaxConditionConstants.END2);
+		result.append(Constants.END_DOCUMENT);
+		saveFile();
+	}
+
+	private void printHenFormula(org.eclipse.emf.henshin.model.Formula formula) {
+		if (formula instanceof org.eclipse.emf.henshin.model.NestedCondition)
+			printHenNestedCondition((org.eclipse.emf.henshin.model.NestedCondition) formula);
+
+		if (formula instanceof org.eclipse.emf.henshin.model.UnaryFormula)
+			printHenUnaryFormula((UnaryFormula) formula);
+
+		if (formula instanceof org.eclipse.emf.henshin.model.BinaryFormula)
+			printHenBinaryFormula((BinaryFormula) formula);
+	}
+
+	private void printHenNestedCondition(org.eclipse.emf.henshin.model.NestedCondition henNCond) {
+
+		// print quantifier
+		result.append(LaxConditionConstants.EXISTS + Constants.SPACE);
+
+		// print opening bracket
+		result.append(left() + Constants.SPACE);
+
+		// TODO test the correctness
+		// print graph P0
+		if (!shortversion) {
+			GraphAdapter graphAdapter = new GraphAdapter(henNCond.getHost(), this.ePackage);
+			graphAdapter.adaptFromHenshin();
+			Graph printGraph = graphAdapter.getGraph();
+			this.graphPrinter = new GraphPrinter(printGraph);
+			result.append(this.graphPrinter.printGraph());
+			result.append(Constants.SPACE + RIGHTARROW + Constants.SPACE);
+		}
+
+		GraphAdapter graphAdapter = new GraphAdapter(henNCond.getConclusion(), this.ePackage);
+		graphAdapter.adaptFromHenshin();
+		Graph printGraph = graphAdapter.getGraph();
+		this.graphPrinter = new GraphPrinter(printGraph);
+		result.append(this.graphPrinter.printGraph());
+
+		// print nested condition
+		if (henNCond.getConclusion().getFormula() != null) {
+			result.append(Constants.SPACE + Constants.COMMA + Constants.SPACE + cr());
+			printHenFormula(henNCond.getConclusion().getFormula());
+		}
+
+		// print closing bracket
+		result.append(Constants.SPACE + right());
+	}
+
+	private void printHenUnaryFormula(UnaryFormula formula) {
+		// result.append(Constants.BRACKETOPEN);
+		result.append(LaxConditionConstants.NEG + Constants.SPACE);
+		printHenFormula(formula.getChild());
+		// result.append(Constants.BRACKETCLOSE);
+	}
+
+	private void printHenBinaryFormula(BinaryFormula formula) {
+		result.append(Constants.BRACKETOPEN);
+		if (formula instanceof And) {
+			printHenFormula(formula.getLeft());
+			result.append(Constants.SPACE + cr() + LaxConditionConstants.LAND + cr() + Constants.SPACE);
+			printHenFormula(formula.getRight());
+		}
+
+		if (formula instanceof Or) {
+			printHenFormula(formula.getLeft());
+			result.append(Constants.SPACE + cr() + LaxConditionConstants.LOR + Constants.SPACE);
+			printHenFormula(formula.getRight());
+		}
+
+		if (formula instanceof Xor) {
+			printHenFormula(formula.getLeft());
+			result.append(Constants.SPACE + cr() + LaxConditionConstants.XOR + Constants.SPACE);
+			printHenFormula(formula.getRight());
+		}
+
+		result.append(Constants.BRACKETCLOSE);
+	}
+
+	private String right() {
+		openBrackets--;
+		return LaxConditionConstants.RIGHT;
+	}
+
+	private String left() {
+		openBrackets++;
+		return LaxConditionConstants.LEFT;
+	}
+
+	private String cr() {
+		String ret = Constants.NEWLINE;
+		for (int i = 0; i < openBrackets; i++) {
+			ret += LaxConditionConstants.CRRIGHT;
+		}
+		ret += LaxConditionConstants.CRCENTRE;
+		for (int i = 0; i < openBrackets; i++) {
+			ret += LaxConditionConstants.CRLEFT;
+		}
+		return ret + Constants.NEWLINE;
+	}
+
+	/**
+	 * 
+	 */
+	private void saveFile() {
+		String nameMark = null;
+		IFile ifile = null;
+		try {
+			ifile = ResourcesPlugin.getWorkspace().getRoot()
+					.getFile(new Path(this.henRule.eResource().getURI().path()));
+			nameMark = ifile.getName().replaceFirst(HENSHIN, "");
+			SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
+			Date date = new GregorianCalendar().getTime();
+			nameMark += "_" + sdf.format(date);
+			if (shortversion)
+				nameMark += "SV";
+			else
+				nameMark += "LV";
+		} catch (Exception e) {
+			System.out.println(e.getMessage());
+		}
+
+		if (nameMark == null)
+			nameMark = this.henRule.getName();
+
+		URI uri = getActualProject().getLocationURI();
+		texfolderPath = uri.getPath().concat(Constants.TEXFOLDER);
+		File texFolderFile = new File(texfolderPath);
+
+		if (!texFolderFile.exists()) {
+			CopyCommand copyFileCommand = new CopyCommand(uri);
+			copyFileCommand.copy();
+		}
+
+		if (isRHS) {
+			outputFilePath = getFolderPath().concat("RAC_of_" + nameMark + Constants.TEX);
+			isRHS = false;
+		} else
+			outputFilePath = getFolderPath().concat("NAC_of_" + nameMark + Constants.TEX);
+
+		File file = new File(outputFilePath);
+		Writer writer = null;
+		try {
+			writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
+			writer.write(result.toString());
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				writer.close();
+				getActualProject().refreshLocal(IProject.DEPTH_INFINITE, null);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	@SuppressWarnings("finally")
+	private IProject getActualProject() {
+		IProject actualProject = null;
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		try {
+			IEditorPart editorPart = window.getActivePage().getActiveEditor();
+			if (editorPart != null) {
+				IEditorInput input = editorPart.getEditorInput();
+				if (input instanceof IFileEditorInput) {
+					IFileEditorInput fileInput = (IFileEditorInput) input;
+					actualProject = fileInput.getFile().getProject();
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			return actualProject;
+		}
+	}
+
+	public String getOutputFilePath() {
+		return outputFilePath;
+	}
+
+	public String getFolderPath() {
+		return texfolderPath;
+	}
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/NestedConditionPrinter.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/NestedConditionPrinter.java
new file mode 100644
index 0000000..c581a09
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/NestedConditionPrinter.java
@@ -0,0 +1,238 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
+import java.net.URI;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.GregorianCalendar;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.ui.IEditorInput;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+import graph.util.extensions.Constants;
+import graph.util.extensions.GraphPrinter;
+import laxcondition.Operator;
+import laxcondition.Quantifier;
+import laxcondition.util.extensions.LaxConditionConstants;
+import nestedcondition.Formula;
+import nestedcondition.NestedCondition;
+import nestedcondition.NestedConstraint;
+import nestedcondition.QuantifiedCondition;
+import nestedcondition.True;
+
+public class NestedConditionPrinter {
+
+	private NestedConstraint constraint;
+	private StringBuffer result;
+	private int openBrackets;
+	private boolean shortversion;
+	private GraphPrinter graphPrinter;
+	private String texfolderPath;
+	private String outputFilePath;
+
+	public static final String RIGHTARROW = "\\hookrightarrow";
+
+	public NestedConditionPrinter(NestedConstraint constraint, boolean shortversion) {
+		this.constraint = constraint;
+		this.openBrackets = 0;
+		this.shortversion = shortversion;
+	}
+
+	public void printDocument() {
+		this.graphPrinter = new GraphPrinter(null);
+		result = new StringBuffer(graphPrinter.printPreambel2());
+		result.append(Constants.BEGIN_DOCUMENT);
+
+		String constraintNameInLatx = constraint.getName();
+		if (constraintNameInLatx.contains("_"))
+			constraintNameInLatx = constraintNameInLatx.replaceAll("_", "\\\\_");
+		String version = null;
+		if (shortversion)
+			version = "ShortVersion";
+		else
+			version = "LongVersion";
+		result.append(LaxConditionConstants.START2);
+		printNestedCondition(constraint.getCondition());
+		result.append(LaxConditionConstants.END2);
+		result.append(Constants.END_DOCUMENT);
+		saveFile();
+	}
+
+	private void printNestedCondition(NestedCondition condition) {
+		if (condition instanceof QuantifiedCondition)
+			printQuantifiedCondition((QuantifiedCondition) condition);
+		if (condition instanceof True)
+			printTrue((True) condition);
+		if (condition instanceof Formula)
+			printFormula((Formula) condition);
+	}
+
+	private void printQuantifiedCondition(QuantifiedCondition cond) {
+		boolean isExists = cond.getQuantifier().equals(Quantifier.EXISTS);
+		boolean isTrue = cond.getCondition() instanceof True;
+		// print quantifier
+		if (isExists) {
+			result.append(LaxConditionConstants.EXISTS + Constants.SPACE);
+		} else {
+			result.append(LaxConditionConstants.FORALL + Constants.SPACE);
+		}
+		// print opening bracket
+		result.append(left() + Constants.SPACE);
+		// print graph
+		if (!shortversion) {
+			this.graphPrinter = new GraphPrinter(cond.getDomain());
+			result.append(this.graphPrinter.printGraph());
+			result.append(Constants.SPACE + RIGHTARROW + Constants.SPACE);
+		}
+		this.graphPrinter = new GraphPrinter(cond.getCodomain());
+		result.append(this.graphPrinter.printGraph());
+		// print nested condition
+		if (!(shortversion && isTrue)) {
+			result.append(Constants.SPACE + Constants.COMMA + Constants.SPACE + cr());
+			printNestedCondition(cond.getCondition());
+		}
+		// print closing bracket
+		result.append(Constants.SPACE + right());
+	}
+
+	private void printFormula(Formula formula) {
+		if (formula.eContainer() instanceof Formula)
+			result.append(Constants.BRACKETOPEN);
+		if (formula.getOperator().equals(Operator.NOT)) {
+			result.append(LaxConditionConstants.NEG + Constants.SPACE);
+			printNestedCondition(formula.getArguments().get(0));
+		}
+		if (formula.getOperator().equals(Operator.IMPLIES)) {
+			printNestedCondition(formula.getArguments().get(0));
+			result.append(Constants.SPACE + cr() + LaxConditionConstants.IMPL + Constants.SPACE);
+			printNestedCondition(formula.getArguments().get(1));
+		}
+		if (formula.getOperator().equals(Operator.EQUIVALENT)) {
+			printNestedCondition(formula.getArguments().get(0));
+			result.append(Constants.SPACE + cr() + LaxConditionConstants.EQUIVALENT + Constants.SPACE);
+			printNestedCondition(formula.getArguments().get(1));
+		}
+		if (formula.getOperator().equals(Operator.AND)) {
+			printNestedCondition(formula.getArguments().get(0));
+			for (int i = 1; i < formula.getArguments().size(); i++) {
+				result.append(Constants.SPACE + cr() + LaxConditionConstants.LAND + Constants.SPACE);
+				printNestedCondition(formula.getArguments().get(i));
+			}
+		}
+		if (formula.getOperator().equals(Operator.OR)) {
+			printNestedCondition(formula.getArguments().get(0));
+			for (int i = 1; i < formula.getArguments().size(); i++) {
+				result.append(Constants.SPACE + cr() + LaxConditionConstants.LOR + Constants.SPACE);
+				printNestedCondition(formula.getArguments().get(i));
+			}
+		}
+		if (formula.getOperator().equals(Operator.XOR)) {
+			printNestedCondition(formula.getArguments().get(0));
+			result.append(Constants.SPACE + cr() + LaxConditionConstants.XOR + Constants.SPACE);
+			printNestedCondition(formula.getArguments().get(1));
+		}
+		if (formula.eContainer() instanceof Formula)
+			result.append(Constants.BRACKETCLOSE);
+	}
+
+	private void printTrue(True cond) {
+		result.append(LaxConditionConstants.TRUE);
+	}
+
+	private String right() {
+		openBrackets--;
+		return LaxConditionConstants.RIGHT;
+	}
+
+	private String left() {
+		openBrackets++;
+		return LaxConditionConstants.LEFT;
+	}
+
+	private String cr() {
+		String ret = Constants.NEWLINE;
+		for (int i = 0; i < openBrackets; i++) {
+			ret += LaxConditionConstants.CRRIGHT;
+		}
+		ret += LaxConditionConstants.CRCENTRE;
+		for (int i = 0; i < openBrackets; i++) {
+			ret += LaxConditionConstants.CRLEFT;
+		}
+		return ret + Constants.NEWLINE;
+	}
+
+	private void saveFile() {
+		String nameMark = null;
+		URI uri = getActualProject().getLocationURI();
+		texfolderPath = uri.getPath().concat(Constants.TEXFOLDER);
+		File texFolderFile = new File(texfolderPath);
+		if (!texFolderFile.exists()) {
+			CopyCommand copyFileCommand = new CopyCommand(uri);
+			copyFileCommand.copy();
+		}
+
+		SimpleDateFormat sdf = new SimpleDateFormat("yyMMddHHmmss");
+		Date date = new GregorianCalendar().getTime();
+		nameMark = "_" + sdf.format(date);
+		if (shortversion)
+			nameMark += "SV";
+		else
+			nameMark += "LV";
+
+		outputFilePath = texfolderPath.concat("Constraint_" + constraint.getName() + nameMark + Constants.TEX);
+		File file = new File(getOutputFilePath());
+		Writer writer = null;
+		try {
+			writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
+			writer.write(result.toString());
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			try {
+				writer.close();
+				getActualProject().refreshLocal(IProject.DEPTH_INFINITE, null);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	@SuppressWarnings("finally")
+	private IProject getActualProject() {
+		IProject actualProject = null;
+		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
+		try {
+			IEditorPart editorPart = window.getActivePage().getActiveEditor();
+			if (editorPart != null) {
+				IEditorInput input = editorPart.getEditorInput();
+				if (input instanceof IFileEditorInput) {
+					IFileEditorInput fileInput = (IFileEditorInput) input;
+					actualProject = fileInput.getFile().getProject();
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			return actualProject;
+		}
+	}
+
+	public String getOutputFilePath() {
+		return outputFilePath;
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/ViewCommand.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/ViewCommand.java
new file mode 100644
index 0000000..9f59c97
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/ViewCommand.java
@@ -0,0 +1,28 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer;
+
+import java.io.File;
+
+import org.eclipse.ui.PlatformUI;
+
+import de.unimarburg.swt.ocl2ac.utils.viewer.PDFViewer;
+
+public class ViewCommand {
+
+	private static final String NAS_OCL2AC_VIEWER_PDF_VIEWER = "nas.ocl2ac.viewer.PDFViewer";
+
+	public static void openView(File pdfFile) {
+		try {
+			PDFViewer.pdfpath = null;
+			PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(NAS_OCL2AC_VIEWER_PDF_VIEWER);
+			PDFViewer.update(pdfFile.getPath());
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACLaxGenerationActionLongVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACLaxGenerationActionLongVersion.java
new file mode 100644
index 0000000..805a7c5
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACLaxGenerationActionLongVersion.java
@@ -0,0 +1,57 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.presentation.HenshinEditor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.HenshinNACPrinter;
+
+public class HenshinNACLaxGenerationActionLongVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+	// Henshin rule:
+	protected Rule rule;
+
+	@Override
+	public void run(IAction action) {
+		print();
+	}
+
+	protected void print() {
+		HenshinNACPrinter henshinNACPrinter = new HenshinNACPrinter(rule, rule.eClass().getEPackage(), false);
+		henshinNACPrinter.printDocument();
+		MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Info",
+				"The latex file for presenting the application condition of the rule is generated. It can be found in the tex folder in your project");
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		rule = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof Rule) {
+				rule = (Rule) first;
+			}
+		}
+		action.setEnabled(rule != null);
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+		workbenchPart = (part instanceof HenshinEditor) ? part : null;
+		action.setEnabled(workbenchPart != null);
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACLaxGenerationActionShortVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACLaxGenerationActionShortVersion.java
new file mode 100644
index 0000000..c73cc77
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACLaxGenerationActionShortVersion.java
@@ -0,0 +1,58 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.presentation.HenshinEditor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.HenshinNACPrinter;
+
+public class HenshinNACLaxGenerationActionShortVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+	// Henshin rule:
+	protected Rule rule;
+
+	@Override
+	public void run(IAction action) {
+		print();
+	}
+
+	protected void print() {
+		HenshinNACPrinter henshinNACPrinter = new HenshinNACPrinter(rule, rule.eClass().getEPackage(), true);
+		henshinNACPrinter.printDocument();
+		MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Info",
+				"The latex file for presenting the application condition of the rule is generated. It can be found in the tex folder in your project");
+
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		rule = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof Rule) {
+				rule = (Rule) first;
+			}
+		}
+		action.setEnabled(rule != null);
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+		workbenchPart = (part instanceof HenshinEditor) ? part : null;
+		action.setEnabled(workbenchPart != null);
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintOpenActionLongVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintOpenActionLongVersion.java
new file mode 100644
index 0000000..cac1291
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintOpenActionLongVersion.java
@@ -0,0 +1,97 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.presentation.HenshinEditor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.CoreCommand;
+import de.unimarburg.swt.ocl2ac.utils.printer.HenshinNACPrinter;
+import graph.util.extensions.Constants;
+
+public class HenshinNACPrintOpenActionLongVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+	// Henshin rule:
+	protected Rule rule;
+
+	private CoreCommand wincmd;
+
+	@Override
+	public void run(IAction action) {
+		print();
+	}
+
+	protected void print() {
+
+		HenshinNACPrinter henshinNACPrinter = new HenshinNACPrinter(rule, rule.eClass().getEPackage(), false);
+		henshinNACPrinter.printDocument();
+
+		String filepath = henshinNACPrinter.getOutputFilePath();
+
+		Thread thread = new Thread() {
+			public void run() {
+				System.out.println("Thread Running");
+				compileLatex2PDF(filepath);
+
+				File texFile = new File(filepath);
+				int lastIndexOf = texFile.getName().lastIndexOf(Constants.TEX);
+				String pdfFileName = texFile.getName().substring(0, lastIndexOf).concat(".pdf");
+				File pdfFile = new File(texFile.getParent(), pdfFileName);
+				if (!pdfFile.exists()) {
+					System.err.println("The PDF file of the generated latex is not produced.");
+				} else {
+					openPDF(pdfFile);
+				}
+			}
+		};
+		thread.start();
+
+	}
+
+	private void openPDF(File pdfFile) {
+		if (pdfFile.exists()) {
+			wincmd = new CoreCommand();
+			wincmd.desktopRun(pdfFile);
+		} else {
+			System.out.println("The PDF file is not found");
+		}
+	}
+
+	private void compileLatex2PDF(String filePath) {
+		Path p = new Path(filePath);
+		wincmd = new CoreCommand();
+		wincmd.executePDFLatexCommand(p.toOSString(), p.toFile().getParent());
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		rule = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof Rule) {
+				rule = (Rule) first;
+			}
+		}
+		action.setEnabled(rule != null);
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+		workbenchPart = (part instanceof HenshinEditor) ? part : null;
+		action.setEnabled(workbenchPart != null);
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintOpenActionShortVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintOpenActionShortVersion.java
new file mode 100644
index 0000000..df50ba2
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintOpenActionShortVersion.java
@@ -0,0 +1,96 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.presentation.HenshinEditor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.CoreCommand;
+import de.unimarburg.swt.ocl2ac.utils.printer.HenshinNACPrinter;
+import graph.util.extensions.Constants;
+
+public class HenshinNACPrintOpenActionShortVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+	// Henshin rule:
+	protected Rule rule;
+
+	private CoreCommand wincmd;
+
+	@Override
+	public void run(IAction action) {
+		print();
+	}
+
+	protected void print() {
+
+		HenshinNACPrinter henshinNACPrinter = new HenshinNACPrinter(rule, rule.eClass().getEPackage(), true);
+		henshinNACPrinter.printDocument();
+
+		String filepath = henshinNACPrinter.getOutputFilePath();
+
+		Thread thread = new Thread() {
+			public void run() {
+				System.out.println("Thread Running");
+				compileLatex2PDF(filepath);
+				File texFile = new File(filepath);
+				int lastIndexOf = texFile.getName().lastIndexOf(Constants.TEX);
+				String pdfFileName = texFile.getName().substring(0, lastIndexOf).concat(".pdf");
+				File pdfFile = new File(texFile.getParent(), pdfFileName);
+
+				if (!pdfFile.exists()) {
+					System.err.println("The PDF file of the generated latex is not produced.");
+				} else {
+					openPDF(pdfFile);
+				}
+			}
+		};
+		thread.start();
+	}
+
+	private void openPDF(File pdfFile) {
+		if (pdfFile.exists()) {
+			wincmd = new CoreCommand();
+			wincmd.desktopRun(pdfFile);
+		} else {
+			System.out.println("The PDF file is not found");
+		}
+	}
+
+	private void compileLatex2PDF(String filePath) {
+		Path p = new Path(filePath);
+		wincmd = new CoreCommand();
+		wincmd.executePDFLatexCommand(p.toOSString(), p.toFile().getParent());
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		rule = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof Rule) {
+				rule = (Rule) first;
+			}
+		}
+		action.setEnabled(rule != null);
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+		workbenchPart = (part instanceof HenshinEditor) ? part : null;
+		action.setEnabled(workbenchPart != null);
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintViewActionLongVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintViewActionLongVersion.java
new file mode 100644
index 0000000..1dea3fb
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintViewActionLongVersion.java
@@ -0,0 +1,103 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.presentation.HenshinEditor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.CoreCommand;
+import de.unimarburg.swt.ocl2ac.utils.printer.HenshinNACPrinter;
+import de.unimarburg.swt.ocl2ac.utils.printer.ViewCommand;
+import graph.util.extensions.Constants;
+
+public class HenshinNACPrintViewActionLongVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+
+	// Henshin rule:
+	protected Rule rule;
+
+	private CoreCommand wincmd;
+	private File pdfFile = null;
+
+	@Override
+	public void run(IAction action) {
+		print();
+	}
+
+	/**
+	 * 
+	 */
+	protected void print() {
+		HenshinNACPrinter henshinNACPrinter = new HenshinNACPrinter(rule, rule.eClass().getEPackage(), false);
+		henshinNACPrinter.printDocument();
+
+		String filepath = henshinNACPrinter.getOutputFilePath();
+
+		Thread thread = new Thread() {
+			public void run() {
+				System.out.println("Thread Running");
+				compileLatex2PDF(filepath);
+
+				File texFile = new File(filepath);
+				int lastIndexOf = texFile.getName().lastIndexOf(Constants.TEX);
+				String pdfFileName = texFile.getName().substring(0, lastIndexOf).concat(".pdf");
+				pdfFile = new File(texFile.getParent(), pdfFileName);
+
+			}
+		};
+
+		thread.start();
+
+		try {
+			thread.join();
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		if (pdfFile != null && !pdfFile.exists()) {
+			System.err.println("The PDF file of the generated latex is not produced.");
+		} else {
+			ViewCommand.openView(pdfFile);
+		}
+
+	}
+
+	private void compileLatex2PDF(String filePath) {
+		Path p = new Path(filePath);
+		wincmd = new CoreCommand();
+		wincmd.executePDFLatexCommand(p.toOSString(), p.toFile().getParent());
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		rule = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof Rule) {
+				rule = (Rule) first;
+			}
+		}
+		action.setEnabled(rule != null);
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+		workbenchPart = (part instanceof HenshinEditor) ? part : null;
+		action.setEnabled(workbenchPart != null);
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintViewActionShortVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintViewActionShortVersion.java
new file mode 100644
index 0000000..c9f4f49
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACPrintViewActionShortVersion.java
@@ -0,0 +1,98 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.presentation.HenshinEditor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.CoreCommand;
+import de.unimarburg.swt.ocl2ac.utils.printer.HenshinNACPrinter;
+import de.unimarburg.swt.ocl2ac.utils.printer.ViewCommand;
+import graph.util.extensions.Constants;
+
+public class HenshinNACPrintViewActionShortVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+	// Henshin rule:
+	protected Rule rule;
+
+	private CoreCommand wincmd;
+	File pdfFile = null;
+
+	@Override
+	public void run(IAction action) {
+		print();
+	}
+
+	protected void print() {
+
+		HenshinNACPrinter henshinNACPrinter = new HenshinNACPrinter(rule, rule.eClass().getEPackage(), true);
+		henshinNACPrinter.printDocument();
+
+		String filepath = henshinNACPrinter.getOutputFilePath();
+
+		Thread thread = new Thread() {
+			public void run() {
+				System.out.println("Thread Running");
+				compileLatex2PDF(filepath);
+				File texFile = new File(filepath);
+				int lastIndexOf = texFile.getName().lastIndexOf(Constants.TEX);
+				String pdfFileName = texFile.getName().substring(0, lastIndexOf).concat(".pdf");
+				pdfFile = new File(texFile.getParent(), pdfFileName);
+			}
+		};
+
+		thread.start();
+
+		try {
+			thread.join();
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+
+		if (pdfFile != null && !pdfFile.exists()) {
+			System.err.println("The PDF file of the generated latex is not produced.");
+		} else {
+			ViewCommand.openView(pdfFile);
+		}
+
+	}
+
+	private void compileLatex2PDF(String filePath) {
+		Path p = new Path(filePath);
+		wincmd = new CoreCommand();
+		wincmd.executePDFLatexCommand(p.toOSString(), p.toFile().getParent());
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		rule = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof Rule) {
+				rule = (Rule) first;
+			}
+		}
+		action.setEnabled(rule != null);
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+		workbenchPart = (part instanceof HenshinEditor) ? part : null;
+		action.setEnabled(workbenchPart != null);
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACSimplifierAction.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACSimplifierAction.java
new file mode 100644
index 0000000..2c67851
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinNACSimplifierAction.java
@@ -0,0 +1,88 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.IOException;
+
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.model.util.HenshinModelCleaner;
+import org.eclipse.emf.henshin.presentation.HenshinEditor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+import de.unimarburg.swt.ocl2ac.utils.henshin.simplification.EquivalencesSimplifier;
+import de.unimarburg.swt.ocl2ac.utils.henshin.simplification.HenshinNACSimplifier;
+
+public class HenshinNACSimplifierAction implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+	// Henshin rule:
+	protected Rule rule;
+
+	@Override
+	public void run(IAction action) {
+		simplifyAC();
+	}
+
+	protected void simplifyAC() {
+
+		long start = System.currentTimeMillis();
+		if (rule.getLhs().getFormula() != null) {
+			HenshinNACSimplifier.eliminateNotNotFromNAC(rule);
+			HenshinNACSimplifier.simplifyOrGraphsInAC(rule);
+			HenshinNACSimplifier.simplifyAndGraphsInAC(rule);
+			HenshinNACSimplifier.eliminateNotNotFromNAC(rule);
+
+			// HenshinModelCleaner reduce the graphs bing isomorphisim
+			HenshinModelCleaner.cleanFormula(rule.getLhs().getFormula());
+
+			EquivalencesSimplifier es = new EquivalencesSimplifier(rule.getLhs().getFormula());
+			HenshinModelCleaner.cleanFormula(rule.getLhs().getFormula());
+
+			long stop = System.currentTimeMillis();
+
+			try {
+				rule.getModule().eResource().save(null);
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+
+			MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+					"Simplification", "Simplification is finished. The Simplification time is: ("
+							+ ((stop - start) / (double) 1000) + ") second(s).");
+		} else {
+
+			MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
+					"Simplification", "The selected rule has no application condition.");
+		}
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		rule = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof Rule) {
+				rule = (Rule) first;
+			}
+		}
+		action.setEnabled(rule != null);
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+		workbenchPart = (part instanceof HenshinEditor) ? part : null;
+		action.setEnabled(workbenchPart != null);
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinRightACPrintOpenActionShortVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinRightACPrintOpenActionShortVersion.java
new file mode 100644
index 0000000..b480941
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/HenshinRightACPrintOpenActionShortVersion.java
@@ -0,0 +1,101 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.henshin.model.Rule;
+import org.eclipse.emf.henshin.presentation.HenshinEditor;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.CoreCommand;
+import de.unimarburg.swt.ocl2ac.utils.printer.HenshinNACPrinter;
+import graph.util.extensions.Constants;
+
+public class HenshinRightACPrintOpenActionShortVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+	// Henshin rule:
+	protected Rule rule;
+
+	private CoreCommand wincmd;
+
+	@Override
+	public void run(IAction action) {
+		print();
+	}
+
+	protected void print() {
+
+		HenshinNACPrinter henshinNACPrinter = new HenshinNACPrinter(rule, rule.eClass().getEPackage(), true);
+		// to print the Nac in RHS
+		henshinNACPrinter.setHenFormula(rule.getRhs().getFormula());
+		henshinNACPrinter.printDocument();
+
+		String filepath = henshinNACPrinter.getOutputFilePath();
+
+		Thread thread = new Thread() {
+			public void run() {
+				System.out.println("Thread Running");
+				compileLatex2PDF(filepath);
+
+				File texFile = new File(filepath);
+				int lastIndexOf = texFile.getName().lastIndexOf(Constants.TEX);
+				String pdfFileName = texFile.getName().substring(0, lastIndexOf).concat(".pdf");
+				File pdfFile = new File(texFile.getParent(), pdfFileName);
+
+				if (!pdfFile.exists()) {
+					System.err.println("The PDF file of the generated latex is not produced.");
+				} else {
+					openPDF(pdfFile);
+				}
+			}
+		};
+
+		thread.start();
+
+	}
+
+	private void openPDF(File pdfFile) {
+		if (pdfFile.exists()) {
+			wincmd = new CoreCommand();
+			wincmd.desktopRun(pdfFile);
+		} else {
+			System.out.println("The PDF file is not found");
+		}
+	}
+
+	private void compileLatex2PDF(String filePath) {
+		Path p = new Path(filePath);
+		wincmd = new CoreCommand();
+		wincmd.executePDFLatexCommand(p.toOSString(), p.toFile().getParent());
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		rule = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof Rule) {
+				rule = (Rule) first;
+			}
+		}
+		action.setEnabled(rule != null);
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+		workbenchPart = (part instanceof HenshinEditor) ? part : null;
+		action.setEnabled(workbenchPart != null);
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCLaxGenerationActionLongVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCLaxGenerationActionLongVersion.java
new file mode 100644
index 0000000..6d01d94
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCLaxGenerationActionLongVersion.java
@@ -0,0 +1,73 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.NestedConditionPrinter;
+import nestedcondition.NestedConstraint;
+
+public class NGCLaxGenerationActionLongVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+
+	// Nested graph constraint:
+	protected NestedConstraint constraint;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		print();
+	}
+
+	/*
+	 * Print the graph constraint to the console
+	 */
+	protected void print() {
+		if (constraint != null) {
+			NestedConditionPrinter nestedConditionPrinter = new NestedConditionPrinter(constraint, false);
+			nestedConditionPrinter.printDocument();
+			MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Info",
+					"The latex file for presenting the graph constranit is generated. It can be found in the tex folder in your project");
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action
+	 * .IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		constraint = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof NestedConstraint) {
+				constraint = (NestedConstraint) first;
+				System.out.println(constraint.getName() + " " + constraint.eClass().getEPackage().getName());
+			}
+		}
+		action.setEnabled(constraint != null);
+	}
+
+	@Override
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+		// TODO Auto-generated method stub
+
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCLaxGenerationActionShortVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCLaxGenerationActionShortVersion.java
new file mode 100644
index 0000000..adb231b
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCLaxGenerationActionShortVersion.java
@@ -0,0 +1,78 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.PlatformUI;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.NestedConditionPrinter;
+import nestedcondition.NestedConstraint;
+
+public class NGCLaxGenerationActionShortVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+
+	// Nested graph constraint:
+	protected NestedConstraint constraint;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		print();
+	}
+
+	/*
+	 * Print the graph constraint to the console
+	 */
+	protected void print() {
+		if (constraint != null) {
+			NestedConditionPrinter nestedConditionPrinter = new NestedConditionPrinter(constraint, true);
+			nestedConditionPrinter.printDocument();
+			MessageDialog.openInformation(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Info",
+					"The latex file for presenting the graph constranit is generated. It can be found in the tex folder in your project");
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action
+	 * .IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		constraint = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof NestedConstraint) {
+				constraint = (NestedConstraint) first;
+				System.out.println(constraint.getName() + " " + constraint.eClass().getEPackage().getName());
+			}
+		}
+		action.setEnabled(constraint != null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.
+	 * action.IAction, org.eclipse.ui.IWorkbenchPart)
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintOpenActionLongVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintOpenActionLongVersion.java
new file mode 100644
index 0000000..d89a68c
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintOpenActionLongVersion.java
@@ -0,0 +1,125 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.CoreCommand;
+import de.unimarburg.swt.ocl2ac.utils.printer.NestedConditionPrinter;
+import graph.util.extensions.Constants;
+import nestedcondition.NestedConstraint;
+
+
+public class NGCPrintOpenActionLongVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+
+	// Nested graph constraint:
+	protected NestedConstraint constraint;
+
+	private CoreCommand wincmd;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		print();
+	}
+
+	/*
+	 * Print the graph constraint to the console
+	 */
+	protected void print() {
+		if (constraint != null) {
+
+			NestedConditionPrinter nestedConditionPrinter = new NestedConditionPrinter(constraint, false);
+			nestedConditionPrinter.printDocument();
+
+			String filepath = nestedConditionPrinter.getOutputFilePath();
+
+			Thread thread = new Thread() {
+				public void run() {
+					System.out.println("Thread Running");
+					compileLatex2PDF(filepath);
+
+					File texFile = new File(filepath);
+					int lastIndexOf = texFile.getName().lastIndexOf(Constants.TEX);
+					String pdfFileName = texFile.getName().substring(0, lastIndexOf).concat(".pdf");
+					File pdfFile = new File(texFile.getParent(), pdfFileName);
+					System.err.println(pdfFile.getPath());
+
+					if (!pdfFile.exists()) {
+						System.err.println("The PDF file of the generated latex is not produced.");
+					} else {
+						openPDF(pdfFile);
+
+					}
+				}
+			};
+			thread.start();
+
+		}
+	}
+
+	/**
+	 * 
+	 * @param filePath
+	 */
+	private void compileLatex2PDF(String filePath) {
+		Path p = new Path(filePath);
+		wincmd = new CoreCommand();
+		wincmd.executePDFLatexCommand(p.toOSString(), p.toFile().getParent());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action
+	 * .IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		constraint = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof NestedConstraint) {
+				constraint = (NestedConstraint) first;
+				System.out.println(constraint.getName() + " " + constraint.eClass().getEPackage().getName());
+			}
+		}
+		action.setEnabled(constraint != null);
+	}
+
+	private void openPDF(File pdfFile) {
+		if (pdfFile.exists()) {
+			wincmd = new CoreCommand();
+			wincmd.desktopRun(pdfFile);
+		} else {
+			System.out.println("The PDF file is not found");
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.
+	 * action.IAction, org.eclipse.ui.IWorkbenchPart)
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintOpenActionShortVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintOpenActionShortVersion.java
new file mode 100644
index 0000000..90f3a3f
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintOpenActionShortVersion.java
@@ -0,0 +1,125 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.CoreCommand;
+import de.unimarburg.swt.ocl2ac.utils.printer.NestedConditionPrinter;
+import graph.util.extensions.Constants;
+import nestedcondition.NestedConstraint;
+
+
+public class NGCPrintOpenActionShortVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+
+	// Nested graph constraint:
+	protected NestedConstraint constraint;
+
+	private CoreCommand wincmd;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		print();
+	}
+
+	/*
+	 * Print the graph constraint to the console
+	 */
+	protected void print() {
+		if (constraint != null) {
+
+			NestedConditionPrinter nestedConditionPrinter = new NestedConditionPrinter(constraint, true);
+			nestedConditionPrinter.printDocument();
+
+			String filepath = nestedConditionPrinter.getOutputFilePath();
+
+			Thread thread = new Thread() {
+				public void run() {
+					System.out.println("Thread Running");
+					compileLatex2PDF(filepath);
+
+					File texFile = new File(filepath);
+					int lastIndexOf = texFile.getName().lastIndexOf(Constants.TEX);
+					String pdfFileName = texFile.getName().substring(0, lastIndexOf).concat(".pdf");
+					File pdfFile = new File(texFile.getParent(), pdfFileName);
+					System.err.println(pdfFile.getPath());
+
+					if (!pdfFile.exists()) {
+						System.err.println("The PDF file of the generated latex is not produced.");
+					} else {
+						openPDF(pdfFile);
+					}
+				}
+			};
+			thread.start();
+
+		}
+	}
+
+	/**
+	 * 
+	 * @param filePath
+	 */
+	private void compileLatex2PDF(String filePath) {
+		Path p = new Path(filePath);
+		wincmd = new CoreCommand();
+		wincmd.executePDFLatexCommand(p.toOSString(), p.toFile().getParent());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action
+	 * .IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		constraint = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof NestedConstraint) {
+				constraint = (NestedConstraint) first;
+				System.out.println(constraint.getName() + " " + constraint.eClass().getEPackage().getName());
+			}
+		}
+		action.setEnabled(constraint != null);
+	}
+
+	private void openPDF(File pdfFile) {
+		if (pdfFile.exists()) {
+			wincmd = new CoreCommand();
+			wincmd.desktopRun(pdfFile);
+		} else {
+			System.out.println("The PDF file is not found");
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.
+	 * action.IAction, org.eclipse.ui.IWorkbenchPart)
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintViewActionLongVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintViewActionLongVersion.java
new file mode 100644
index 0000000..bb000c1
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintViewActionLongVersion.java
@@ -0,0 +1,126 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.CoreCommand;
+import de.unimarburg.swt.ocl2ac.utils.printer.NestedConditionPrinter;
+import de.unimarburg.swt.ocl2ac.utils.printer.ViewCommand;
+import graph.util.extensions.Constants;
+import nestedcondition.NestedConstraint;
+
+
+public class NGCPrintViewActionLongVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+
+	// Nested graph constraint:
+	protected NestedConstraint constraint;
+
+	private CoreCommand wincmd;
+	File pdfFile = null;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		print();
+	}
+
+	/*
+	 * Print the graph constraint to the console
+	 */
+	protected void print() {
+		if (constraint != null) {
+
+			NestedConditionPrinter nestedConditionPrinter = new NestedConditionPrinter(constraint, false);
+			nestedConditionPrinter.printDocument();
+
+			String filepath = nestedConditionPrinter.getOutputFilePath();
+
+			Thread thread = new Thread() {
+				public void run() {
+					System.out.println("Thread Running");
+					compileLatex2PDF(filepath);
+					File texFile = new File(filepath);
+					int lastIndexOf = texFile.getName().lastIndexOf(Constants.TEX);
+					String pdfFileName = texFile.getName().substring(0, lastIndexOf).concat(".pdf");
+					pdfFile = new File(texFile.getParent(), pdfFileName);
+
+				}
+			};
+
+			thread.start();
+
+			try {
+				thread.join();
+			} catch (InterruptedException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+
+			if (pdfFile != null && !pdfFile.exists()) {
+				System.err.println("The PDF file of the generated latex is not produced.");
+			} else {
+				ViewCommand.openView(pdfFile);
+			}
+
+		}
+
+	}
+
+	/**
+	 * 
+	 * @param filePath
+	 */
+	private void compileLatex2PDF(String filePath) {
+		Path p = new Path(filePath);
+		wincmd = new CoreCommand();
+		wincmd.executePDFLatexCommand(p.toOSString(), p.toFile().getParent());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action
+	 * .IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		constraint = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof NestedConstraint) {
+				constraint = (NestedConstraint) first;
+				System.out.println(constraint.getName() + " " + constraint.eClass().getEPackage().getName());
+			}
+		}
+		action.setEnabled(constraint != null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.
+	 * action.IAction, org.eclipse.ui.IWorkbenchPart)
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintViewActionShortVersion.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintViewActionShortVersion.java
new file mode 100644
index 0000000..555dce7
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/printer/actions/NGCPrintViewActionShortVersion.java
@@ -0,0 +1,125 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.printer.actions;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import de.unimarburg.swt.ocl2ac.utils.printer.CoreCommand;
+import de.unimarburg.swt.ocl2ac.utils.printer.NestedConditionPrinter;
+import de.unimarburg.swt.ocl2ac.utils.printer.ViewCommand;
+import graph.util.extensions.Constants;
+import nestedcondition.NestedConstraint;
+
+public class NGCPrintViewActionShortVersion implements IObjectActionDelegate {
+
+	// Workbench part:
+	protected IWorkbenchPart workbenchPart;
+
+	// Nested graph constraint:
+	protected NestedConstraint constraint;
+
+	private CoreCommand wincmd;
+	File pdfFile = null;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)
+	 */
+	public void run(IAction action) {
+		print();
+	}
+
+	/*
+	 * Print the graph constraint to the console
+	 */
+	protected void print() {
+		if (constraint != null) {
+
+			NestedConditionPrinter nestedConditionPrinter = new NestedConditionPrinter(constraint, true);
+			nestedConditionPrinter.printDocument();
+
+			String filepath = nestedConditionPrinter.getOutputFilePath();
+
+			Thread thread = new Thread() {
+				public void run() {
+					System.out.println("Thread Running");
+
+					compileLatex2PDF(filepath);
+					File texFile = new File(filepath);
+					int lastIndexOf = texFile.getName().lastIndexOf(Constants.TEX);
+					String pdfFileName = texFile.getName().substring(0, lastIndexOf).concat(".pdf");
+					pdfFile = new File(texFile.getParent(), pdfFileName);
+					System.err.println(pdfFile.getPath());
+
+				}
+			};
+
+			thread.start();
+			try {
+				thread.join();
+			} catch (InterruptedException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+
+			if (pdfFile != null && !pdfFile.exists()) {
+				System.err.println("The PDF file of the generated latex is not produced.");
+			} else {
+				ViewCommand.openView(pdfFile);
+			}
+
+		}
+	}
+
+	/**
+	 * 
+	 * @param filePath
+	 */
+	private void compileLatex2PDF(String filePath) {
+		Path p = new Path(filePath);
+		wincmd = new CoreCommand();
+		wincmd.executePDFLatexCommand(p.toOSString(), p.toFile().getParent());
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action
+	 * .IAction, org.eclipse.jface.viewers.ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+		constraint = null;
+		if (selection instanceof IStructuredSelection) {
+			Object first = ((IStructuredSelection) selection).getFirstElement();
+			if (first instanceof NestedConstraint) {
+				constraint = (NestedConstraint) first;
+				System.out.println(constraint.getName() + " " + constraint.eClass().getEPackage().getName());
+			}
+		}
+		action.setEnabled(constraint != null);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.
+	 * action.IAction, org.eclipse.ui.IWorkbenchPart)
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart part) {
+
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/viewer/PDFViewer.java b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/viewer/PDFViewer.java
new file mode 100644
index 0000000..09b9432
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/src/de/unimarburg/swt/ocl2ac/utils/viewer/PDFViewer.java
@@ -0,0 +1,92 @@
+/**
+ * <copyright>
+ * OCL2AC is developed by Nebras Nassar based on an initial version developed by Thorsten Arendt and Jan Steffen Becker.
+ * </copyright>
+ */
+package de.unimarburg.swt.ocl2ac.utils.viewer;
+
+import org.eclipse.jface.action.IMenuManager;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.browser.CloseWindowListener;
+import org.eclipse.swt.browser.WindowEvent;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.part.ViewPart;
+
+public class PDFViewer extends ViewPart {
+
+	public static final String ID = "nas.ocl2ac.viewer.PDFViewer"; //$NON-NLS-1$
+	public static String pdfpath;
+	public static Browser browser;
+
+	/**
+	 * @wbp.parser.constructor
+	 */
+	public PDFViewer() {
+	}
+
+	@Override
+	public void createPartControl(Composite parent) {
+		{
+			browser = new Browser(parent, SWT.NONE);
+			browser.addCloseWindowListener(new CloseWindowListener() {
+				public void close(WindowEvent event) {
+					pdfpath = null;
+					browser.setUrl(null);
+					browser = null;
+				}
+			});
+			if (getPdfpath() != null)
+				browser.setUrl(getPdfpath());
+		}
+
+		createActions();
+		initializeToolBar();
+		initializeMenu();
+	}
+
+	public void dispose() {
+		super.dispose();
+	}
+
+	/**
+	 * Create the actions.
+	 */
+	private void createActions() {
+		// Create the actions
+
+	}
+
+	public static void update(String pdfpath) {
+		browser.setUrl(pdfpath);
+	}
+
+	/**
+	 * Initialize the toolbar.
+	 */
+	private void initializeToolBar() {
+		IToolBarManager tbm = getViewSite().getActionBars().getToolBarManager();
+	}
+
+	/**
+	 * Initialize the menu.
+	 */
+	private void initializeMenu() {
+		IMenuManager manager = getViewSite().getActionBars().getMenuManager();
+	}
+
+	@Override
+	public void setFocus() {
+		// Set the focus
+	}
+
+	public String getPdfpath() {
+		return pdfpath;
+	}
+
+	public void setPdfpath(String pdfpath) {
+		PDFViewer.pdfpath = pdfpath;
+	}
+
+}
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/supplementary/tex/texstyles/tikz-cellular.sty b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/supplementary/tex/texstyles/tikz-cellular.sty
new file mode 100644
index 0000000..c2c7434
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/supplementary/tex/texstyles/tikz-cellular.sty
@@ -0,0 +1,153 @@
+% PGF+TikZ cell tower and mobile phone, 2006-11-19 Christian Zuckschwerdt
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BEGIN Dependencies
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatletter%
+ \RequirePackage{tikz}%
+ \usetikzlibrary{shapes,arrows,snakes}
+%\RequirePackage{tikz-circlesnarrows}% soft dependency (only for test)
+%\RequirePackage{color}% soft dependency (only for test)
+%\RequirePackage{tikz-colornstyles}% soft dependency (only for some graphics)
+ \@ifundefined{color}{%
+  \gdef\color#1{}%
+ }{}%
+ \@ifundefined{srule}{%
+  \gdef\srule#1#2#3{\ensuremath{\left\langle #1\leftarrow #2\rightarrow #3\right\rangle}}
+ }{}%
+ \@ifundefined{debug}{%
+  \gdef\debug#1{}%
+ }{}%
+\makeatother
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% END Dependencies
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BEGIN cellular
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\cnageneraldebug#1{
+  \draw[overlay,-,line width=0.01pt,red]  (current bounding box.east)|-#1-|(current bounding box.west);
+  \draw[overlay,-,line width=0.01pt,green](current bounding box.west)--(current bounding box.east);% center
+  \draw[overlay,-,line width=0.01pt,blue] (current bounding box.south west) rectangle (current bounding box.north east);% bounding box
+}
+% mobile phone
+\newcommand{\phone}{%
+\begin{tikzpicture}[x=1ex,y=1ex,baseline] % scaled to match an M
+\path[use as bounding box] (-.4,-.1) rectangle (1.4,1.7); % fixed size: 1.8ex by 1.8ex
+\filldraw[solid,rounded corners=.1ex,even odd rule] (0,0) rectangle (1,1.5) 
+                                              (0.15,0.6) [rounded corners=.08ex] rectangle (0.85,1.35);
+\filldraw[solid,rounded corners=.1ex] (0.8,1.35) rectangle (1,1.9);
+\debug{
+  \cnageneraldebug{(0,0)}
+  \draw[-,line width=0.01pt,blue] (.5,.8) circle (1); % bounding circle
+}
+\end{tikzpicture}
+}
+
+% cell tower
+\newcommand{\tower}{%
+\begin{tikzpicture}[x=1ex,y=1ex,baseline] % scaled to match an M
+\path[use as bounding box] (.1,0) rectangle (1.9,1.8); % fixed size: 1.8ex by 1.8ex
+\draw[fill] (1,0.9) -- (1.3,0) -- (0.7,0) -- cycle 
+            (1,1.2) circle (.12);
+\draw[snake=expanding waves,segment length=.4ex,segment angle=45,line width=.2ex] (1.06,1.2) -- (2,1.2)
+                                                                                  (0.94,1.2) -- (0,1.2);
+\debug{
+  \cnageneraldebug{(0,0)}
+  \draw[-,line width=0.01pt,blue] (1,0.9) circle (1); % bounding circle
+}
+\end{tikzpicture}
+}
+
+\newcommand{\link}{%
+\begin{tikzpicture}[>=stealth,baseline,line width=0.15ex]
+\path[use as bounding box] (0,0) rectangle (1.8ex,1.8ex); % fixed size: 1.8ex by 1.8ex
+\draw[->] (.7ex,.6ex) -- (1.8ex,.6ex);
+\draw[->] (1.1ex,1.2ex) -- (0ex,1.2ex);
+\debug{\cnageneraldebug{(0,0)}}
+\end{tikzpicture}
+}
+
+\def\phonelabel{\phone}
+\def\linklabel{\link}
+\def\towerlabel{\tower}
+% text fitting
+\newcommand{\Phone}{\phone\hspace{-.3ex}}
+\newcommand{\Tower}{\tower}
+%\newcommand{\PhoneDash}{\phone\hspace{-.6ex}-}
+%\newcommand{\TowerDash}{\tower\hspace{-.3ex}-}
+
+% node styles
+\tikzstyle{phone}=[smoothblue,circle,thick,inner sep=.4pt]
+\tikzstyle{tower}=[smoothred,circle,thick,inner sep=.4pt]
+\tikzstyle{link}=[smoothgreen,circle,thick,inner sep=.4pt]
+\tikzstyle{every to}=[>=latex,thick]
+
+% simple drawing
+\newcommand{\PhoneNb}[2]{++(1,0) node[phone,name=#1,label=below:\scriptsize#2] {\footnotesize\phone}}
+\newcommand{\TowerNb}[2]{++(1,0) node[tower,name=#1,label=below:\scriptsize#2] {\footnotesize\tower}}
+\newcommand{\PhoneN}[2]{++(1,0) node[phone,name=#1,label=below right:\scriptsize#2] {\footnotesize\phone}}
+\newcommand{\TowerN}[2]{++(1,0) node[tower,name=#1,label=below right:\scriptsize#2] {\footnotesize\tower}}
+\newcommand{\LinkN}[2]{++(1,0)  node [link,name=#1,label=below right:\scriptsize#2] {\footnotesize\link}}
+\newcommand{\Diredge}[3][]{\draw [->]           (#2) to node[below] {\scriptsize#1} (#3);}% this used to be \Arrow
+\newcommand{\Bow}[3][]{\draw [->,bend right=25] (#2) to node[below] {\scriptsize#1} (#3);}
+\newcommand{\boW}[3][]{\draw [->,bend left=25]  (#2) to node[above] {\scriptsize#1} (#3);}
+\newcommand{\BiDi}[2]{\draw [->,bend left=15]   (#1) to (#2); \draw (#2) [->,bend left=15] to (#1);}
+% \newcommand{\Graph}[2]{\begin{tikzpicture}[baseline=-.8ex,inner sep=1pt]\draw#1;#2\end{tikzpicture}}%is defined above and in tikz-enforce-environment.sty
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% END cellular
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BEGIN shortcuts
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\TowerNode}[1]{\Graph{\TowerN{}{#1}}{}}
+\newcommand{\PhoneNode}[1]{\Graph{\PhoneN{}{#1}}{}}
+\newcommand{\TowerToTower}[2]{\Graph{\TowerN{T}{#1}\TowerN{U}{#2}}{\Diredge{T}{U}}}
+\newcommand{\TowerTower}[2]{\Graph{\TowerN{}{#1}\TowerN{}{#2}}{}}
+\newcommand{\PhoneTower}[2]{\Graph{\PhoneN{}{#1}\TowerN{}{#2}}{}}
+\newcommand{\PhoneArrowTower}[2]{\Graph{\PhoneN{A}{#1}\TowerN{B}{#2}}{\Diredge{A}{B}}}
+\newcommand{\PhoneLArrowTower}[2]{\Graph{\PhoneN{A}{#1}\TowerN{B}{#2}}{\Diredge{B}{A}}}
+\newcommand{\TowerArrowPhone}[2]{\Graph{\TowerN{A}{#1}\PhoneN{B}{#2}}{\Diredge{A}{B}}}
+\newcommand{\TowerLArrowPhone}[2]{\Graph{\TowerN{A}{#1}\PhoneN{B}{#2}}{\Diredge{B}{A}}}
+\newcommand{\TowerFromPhoneFromTower}[3]{\Graph{\TowerN{T}{#1}\PhoneN{A}{#2}\TowerN{U}{#3}}{\Diredge{A}{T}\Diredge{U}{A}}}
+\newcommand{\TowerToPhoneToTower}[3]{\Graph{\TowerN{T}{#1}\PhoneN{A}{#2}\TowerN{U}{#3}}{\Diredge{T}{A}\Diredge{A}{U}}}
+\newcommand{\TowerToPhoneFromTower}[3]{\Graph{\TowerN{T}{#1}\PhoneN{A}{#2}\TowerN{U}{#3}}{\Diredge{T}{A}\Diredge{U}{A}}}
+\newcommand{\TowerToTowerToPhone}[3]{\Graph{\TowerN{T}{#1}\TowerN{U}{#2}\PhoneN{A}{#3}}{\Diredge{T}{U}\Diredge{U}{A}}}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% END shortcuts
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\printcmyk#1{#1}
+\definecolor{testrgb}{rgb}{0.9999,0.0001,0.0001}\def\testrgb{\color{testrgb}}
+\definecolor{testcmyk}{cmyk}{0.9999,0.0001,0.0001,0.0001}\def\testcmyk{\color{testcmyk}}
+\definecolor{testgray}{gray}{.4999}\def\testgray{\color{testgray}}
+\def\forallsizes#1{{\tiny #1}{\scriptsize #1}{\footnotesize #1}{\small #1}{\normalsize #1}{\large #1}{\Large #1}{\LARGE #1}{\huge #1}{\Huge #1}}
+\def\forallsizesnamed#1{{\tiny tiny: #1}{\scriptsize scriptsize: #1}{\footnotesize footnotesize: #1}{\small small: #1}{\normalsize normalsize: #1}{\large large: #1}{\Large Large: #1}{\LARGE LARGE: #1}{\huge huge: #1}{\Huge Huge: #1}}
+\def\forallcolors#1{{#1}{\testrgb #1}{\color{blue} #1}{\color{green} #1}\printcmyk{{\testcmyk #1}{\color{magenta} #1}{\color{yellow} #1}}{\color{white} #1}{\testgray #1}{\color{black} #1}}%
+\def\forallRGBcolors#1{{#1}{\color{red} #1}{\color{blue} #1}{\color{green} #1}}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BEGIN test
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\testtikzCellular}{
+%\def\debug##1{##1}
+In this file, cellular net components such as ``phone'' ($\phone$), ``tower'' ($\tower$) and ``Link'' ($\link$) are defined.
+\subsection{some examples}
+% $$\TowerToTowerToPhone{1}{2}{3}$$
+% 
+% $$\srule{ \Graph{ \TowerN{T}{3}\PhoneN{A}{1}\TowerN{U}{2} }{ \Diredge{A}{T}\Diredge{U}{A}\Bow{U}{T} } }
+% 	{ \Graph{ \TowerN{T}{3}\PhoneN{A}{1}\TowerN{U}{2} }{ \Bow{U}{T} } }
+% 	{ \Graph{ \TowerN{T}{3}\PhoneN{A}{1}\TowerN{U}{2} }{ \Diredge{T}{A}\Diredge{A}{U}\Bow{U}{T} } }$$
+
+\subsection{various colors and sizes}
+
+\forallcolors{$(M\ \tower\ \phone\ \link)$ }
+
+\forallsizes{$(M\ \tower\ \phone\ \link)$ }
+
+\subsection{in circles}
+$$(M\ \Circle{\phone}{}\ \Circle{\tower}{}\ \Circle{\link}{})
+\quad \mbox{\Huge $(M\ \Circle{\phone}{}\ \Circle{\tower}{}\ \Circle{\link}{})$}$$
+
+\forallsizes{(M\Circle{\tower}{}) }
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% END test
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ No newline at end of file
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/supplementary/tex/texstyles/tikz-extension.sty b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/supplementary/tex/texstyles/tikz-extension.sty
new file mode 100644
index 0000000..e31f473
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/supplementary/tex/texstyles/tikz-extension.sty
@@ -0,0 +1,150 @@
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BEGIN Dependencies
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\RequirePackage{tikz}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% END Dependencies
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BEGIN tikz-extension
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatletter
+\tikzoption{strictly right of}{      \tikz@strictlyof{#1}{west}      {  0}{east}}%
+\tikzoption{strictly above right of}{\tikz@strictlyof{#1}{south west}{ 45}{north east}}%
+\tikzoption{strictly above of}{      \tikz@strictlyof{#1}{south}     { 90}{north}}%
+\tikzoption{strictly above left of}{ \tikz@strictlyof{#1}{south east}{135}{north west}}%
+\tikzoption{strictly left of}{       \tikz@strictlyof{#1}{east}      {180}{west}}%
+\tikzoption{strictly below left of}{ \tikz@strictlyof{#1}{north east}{225}{south west}}%
+\tikzoption{strictly below of}{      \tikz@strictlyof{#1}{north}     {270}{south}}%
+\tikzoption{strictly below right of}{\tikz@strictlyof{#1}{north west}{315}{south east}}%
+% \tikzoption{strictly above half right of}{\tikz@strictlyof{#1}{south}{ 45}{north east}}%
+% \tikzoption{strictly above half left of}{ \tikz@strictlyof{#1}{south}{135}{north west}}%
+% \tikzoption{strictly below half left of}{ \tikz@strictlyof{#1}{north}{225}{south west}}%
+% \tikzoption{strictly below half right of}{\tikz@strictlyof{#1}{north}{315}{south east}}%
+\tikzoption{strictly above half right of}{\tikz@strictlyof{#1}{south west}{ 45}{north}}%
+\tikzoption{strictly above half left of}{ \tikz@strictlyof{#1}{south east}{135}{north}}%
+\tikzoption{strictly below half left of}{ \tikz@strictlyof{#1}{north east}{225}{south}}%
+\tikzoption{strictly below half right of}{\tikz@strictlyof{#1}{north west}{315}{south}}%
+% \tikzoption{strictly above half right of}{\tikz@strictlyof{#1}{south west}{ 90}{north}}%
+% \tikzoption{strictly above half left of}{ \tikz@strictlyof{#1}{south east}{ 90}{north}}%
+% \tikzoption{strictly below half left of}{ \tikz@strictlyof{#1}{north east}{270}{south}}%
+% \tikzoption{strictly below half right of}{\tikz@strictlyof{#1}{north west}{270}{south}}%
+%%%%%%%%%%%%%%%
+\tikzoption{strictly half above right of}{\tikz@strictlyof{#1}{south west}{ 45}{east}}%
+\tikzoption{strictly half above left of}{ \tikz@strictlyof{#1}{south east}{135}{west}}%
+\tikzoption{strictly half below left of}{ \tikz@strictlyof{#1}{north east}{225}{west}}%
+\tikzoption{strictly half below right of}{\tikz@strictlyof{#1}{north west}{315}{east}}%
+\def\tikz@strictlyof#1#2#3#4{%1 parent node %2 child anchor %3 angle %4 parent anchor
+  \def\tikz@anchor{#2}%
+  \let\tikz@do@auto@anchor=\relax%
+  \let\tikzparentnode=\tikz@last@fig@name%
+  \tikz@addtransform{\pgftransformshift{\pgfpointpolar{#3}{\tikz@node@distance}}}%
+  \def\tikz@node@at{\pgfpointanchor{#1}{#4}}
+}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% END tikz-extension
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BEGIN useful macros
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\lastnode}{\tikz@last@fig@name}
+\newcommand{\savenode}{\global\edef\savednode{\lastnode}}
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% END useful macros
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BEGIN shape threerectangle
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\pgfdeclareshape{threerectangle}{%
+  \inheritsavedanchors[from=rectangle] % this is a rectangle
+  \inheritanchorborder[from=rectangle]
+  \inheritanchor[from=rectangle]{north}
+  \inheritanchor[from=rectangle]{north west}
+  \inheritanchor[from=rectangle]{north east}
+  \inheritanchor[from=rectangle]{center}
+  \inheritanchor[from=rectangle]{west}
+  \inheritanchor[from=rectangle]{east}
+  \inheritanchor[from=rectangle]{mid}
+  \inheritanchor[from=rectangle]{mid west}
+  \inheritanchor[from=rectangle]{mid east}
+  \inheritanchor[from=rectangle]{base}
+  \inheritanchor[from=rectangle]{base west}
+  \inheritanchor[from=rectangle]{base east}
+  \inheritanchor[from=rectangle]{south}
+  \inheritanchor[from=rectangle]{south west}
+  \inheritanchor[from=rectangle]{south east}
+  %
+  % Background path
+  %
+  \backgroundpath{%
+    \pgfpathrectanglecorners% original rectangle
+    {\pgfpointadd{\southwest}{\pgfpoint{\pgfshapeouterxsep}{\pgfshapeouterysep}}}
+    {\pgfpointadd{\northeast}{\pgfpointscale{-1}{\pgfpoint{\pgfshapeouterxsep}{\pgfshapeouterysep}}}}
+    \def\len{0.4ex}
+    \def\dlen{0.8ex}
+%     \pgfpathmoveto{\pgfpointadd{\northwest}{\pgfpoint{\len}{0pt}}}
+%     \pgfpathlineto{\pgfpointadd{\northwest}{\pgfpoint{\len}{\len}}}
+%     \pgfpathlineto{\pgfpointadd{\northeast}{\pgfpoint{\len}{\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southeast}{\pgfpoint{\len}{\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southeast}{\pgfpoint{0pt}{\len}}}
+%     \pgfpathmoveto{\pgfpointadd{\northwest}{\pgfpoint{0pt}{-\len}}}
+%     \pgfpathlineto{\pgfpointadd{\northwest}{\pgfpoint{-\len}{-\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southwest}{\pgfpoint{-\len}{-\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southeast}{\pgfpoint{-\len}{-\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southeast}{\pgfpoint{-\len}{0pt}}}
+%
+%     \pgfpathmoveto{\pgfpointadd{\northeast}{\pgfpoint{-\len}{0pt}}}
+%     \pgfpathlineto{\pgfpointadd{\northeast}{\pgfpoint{-\len}{\len}}}
+%     \pgfpathlineto{\pgfpointadd{\northwest}{\pgfpoint{-\len}{\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southwest}{\pgfpoint{-\len}{\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southwest}{\pgfpoint{0pt}{\len}}}
+%     \pgfpathmoveto{\pgfpointadd{\northeast}{\pgfpoint{0pt}{-\len}}}
+%     \pgfpathlineto{\pgfpointadd{\northeast}{\pgfpoint{\len}{-\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southeast}{\pgfpoint{\len}{-\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southwest}{\pgfpoint{\len}{-\len}}}
+%     \pgfpathlineto{\pgfpointadd{\southwest}{\pgfpoint{\len}{0pt}}}
+%
+    \pgfpathmoveto{\pgfpointadd{\northeast}{\pgfpoint{0pt}{-\len}}}
+    \pgfpathlineto{\pgfpointadd{\northeast}{\pgfpoint{\len}{-\len}}}
+    \pgfpathlineto{\pgfpointadd{\southeast}{\pgfpoint{\len}{-\len}}}
+    \pgfpathlineto{\pgfpointadd{\southwest}{\pgfpoint{\len}{-\len}}}
+    \pgfpathlineto{\pgfpointadd{\southwest}{\pgfpoint{\len}{0pt}}}
+    \pgfpathmoveto{\pgfpointadd{\northeast}{\pgfpoint{\len}{-\dlen}}}
+    \pgfpathlineto{\pgfpointadd{\northeast}{\pgfpoint{\dlen}{-\dlen}}}
+    \pgfpathlineto{\pgfpointadd{\southeast}{\pgfpoint{\dlen}{-\dlen}}}
+    \pgfpathlineto{\pgfpointadd{\southwest}{\pgfpoint{\dlen}{-\dlen}}}
+    \pgfpathlineto{\pgfpointadd{\southwest}{\pgfpoint{\dlen}{-\len}}}
+  }
+}
+  \def\northwest{%
+    \southwest
+    \pgf@xa=\pgf@x
+    \northeast
+    \pgf@x=\pgf@xa
+  }
+  \def\southeast{%
+    \northeast
+    \pgf@xa=\pgf@x
+    \southwest
+    \pgf@x=\pgf@xa
+  }
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% END shape threerectangle
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% BEGIN test
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\newcommand{\testtikzExtension}{%
+In this file, the tikzoptions ``strictly $\ldots$ of'' are defined.
+Furthermore, the shape ``threerectangle'' is defined.
+\subsection{shape threerectangle}
+\tikz{%
+ \node[shape=threerectangle,draw=.](content){Hallo};
+ \node[shape=threerectangle,draw=.](content2)[strictly right of=content]{Welt};
+ \draw[draw=.](content) -- (content2);
+}%
+}%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% END test
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\makeatother
\ No newline at end of file
diff --git a/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/supplementary/tex/texstyles/tikz-vcond.sty b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/supplementary/tex/texstyles/tikz-vcond.sty
new file mode 100644
index 0000000..d716ff3
--- /dev/null
+++ b/plugins/ocl2ac/de.unimarburg.swt.ocl2ac.utils/supplementary/tex/texstyles/tikz-vcond.sty
@@ -0,0 +1,305 @@
+\RequirePackage{array}
+\RequirePackage{tikz}
+\usetikzlibrary{calc}
+\RequirePackage{stmaryrd}
+%% == Allgemeine Definitionen ==============================================
+\makeatletter%
+\def\ifEmpty#1{\def\@temp{#1}\ifx\@temp\@empty}
+\makeatother
+
+%TODO baseline verträgt sich nicht mit beamertheme Warsaw
+\tikzset{
+  baseline={($(current bounding box.center)-(0,1ex)$)},
+  inner sep=1pt,
+  % Style für Class Nodes
+  CN/.style={draw,shape=rectangle split,rectangle split parts=2,inner sep=1pt,minimum width=1em,rectangle split every empty part={}},
+}
+
+%% == Graphen Malen ========================================================
+%\Hyperedge[Optionen]{Kantenbezeichner}{Knoten1,Knoten2,...,KnotenN}{Position}
+% Malt eine Hyperkante als Rechteck mit /Kantenbezeichner/ darin.
+% Die Knoten werden als Komma-getrennte Liste angegeben.
+% Nach einem Doppelpunkt hinter dem Knotennamen könnne Optionen für deren Position angegeben werden, z.B. {2:{pos=0.5,above=2pt},3,4:right}
+% Das Rechteck wird automatisch im Mittelpunkt der verbundenen Knoten gezeichnet, wenn keine Optionen angegeben sind. Ansonsten kann manuell positioniert werden.
+\newcommand\Hyperedge[4][]{
+  \ifx\thetentakel\undefined\newcounter{tentakel}\else{}\fi% Tentakel-Zähler definieren. The Tentakel, grusel!
+  \setcounter{tentakel}{0}%
+  \def\lposition{}% Position des Hyperkanten-Labels
+  \foreach \Head in {#3} {%
+    \HyperedgeSplitColon{\Head}% Head = HeadN:HeadP
+    \stepcounter{tentakel}
+    \edef\nlposition{\lposition ++(\HeadN)}%
+    \global\let\lposition\nlposition%
+  }%
+  \ifEmpty{#4}% Positionierung entweder automatisch zentriert ...
+    \edef\lposition{\lposition[scale=1/\thetentakel]}%
+  \else% ... oder manuell mit dem optionalen Argument.
+    \def\lposition{#4}%
+  \fi%
+  \ifEmpty{#3}\edef\lposition{#4}\fi% Division durch 0 verhindern
+  \draw \lposition node[draw,shape=rectangle,inner sep=2pt,minimum size=1ex] (Hyperedge) {$#2$};%
+  \setcounter{tentakel}{0}%
+  \foreach \Head in {#3} {% Malen und Beschriften der Tentakel
+    \addtocounter{tentakel}{1}%
+    \HyperedgeSplitColon{\Head}% Head = HeadN:HeadP
+    \draw[-] (Hyperedge) -- (\HeadN) node[\HeadP,pos=0.85,#1]{\tiny\thetentakel};%
+  }%
+}
+
+%\HyperedgeSimple[Optionen]{Label}{Source-Node}{Target-Node}
+% Zeichnet eine Hyperkante mit 2 Tentakeln als normale Kante mit Label (Kurzform).
+\newcommand\HyperedgeSimple[4][]{
+  \draw[->] (#3) to node[above=-1pt,shape=rectangle,inner sep=2pt,minimum size=1ex,pos=0.5,#1]{\small $#2$} (#4);
+}
+
+% HyperedgeSplitColon: Hilfsfunktion, die in Komma-separierten Listen die Elemente aufspaltet.
+% Syntax des Elements: "A:B" oder "A".
+\def\HyperedgeSplitColon#1{%
+  \edef\@tempa{#1:}%
+  \expandafter\HyperedgeSplitColonA\@tempa\relax
+}
+\def\HyperedgeSplitColonB#1:\relax{#1}
+\def\HyperedgeSplitColonA#1:#2\relax{%
+  \edef\HeadN{#1}%
+  \ifx\relax#2\relax%
+  \edef\HeadP{auto}%
+  \else%
+  \edef\HeadP{\HyperedgeSplitColonB#2\relax}%
+  \fi%
+}
+
+\def\nnodepr(#1)#2{              \node(#1)[   inner sep=0.5pt,label=below:{\tiny $#2$},label distance=-1pt]{$\bullet$};}
+\def\nnodepro(#1)#2{             \node(#1)[   inner sep=0.5pt,label=above:{\tiny $#2$},label distance=-1pt]{$\bullet$};}
+\def\nnodepbr(#1)[#2]#3{         \node(#1)[#2,inner sep=0.5pt,label=below:{\tiny $#3$},label distance=-1pt]{$\bullet$};}
+\def\nnodepbro(#1)[#2]#3{        \node(#1)[#2,inner sep=0.5pt,label=above:{\tiny $#3$},label distance=-1pt]{$\bullet$};}
+\def\nnodepabr(#1)at(#2)[#3]#4;{ \node[       inner sep=0.5pt,label=below:{\tiny $#4$},label distance=-1pt](#1) at (#2) [#3]{$\bullet$};}
+\def\nnodepabro(#1)at(#2)[#3]#4;{\node[       inner sep=0.5pt,label=above:{\tiny $#4$},label distance=-1pt](#1) at (#2) [#3]{$\bullet$};}
+\def\unodepr(#1)#2{              \node(#1)[   inner sep=0.5pt,label=below:{\tiny $#2$},label distance=-1pt]{$\circ$};}
+\def\unodepro(#1)#2{             \node(#1)[   inner sep=0.5pt,label=above:{\tiny $#2$},label distance=-1pt]{$\circ$};}
+\def\unodepbr(#1)[#2]#3{         \node(#1)[#2,inner sep=0.5pt,label=below:{\tiny $#3$},label distance=-1pt]{$\circ$};}
+\def\unodepbro(#1)[#2]#3{        \node(#1)[#2,inner sep=0.5pt,label=above:{\tiny $#3$},label distance=-1pt]{$\circ$};}
+\def\unodepabr(#1)at(#2)[#3]#4;{ \node[       inner sep=0.5pt,label=below:{\tiny $#4$},label distance=-1pt](#1) at (#2) [#3]{$\circ$};}
+\def\unodepabro(#1)at(#2)[#3]#4;{\node[       inner sep=0.5pt,label=above:{\tiny $#4$},label distance=-1pt](#1) at (#2) [#3]{$\circ$};}
+
+%% == Kommandos für HR-Conditions =========================================
+\newenvironment{HRCondition}{\par\begin{equation*}\begin{array}{ll}}{\end{array}\end{equation*}} %TODO: Echten Absatz einfügen. Noch besser wäre eine ensuremath-ähnliche Lösung.
+\newcommand\HRcondition[1]{\ensuremath{#1}}
+%% Morphismen. Das Präfix gibt an, wie Bedingungen und Morphismen zu verstehen sind:
+%% - M steht für "Morphism" und bedeutet, dass Parameter #1 und #2 als "echter"
+%%   Morphismus #1 --> #2 dargestellt wird.
+%%   Ohne M wird von einem Morphismus P-->Q nur der Graph Q dargestellt.
+%% - S steht für "Short/Simple/Single" und bedeutet, dass keine Teilbedingung
+%%   dargestellt wird (bzw. implizit Teilbedingung "true").
+%% Die "Standard"-Variante benutzt also die Kurzform für Morphismen und Teilbedingungen.
+\newcommand\cExists[3][]   {\exists  \left( \cMorphismS[#1]{#2}\ , #3    \right)}
+\newcommand\cNExists[3][]  {\nexists \left( \cMorphismS[#1]{#2}\ , #3    \right)}
+\newcommand\cForall[3][]   {\forall  \left( \cMorphismS[#1]{#2}\ , #3    \right)}
+\newcommand\cNForall[3][]  {\nforall \left( \cMorphismS[#1]{#2}\ , #3    \right)}
+\newcommand\cExistsS[2][]  {\exists  \left( \cMorphismS[#1]{#2}        \right)}
+\newcommand\cNExistsS[2][] {\nexists \left( \cMorphismS[#1]{#2}        \right)}
+\newcommand\cForallS[2][]  {\forall  \left( \cMorphismS[#1]{#2}        \right)}
+\newcommand\cNForallS[2][] {\nforall \left( \cMorphismS[#1]{#2}        \right)}
+\newcommand\cExistsM[4][]  {\exists  \left( \cMorphism[#1]{#2}{#3}\ , #4 \right)}
+\newcommand\cNExistsM[4][] {\nexists \left( \cMorphism[#1]{#2}{#3}\ , #4 \right)}
+\newcommand\cForallM[4][]  {\forall  \left( \cMorphism[#1]{#2}{#3}\ , #4 \right)}
+\newcommand\cNForallM[4][] {\nforall \left( \cMorphism[#1]{#2}{#3}\ , #4 \right)}
+\newcommand\cExistsSM[3][] {\exists  \left( \cMorphism[#1]{#2}{#3}     \right)}
+\newcommand\cNExistsSM[3][]{\nexists \left( \cMorphism[#1]{#2}{#3}     \right)}
+\newcommand\cForallSM[3][] {\forall  \left( \cMorphism[#1]{#2}{#3}     \right)}
+\newcommand\cNForallSM[3][]{\nforall \left( \cMorphism[#1]{#2}{#3}     \right)}
+\newcommand\cExistsSub[4][] {\exists  \left( \cGraph[#1]{#2} \raisebox{0.33ex}{$\sqsupseteq$}\; \cGraph{#3}\ , #4 \right)}
+\newcommand\cNExistsSub[4][]{\nexists \left( \cGraph[#1]{#2} \raisebox{0.33ex}{$\sqsupseteq$}\; \cGraph{#3}\ , #4 \right)}
+\newcommand\cForallSub[4][] {\forall  \left( \cGraph[#1]{#2} \raisebox{0.33ex}{$\sqsupseteq$}\; \cGraph{#3}\ , #4 \right)}
+\newcommand\cNForallSub[4][]{\nforall \left( \cGraph[#1]{#2} \raisebox{0.33ex}{$\sqsupseteq$}\; \cGraph{#3}\ , #4 \right)}
+\newcommand\cExSub[4][]{\exists  \left(\cGraph[#1]{#2} \sqsupseteq \cGraph[#1]{#3}\ , #4 \right)}
+\newcommand\cAllSub[4][]{\forall \left(\cGraph[#1]{#2} \sqsupseteq \cGraph[#1]{#3}\ , #4 \right)}
+
+\newcommand\cMorphism[3][]{\cGraph[#1]{#2} \to \cGraph[#1]{#3}}
+\newcommand\cMorphismS[2][]{\cGraph[#1]{#2}}
+\newcommand\cEmpty{\node{$\emptyset$};}
+
+\newcommand\cInclusion[3][]{\cGraph[#1]{#2} \sqsubseteq \cGraph[#1]{#3}}
+
+\newcommand\cGroup[1]{\left({#1}\right)}
+\newcommand\cAnd{\land}
+\newcommand\cOr{\lor}
+\newcommand\cXOr{\underline{\lor}}
+\newcommand\cNeg{\neg}
+\newcommand\cTrue{\mathsc{true}}
+\newcommand\cGraph[2][]{
+  \hspace{-1pt}
+  \tikz[
+  baseline=-1ex, % zentrieren
+  minimum size=2ex, % ungelabelte Kreis-Knoten sollen nicht zu Punkten zusammenfallen
+  scale=1.0, % keine Skalierung
+  inner sep=2pt, % geringer Innenabstand
+  #1] % benutzerdefinierte Optionen
+  {#2}
+  \hspace{-1pt}
+}
+
+%Rules. P=Plain (ohne ac), S=simple(L=>R statt L<-K->R), A=(left) appl. condition
+
+\newcommand\RuleP[3]{\ensuremath{\langle\/ \tikz{#1}\hookleftarrow\tikz{#2}\hookrightarrow\tikz{#3}\/\rangle}}
+\newcommand\RulePS[2]{\ensuremath{\langle\/\tikz{#1} \Rightarrow  \tikz{#2}                   \/\rangle}}
+\newcommand\RuleA[4]{\ensuremath{\langle\/{#1}\hookleftarrow{#2}\hookrightarrow{#3}\/\rangle , #4}}
+\newcommand\RuleAS[4]{\ensuremath{\langle\/ #1 \Rightarrow #2, #3 \/\rangle}}
+
+
+
+%% Load/Save-Funktionalität, um Grafiken wiederverwenden zu können innerhalb einer Formel.
+\newcommand\cSave[2][DEFAULT]{#2%
+  %\pgfkeyssetvalue{/my key}{#2}%\pgfkeysvalueof{my key}
+  \makeatletter%
+  \expandafter\gdef\csname cSavedHRCondition#1\endcsname{#2}%
+  \makeatother%
+}
+\newcommand\cLoad[1][DEFAULT]{%
+  %\pgfkeysvalueof{/my key}
+  \csname cSavedHRCondition#1\endcsname
+}
+
+%% == Häufige Konstrukte ===================================================
+% \nodecircle[Options]{Number of Nodes}{Radius}
+% Draws a number of nodes, arranged in a circle of given radius(tikz units) around (0,0).
+% Also useful for drawing squares and triangles (very rough approximations of a circle).
+% Options include:
+% - label=<style>, where <style> is one of none,num,alpha. default=none
+% - center=<true/false> - draws a node with label 0 in the center if true. default=false.
+% - prefix=<string> - prefix to add in front of node names. default=""
+% - clockwise=<true/false> - determines the direction of drawing the nodes. default=true.
+% - startangle=<deg> - determines the angle of the first point in degrees, clockwise,0°=upwards. default=0°
+% - nodelabel=<string> - symbol to be used to draw nodes (i.e. label).
+\makeatletter
+\define@key{nodecircle}{center}{\node(\ncprefix0){$\nodelabel_0$};}
+\define@key{nodecircle}{prefix}{\def\ncprefix{#1}}
+\def\startangle{0}
+\define@key{nodecircle}{startangle}{\def\startangle{#1}}
+\newcounter{nclabl}
+\define@key{nodecircle}{label}{ \def\nclabel{\csname nclabel@#1\endcsname}}
+\def\nclabel@none#1{}
+\def\nclabel@num#1{#1}
+\def\nclabel@alpha#1{\setcounter{nclabl}{#1}\alph{nclabl}}
+\def\ncnodelabel{$\bullet$}
+\define@key{nodecircle}{nodelabel}{\def\ncnodelabel{#1}}
+\makeatother
+\newcommand\nodecircle[3][]{
+  \def\ncprefix{}
+  \def\nclabel##1{}
+  \setkeys{nodecircle}{#1}
+  \def\winkel{-360/#2+\startangle}
+  \foreach \num in {1,...,#2} {
+    \pgfmathparse{90+(\num-1)*\winkel}
+    \nnodepabr(\ncprefix\num)at(\pgfmathresult:#3)[]{\nclabel{\num}};
+    %\lnodeat(\pgfmathresult:#3)(\nclabel{\num})[]{\ncnodelabel};
+  }
+}
+\newcommand\unodecircle[3][]{\nodecircle[nodelabel={$\circ$},#1]{#2}{#3}}
+
+% \noderow[Options]{Number of Nodes}{Distance}
+% Draws a number of nodes, arranged in a row with given distance(tikz units) between the nodes.
+% Options include:
+% - label=<style>, where <style> is one of none,num,alpha. default=none
+% - prefix=<string> - prefix to add in front of node names. default=""
+\makeatletter
+\define@key{noderow}{prefix}{\def\ncprefix{#1}}
+\define@key{noderow}{label}{\global\def\nclabel{\csname nclabel@#1\endcsname}}
+% These defs are done globally by nodecircle.
+%\newcounter{nclabl}
+\def\nclabel@none#1{}
+\def\nclabel@num#1{#1}
+\def\nclabel@alpha#1{\setcounter{nclabl}{#1}\alph{nclabl}}
+\makeatother
+\newcommand\noderow[3][]{
+  \def\ncprefix{}
+  \def\nclabel##1{}
+  \setkeys{noderow}{#1}
+  \foreach \num in {1,...,#2} {
+    \pgfmathparse{\num-1}
+    \nnodepabr(\ncprefix\num)at(\pgfmathresult, 0)[x=#3]{\nclabel{\num}};
+  }
+}
+
+\newcommand\PPlus[1][]{
+  +_{\scriptscriptstyle\hspace{-0.75ex}#1}
+}
+\makeatletter
+\def\nplabela{\ensuremath{1}}\define@key{nodepath}{node 1 label} {\def\nplabela{#1}}
+\def\nplabelb{\ensuremath{2}}\define@key{nodepath}{node 2 label} {\def\nplabelb{#1}}
+\def\nplabele{\ensuremath{+}}\define@key{nodepath}{edge label}   {\def\nplabele{#1}}
+\def\npnodesymbol{$\bullet$}\define@key{nodepath}{node symbol}   {\def\npnodesymbol{#1}}
+\def\npdist{2.5em}  \define@key{nodepath}{node distance}{\def\npdist{#1}}
+
+\makeatother
+\def\nodepath#1;{%
+  \setkeys{nodepath}{#1}
+  \node(1)[                                 label=below:{\tiny\nplabela},label distance=2pt]{\npnodesymbol};
+  \node(2)[right of=1,node distance=\npdist,label=below:{\tiny\nplabelb},label distance=2pt]{\npnodesymbol};
+  \Hyperedge{\nplabele}{1,2}{}
+%  \ifx\iaoenirdaao\undefined{\Hyperedge{-}{1,2}{}}\else\HyperedgeSimple{\nplabele}{1}{2}\fi
+}
+\def\nodepathS#1;{%
+  \setkeys{nodepath}{#1}%
+  \node(1)[                                 label=below:{\tiny\nplabela},label distance=2pt]{\npnodesymbol};
+  \node(2)[right of=1,node distance=\npdist,label=below:{\tiny\nplabelb},label distance=2pt]{\npnodesymbol};
+  \HyperedgeSimple{\nplabele}{1}{2}
+%  \ifx\iaoenirdaao\undefined{\Hyperedge{-}{1,2}{}}\else\HyperedgeSimple{\nplabele}{1}{2}\fi
+}
+\def\unodepathS#1;{\nodepathS{#1,node symbol={$\circ$}};}
+
+
+\tikzstyle{Class}=[draw,shape=rectangle split,rectangle split parts=2,minimum size=3ex]
+\tikzstyle{SClass}=[draw,shape=rectangle,minimum size=3ex]
+\tikzstyle{NEllipse}=[draw,shape=ellipse,minimum size=3ex]
+\newcommand\gnodelabelClass[2]{#1 \nodepart{two}\begin{tabular}{ll}#2\end{tabular}}
+\makeatletter
+\def\gnodesymbol{$\bullet$}\define@key{grammar}{node symbol}    {\def\gnodesymbol{#1}}
+\def\ghlabel{+}            \define@key{grammar}{hyperedge label}{\def\ghlabel{#1}}
+\def\gnodelabel{}          \define@key{grammar}{node label}     {\def\gnodelabel{#1}}
+\def\gnodestyle{draw,shape=rectangle split,rectangle split parts=2,minimum size=1ex}
+                           \define@key{grammar}{node style}     {\def\gnodestyle{#1}}
+\makeatother
+\newcommand\GrammarPath[1][]{
+  \setkeys{grammar}{#1}%
+  \ensuremath{%
+    \tikz{%
+      \node(1)[                               label=below:{\tiny 1},label distance=2pt]{\gnodesymbol};%
+      \node(2)[right of=1,node distance=2.5em,label=below:{\tiny 2},label distance=2pt]{\gnodesymbol};%
+      \HyperedgeSimple{\ghlabel}{1}{2};%
+    }%
+    ::=%
+    \tikz{%
+      \node(1)[                               label=below:{\tiny 1},label distance=2pt]{\gnodesymbol};%
+      \node(2)[right of=1,node distance=1.5em,label=below:{\tiny 2},label distance=2pt]{\gnodesymbol};%
+      \draw[->] (1) to(2);%
+    }%
+    \ruleor%
+    \tikz{%
+      \node(1)[                               label=below:{\tiny 1},label distance=2pt]{\gnodesymbol};%
+      \node(3)[right of=1,node distance=1.5em,label=below:{\tiny 3},label distance=2pt]{\gnodesymbol};%
+      \node(2)[right of=3,node distance=2.5em,label=below:{\tiny 2},label distance=2pt]{\gnodesymbol};%
+      \draw[->] (1) to(3);%
+      \HyperedgeSimple{\ghlabel}{3}{2};%
+    }%
+  }%
+}
+
+\newcommand\GrammarStar[1][]{
+  \setkeys{grammar}{#1}%
+  \ensuremath{%
+    \tikz{%
+      \node(1)[                               label=below:{\tiny 1},label distance=2pt]{\gnodesymbol};%
+      \Hyperedge{\ghlabel}{1}{(1.5em,0ex)};%
+    }%
+    ::=%
+    \tikz{%
+      \node(1)[                               label=below:{\tiny 1},label distance=2pt]{\gnodesymbol};%
+    }%
+    \ruleor%
+    \tikz{%
+      \node(2)[\gnodestyle]{\gnodelabel};
+      \node(1)[                               label=below:{\tiny 1},label distance=2pt]{\gnodesymbol};%
+      \Hyperedge{\gshlabel}{1}{(1.5em,0ex)};%
+    }%
+  }%
+}