[Example] Add an example of Jupyter and EASE use

Change-Id: If2debc7b01933d16352527c65764e7e8d6ea1afb
Signed-off-by: Pauline DEVILLE <pauline.deville@cea.fr>
diff --git a/bundles/org.eclipse.papyrus.ease.lang.python.jupyter/META-INF/MANIFEST.MF b/bundles/org.eclipse.papyrus.ease.lang.python.jupyter/META-INF/MANIFEST.MF
index 039a87f..266833b 100644
--- a/bundles/org.eclipse.papyrus.ease.lang.python.jupyter/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.papyrus.ease.lang.python.jupyter/META-INF/MANIFEST.MF
@@ -19,3 +19,4 @@
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.papyrus.ease.lang.python.jupyter,
  org.eclipse.papyrus.ease.lang.python.jupyter.internal
+Bundle-Vendor: Eclipse Modeling Project
\ No newline at end of file
diff --git a/bundles/org.eclipse.papyrus.ease/META-INF/MANIFEST.MF b/bundles/org.eclipse.papyrus.ease/META-INF/MANIFEST.MF
index ad076d4..0635358 100644
--- a/bundles/org.eclipse.papyrus.ease/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.papyrus.ease/META-INF/MANIFEST.MF
@@ -25,3 +25,4 @@
  org.eclipse.papyrus.infra.emf
 Export-Package: org.eclipse.papyrus.ease.module,
  org.eclipse.papyrus.ease.popup
+Bundle-Vendor: Eclipse Modeling Project
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/.classpath b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/.classpath
new file mode 100644
index 0000000..9b49f65
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="src" path="resources"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="META-INF"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/.project b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/.project
new file mode 100644
index 0000000..895d70a
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.ease.lang.python.jupyter.example</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>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/META-INF/MANIFEST.MF b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..59d8f29
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/META-INF/MANIFEST.MF
@@ -0,0 +1,9 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Papyrus EASE Jupyer engine examples
+Bundle-SymbolicName: org.eclipse.papyrus.ease.lang.python.jupyter.example;singleton:=true
+Bundle-Version: 0.7.0.qualifier
+Require-Bundle: org.eclipse.emf.common.ui;bundle-version="2.15.0",
+ org.eclipse.papyrus.ease.lang.python.jupyter;bundle-version="0.7.0",
+ org.eclipse.papyrus.ease;bundle-version="0.7.0"
+Bundle-Vendor: Eclipse Modeling Project
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/build.properties b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/build.properties
new file mode 100644
index 0000000..386b104
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/build.properties
@@ -0,0 +1,4 @@
+bin.includes = META-INF/,\
+               resources/
+src.includes = META-INF/,\
+               resources/
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/plugin.xml b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/plugin.xml
new file mode 100644
index 0000000..102a855
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/plugin.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+  <extension
+         point="org.eclipse.emf.common.ui.examples">
+      <example
+            id="org.eclipse.papyrus.ease.python.jupyter.example.notebook"
+            pageImage="resources/icons/jupyter_logo.png"
+            wizardID="org.eclipse.papyrus.ease.python.jupyter.example.wizard">
+         <projectDescriptor
+               contentURI="resources/examples/"
+               name="PapyrusInJupyterExample">
+         </projectDescriptor>
+         <fileToOpen
+               location="PapyrusInJupyterExample/Readme.MD">
+         </fileToOpen>
+      </example>
+   </extension>
+ <extension
+         point="org.eclipse.ui.newWizards">
+      <category
+            id="org.eclipse.papyrus.ease.examples"
+            name="Papyrus EASE"
+            parentCategory="org.eclipse.ui.Examples">
+      </category>
+      <wizard
+            category="org.eclipse.ui.Examples/org.eclipse.papyrus.ease.examples"
+            class="org.eclipse.emf.common.ui.wizard.ExampleInstallerWizard"
+            finalPerspective="org.eclipse.papyrus.infra.core.perspective"
+            icon="resources/icons/jupyter_logo.png"
+            id="org.eclipse.papyrus.ease.python.jupyter.example.wizard"
+            name="Papyrus EASE Jupyter Example"
+            preferredPerspectives="org.eclipse.papyrus.infra.core.perspective"
+            project="true">
+         <description>
+            Create a new project containing an example of EASE Jupyter engine uses.
+         </description>
+      </wizard>
+      
+   </extension>
+</plugin>
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/pom.xml b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/pom.xml
new file mode 100644
index 0000000..65672f6
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/pom.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	
+	<!-- Parent POM (Tools) -->
+	<parent>
+		<groupId>org.eclipse.papyrus.ease</groupId>
+		<artifactId>org.eclipse.papyrus.ease.examples.root</artifactId>
+		<version>0.7.0-SNAPSHOT</version>
+	</parent>
+
+	<!-- POM description -->
+	<artifactId>org.eclipse.papyrus.ease.lang.python.jupyter.example</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<name>org.eclipse.papyrus.ease.lang.python.jupyter.example</name>
+</project>
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/JupyterNotebookExample.ipynb b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/JupyterNotebookExample.ipynb
new file mode 100644
index 0000000..5062f95
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/JupyterNotebookExample.ipynb
@@ -0,0 +1,504 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Welcome to EASE Py4J Notebooks!\n",
+    "\n",
+    "\n",
+    "All the python code written is this notebook is executed by EASE Jupyter engine as the EASE Py4J engine would in a .py script.\n",
+    "It means that this web page is tighly connected to the eclipse session from which is was launched, and has access to all the Java functions exposed by EASE modules."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The following code shows how to import UI EASE module and open an Eclipse Popup Dialog. (If you run this notebook in an external browser in full screen, switch back to eclipse to see it!)\n",
+    "You can find more information related to EASE [here](https://www.eclipse.org/ease/documentation/)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "ui_module = loadModule('/System/UI')\n",
+    "\n",
+    "ui_module.showInfoDialog(\"Hello Eclipse World!!\", \"Message from Jupyter\")\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Get the best of both worlds!!\n",
+    "The interesting thing is that you can combine Eclipse functionalities with Jupyter features.\n",
+    "For instance it's possible to create very simple GUIs with  [ipywidgets](https://ipywidgets.readthedocs.io/en/latest/) and interact with eclipse objects.\n",
+    "\n",
+    "Remark : ipywidget doesn't work with eclipse internal web browser. The General/Web browser option should be set to \"External Browser\".\n",
+    "If not present in your Anaconda distribution, ipython widgets can be installed with the following command in Anaconda prompt:\n",
+    "    \n",
+    "    conda install ipywidgets"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "b9fb0616adc142098022d8c51f27b3c4",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "interactive(children=(Text(value='Hello Eclipse world from a widget!', description='message'), Button(descript…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "from ipywidgets import interact_manual\n",
+    "\n",
+    "@interact_manual(message=\"Hello Eclipse world from a widget!\")\n",
+    "def open_popup_with_message(message):\n",
+    "    ui_module.showInfoDialog(message, \"Message from Jupyter\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Hide python code in external scripts\n",
+    "Notice that the python code can be hidden in script files located in the workspace. That way only a single line EASE \"include\" statement is needed."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "a122cd1de6f04f7d9fe0fa4649ab55b3",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "interactive(children=(Text(value='Hello Eclipse world from a script file!', description='message'), Button(des…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "include(\"workspace://PapyrusInJupyterExample/script/hello_world.py\")"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This following example shows how to create a new file in an eclipse project and open it in an eclipse editor. The file name is defined with an simple jupyter widget."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "05e0650d3eb946e18d8b7bac3dba1b9c",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "interactive(children=(Text(value='example_file.txt', description='filename'), Text(value='Type your message he…"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "#required to access to the \"getFile\" function\n",
+    "res_module = loadModule(\"/System/Resources\")\n",
+    "\n",
+    "@interact_manual( filename=\"example_file.txt\", message=\"Type your message here\")\n",
+    "def create_and_open_file(filename, message):\n",
+    "    path = \"workspace:///PapyrusInJupyterExample/\" + filename\n",
+    "    file = res_module.getFile(path,True)\n",
+    "    if (file is None):\n",
+    "        file = res_module.createFile(path)\n",
+    "    res_module.writeFile(file, message, 0, True)\n",
+    "    \n",
+    "    ui_module.showEditor(file)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Open Papyrus file from Jupyter\n",
+    "\n",
+    "Papyrus files can be directly opened with the \"System/UI/showEditor\" EASE function\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "papyrus_path = \"workspace://PapyrusInJupyterExample/PapyrusInJupyterExample.di\"\n",
+    "papyrus_editor =ui_module.showEditor(papyrus_path);"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# EASE Papyrus module\n",
+    "\n",
+    "In addition to existing EASE Modeling modules such as Ecore, UML, SysML, Papyrus module provides functionalities helping to interact with a running papyrus session.\n",
+    "\n",
+    "\"getPapyrusModel\" helps to access to access to the root model element of papyrus file."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Root model name is : \n",
+      "PapyrusInJupyterExample\n"
+     ]
+    }
+   ],
+   "source": [
+    "papyrus_util = loadModule('/Modeling/PapyrusUtils');\n",
+    "root_model = papyrus_util.getPapyrusModel(papyrus_path)\n",
+    "\n",
+    "print('Root model name is : ')\n",
+    "print(root_model.getName())"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Alternatively, you can use getPapyrusNamedElement to directly access by qualified name to any model elements located in an UML file."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "prop type is : \n",
+      "String\n"
+     ]
+    }
+   ],
+   "source": [
+    "prop = papyrus_util.getPapyrusNamedElement(papyrus_path, \"PapyrusInJupyterExample::sub_package2::Class3::Property1\")\n",
+    "\n",
+    "print('prop type is : ')\n",
+    "print(prop.getType().getName())"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Notice that once a model element is obtained, it can be used later as the context object parameter to access to other elements.\n",
+    "Moreover, the imported model elements can also be accessed easily by name."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml\n"
+     ]
+    }
+   ],
+   "source": [
+    "integer_type = papyrus_util.getPapyrusNamedElement(prop, \"PrimitiveTypes::Integer\")\n",
+    "\n",
+    "print(integer_type.eResource().getURI())"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This following cell shows how to iterate over objects in a model and for instance collect packages qualified names."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "['PapyrusInJupyterExample', 'PapyrusInJupyterExample::sub_package1', 'PapyrusInJupyterExample::sub_package2']\n"
+     ]
+    }
+   ],
+   "source": [
+    "\n",
+    "def get_all_packages(root_model):\n",
+    "    packages_names = []\n",
+    "    packages_names.append(root_model.getQualifiedName())\n",
+    "    for element in root_model.allOwnedElements():\n",
+    "        if (element.eClass().getName() == \"Package\"):\n",
+    "            packages_names.append(element.getQualifiedName())\n",
+    "    return packages_names\n",
+    "\n",
+    "packages = get_all_packages(root_model)\n",
+    "\n",
+    "print(packages)\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Modifying model elements from EASE or Jupyter\n",
+    "\n",
+    "Modification of Papyrus in memory model elements should be done in transactions integrated in its Undo/Redo framework.\n",
+    "We provide a `papyrun`python function to do it easily. This function is defined in a script packaged in a plugin:\n",
+    "\n",
+    "`include(\"platform:/plugin/org.eclipse.papyrus.ease/scripts/python/papyrusutils.py\")`\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#we redo necessary loadModule just in case previous cells have not been executed\n",
+    "ui_module = loadModule('/System/UI')\n",
+    "papyrus_util = loadModule('/Modeling/PapyrusUtils');\n",
+    "\n",
+    "papyrus_path = \"workspace://PapyrusInJupyterExample/PapyrusInJupyterExample.di\"\n",
+    "papyrus_editor =ui_module.showEditor(papyrus_path);\n",
+    "\n",
+    "\n",
+    "#we import the papyrusutils.py script which defined papyrus function\n",
+    "include(\"platform:/plugin/org.eclipse.papyrus.ease/scripts/python/papyrusutils.py\")\n",
+    "\n",
+    "papyrus =ui_module.showEditor(papyrus_path);\n",
+    "\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "['pAPYRUSiNjUPYTEReXAMPLE', 'pAPYRUSiNjUPYTEReXAMPLE::sub_package1', 'pAPYRUSiNjUPYTEReXAMPLE::sub_package2']\n"
+     ]
+    }
+   ],
+   "source": [
+    "def swap_name_case(named_element) :\n",
+    "    new_name = named_element.getName().swapcase()\n",
+    "    named_element.setName(new_name)\n",
+    "    return new_name\n",
+    "\n",
+    "root_model = getPapyrusModel(papyrus_path)\n",
+    "\n",
+    "#the first parameter of papyrus is the function name you want to execute\n",
+    "#following parameters are the arguments you want to pass to the function\n",
+    "new_name = papyrun(swap_name_case, root_model)\n",
+    "\n",
+    "print(get_all_packages(root_model))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Have a look at your papyrus model! Root model name has changed. You can undo the modification with ctrl + z."
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The following example combines a jupyter widget with a function modifying the model.\n",
+    "\n",
+    "Notice that the modification can be undone in Papyrus with the Undo/Redo framework (crtl + z)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {
+    "scrolled": false
+   },
+   "outputs": [
+    {
+     "data": {
+      "application/vnd.jupyter.widget-view+json": {
+       "model_id": "6182ff1ec9364b5db17c442a39567e7e",
+       "version_major": 2,
+       "version_minor": 0
+      },
+      "text/plain": [
+       "interactive(children=(Dropdown(description='package', options={'PapyrusInJupyterExample': JavaObject id=o144, …"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "from ipywidgets import interact_manual\n",
+    "def create_class(package, name):\n",
+    "    return package.createOwnedClass(name, False)\n",
+    "\n",
+    "#we create a map \n",
+    "package_dict = {}\n",
+    "for package_name in get_all_packages(root_model):\n",
+    "    package_dict[package_name] = papyrus_util.getPapyrusNamedElement(root_model, package_name)\n",
+    "\n",
+    "\n",
+    "@interact_manual(package=package_dict , class_name = \"defaultName\")\n",
+    "def create_class_interact(package, class_name):\n",
+    "    new_class = papyrun(create_class, package, class_name)\n",
+    "    print('a new class is created in the model :' + new_class.getQualifiedName())\n"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Experimental unstable feature : creating diagrams"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In Papyrus, each palette element is identified with an unique ElementType ID.\n",
+    "\n",
+    "The function following function allows the emulation of the palette with a mouse :\n",
+    "\n",
+    "`createSemanticElementAndView(ElementTypeID, X, Y, Height, Width)`\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 25,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "#create diagram allows the creation of diagram\n",
+    "#first param is the container of the diagram\n",
+    "#second param is the label of the diagram (as in New Diagram menu)\n",
+    "#third param is the diagram name\n",
+    "papyrun(papyrus_util.createDiagram, root_model ,'Class Diagram', \"newDiagram\")\n",
+    "\n",
+    "\n",
+    "diTypes = org.eclipse.papyrus.uml.service.types.element.UMLDIElementTypes\n",
+    "\n",
+    "def createClasses():\n",
+    "    \n",
+    "    results = []\n",
+    "    results.append(createSemanticElementAndView(diTypes.CLASS_SHAPE.getId(), 0,300,200, 200))\n",
+    "    results.append(createSemanticElementAndView(diTypes.CLASS_SHAPE.getId(), 400,300, 200, 200))\n",
+    "    results.append(createSemanticElementAndView(diTypes.CLASS_SHAPE.getId(), 200,0 , 200, 200))\n",
+    "    return results\n",
+    "\n",
+    "classes = papyrun(createClasses)\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 26,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "def createLinks(classes):\n",
+    "    class1 = classes[0]\n",
+    "    class2 = classes[1]\n",
+    "    class3 = classes[2]\n",
+    "    \n",
+    "    #the result of a createSemanticElementAndView is an Handler which \n",
+    "    #gives access to both the semantic element and the view with the\n",
+    "    #getElement and the getView methods\n",
+    "    class1.getElement().setName(\"ClassExample1\")\n",
+    "    \n",
+    "    for i in range(3):\n",
+    "        \n",
+    "        result = createSemanticElementAndLinkView(diTypes.ASSOCIATION_COMPOSITE_DIRECTED_EDGE.getId(), \n",
+    "                                         class1.getView(), 1.0 ,i/3+0.05, \n",
+    "                                         class2.getView(),0.0,i/3+0.05)\n",
+    "    \n",
+    "    \n",
+    "    createSemanticElementAndLinkView(diTypes.GENERALIZATION_EDGE.getId(), class1.getView(),0.5 ,0.0, class3.getView(),0.5,1.0)\n",
+    "    createSemanticElementAndLinkView(diTypes.GENERALIZATION_EDGE.getId(), class2.getView(), 0.5 ,0.0, class3.getView(),0.5,1.0)\n",
+    "    \n",
+    "    \n",
+    "papyrun(createLinks, classes)"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "EASE Py4j Python 3",
+   "language": "python",
+   "name": "ease_py4j_kernel"
+  },
+  "toc": {
+   "base_numbering": 1,
+   "nav_menu": {},
+   "number_sections": false,
+   "sideBar": false,
+   "skip_h1_title": false,
+   "title_cell": "Table of Contents",
+   "title_sidebar": "Contents",
+   "toc_cell": false,
+   "toc_position": {},
+   "toc_section_display": false,
+   "toc_window_display": false
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/PapyrusInJupyterExample.di b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/PapyrusInJupyterExample.di
new file mode 100644
index 0000000..8c549ee
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/PapyrusInJupyterExample.di
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<architecture:ArchitectureDescription xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:architecture="http://www.eclipse.org/papyrus/infra/core/architecture" contextId="org.eclipse.papyrus.infra.services.edit.TypeContext"/>
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/PapyrusInJupyterExample.notation b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/PapyrusInJupyterExample.notation
new file mode 100644
index 0000000..aaa3b9c
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/PapyrusInJupyterExample.notation
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<notation:Diagram xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/papyrus/infra/gmfdiag/style" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_OWaUMKzbEemHHNoZrq-BrA" type="PapyrusUMLClassDiagram" name="Packages" measurementUnit="Pixel">
+  <eAnnotations xmi:type="ecore:EAnnotation" xmi:id="_tsp_sK0aEemTA-4Tm1djLw" source="PapyrusCSSForceValue">
+    <details xmi:type="ecore:EStringToStringMapEntry" xmi:id="_tsp_sa0aEemTA-4Tm1djLw" key="canonical" value="true"/>
+  </eAnnotations>
+  <children xmi:type="notation:Shape" xmi:id="_P5_m0KzbEemHHNoZrq-BrA" type="Package_Shape">
+    <children xmi:type="notation:DecorationNode" xmi:id="_P6ShwKzbEemHHNoZrq-BrA" type="Package_NameLabel"/>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_P6TI0KzbEemHHNoZrq-BrA" type="Package_PackagedElementCompartment">
+      <children xmi:type="notation:Shape" xmi:id="_cRfH8KzbEemHHNoZrq-BrA" type="Class_Shape_CN">
+        <children xmi:type="notation:DecorationNode" xmi:id="_cRfvAKzbEemHHNoZrq-BrA" type="Class_NameLabel_CN"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_cRfvAazbEemHHNoZrq-BrA" type="Class_FloatingNameLabel_CN">
+          <layoutConstraint xmi:type="notation:Location" xmi:id="_cRfvAqzbEemHHNoZrq-BrA" y="15"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_cRgWEKzbEemHHNoZrq-BrA" type="Class_AttributeCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_cRgWEazbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_cRgWEqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_cRgWE6zbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cRgWFKzbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_cRgWFazbEemHHNoZrq-BrA" type="Class_OperationCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_cRgWFqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_cRgWF6zbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_cRgWGKzbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cRgWGazbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_cRgWGqzbEemHHNoZrq-BrA" type="Class_NestedClassifierCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_cRgWG6zbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_cRgWHKzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_cRgWHazbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cRgWHqzbEemHHNoZrq-BrA"/>
+        </children>
+        <element xmi:type="uml:Class" href="PapyrusInJupyterExample.uml#_cRJJsKzbEemHHNoZrq-BrA"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_cRfH8azbEemHHNoZrq-BrA" x="14" y="33" width="121" height="101"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_di_zIKzbEemHHNoZrq-BrA" type="Class_Shape_CN">
+        <children xmi:type="notation:DecorationNode" xmi:id="_djAaMKzbEemHHNoZrq-BrA" type="Class_NameLabel_CN"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_djAaMazbEemHHNoZrq-BrA" type="Class_FloatingNameLabel_CN">
+          <layoutConstraint xmi:type="notation:Location" xmi:id="_djBBQKzbEemHHNoZrq-BrA" y="15"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_djBBQazbEemHHNoZrq-BrA" type="Class_AttributeCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_djBBQqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_djBBQ6zbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_djBBRKzbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_djBBRazbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_djBBRqzbEemHHNoZrq-BrA" type="Class_OperationCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_djBBR6zbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_djBBSKzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_djBBSazbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_djBBSqzbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_djBoUKzbEemHHNoZrq-BrA" type="Class_NestedClassifierCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_djBoUazbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_djBoUqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_djBoU6zbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_djBoVKzbEemHHNoZrq-BrA"/>
+        </children>
+        <element xmi:type="uml:Class" href="PapyrusInJupyterExample.uml#_dis4MKzbEemHHNoZrq-BrA"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_di_zIazbEemHHNoZrq-BrA" x="154" y="33" width="101" height="101"/>
+      </children>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_P6TI0azbEemHHNoZrq-BrA"/>
+      <layoutConstraint xmi:type="notation:Bounds" xmi:id="_P6TI0qzbEemHHNoZrq-BrA"/>
+    </children>
+    <element xmi:type="uml:Package" href="PapyrusInJupyterExample.uml#_P5jh8KzbEemHHNoZrq-BrA"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_P5_m0azbEemHHNoZrq-BrA" x="100" y="100" width="321" height="241"/>
+  </children>
+  <children xmi:type="notation:Shape" xmi:id="_ULdcAKzbEemHHNoZrq-BrA" type="Package_Shape">
+    <children xmi:type="notation:DecorationNode" xmi:id="_ULdcAqzbEemHHNoZrq-BrA" type="Package_NameLabel"/>
+    <children xmi:type="notation:BasicCompartment" xmi:id="_ULeDEKzbEemHHNoZrq-BrA" type="Package_PackagedElementCompartment">
+      <children xmi:type="notation:Shape" xmi:id="_fBpicKzbEemHHNoZrq-BrA" type="Class_Shape_CN">
+        <children xmi:type="notation:DecorationNode" xmi:id="_fBqJgKzbEemHHNoZrq-BrA" type="Class_NameLabel_CN"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_fBqJgazbEemHHNoZrq-BrA" type="Class_FloatingNameLabel_CN">
+          <layoutConstraint xmi:type="notation:Location" xmi:id="_fBqJgqzbEemHHNoZrq-BrA" y="15"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_fBqwkKzbEemHHNoZrq-BrA" type="Class_AttributeCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_fBqwkazbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_fBqwkqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_fBqwk6zbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fBqwlKzbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_fBqwlazbEemHHNoZrq-BrA" type="Class_OperationCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_fBqwlqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_fBqwl6zbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_fBqwmKzbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fBqwmazbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_fBrXoKzbEemHHNoZrq-BrA" type="Class_NestedClassifierCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_fBrXoazbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_fBrXoqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_fBrXo6zbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fBrXpKzbEemHHNoZrq-BrA"/>
+        </children>
+        <element xmi:type="uml:Class" href="PapyrusInJupyterExample.uml#_fA7JsKzbEemHHNoZrq-BrA"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_fBpicazbEemHHNoZrq-BrA" x="14" y="33" width="101" height="101"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_gUg4gKzbEemHHNoZrq-BrA" type="Class_Shape_CN">
+        <children xmi:type="notation:DecorationNode" xmi:id="_gUhfkKzbEemHHNoZrq-BrA" type="Class_NameLabel_CN"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_gUhfkazbEemHHNoZrq-BrA" type="Class_FloatingNameLabel_CN">
+          <layoutConstraint xmi:type="notation:Location" xmi:id="_gUiGoKzbEemHHNoZrq-BrA" y="15"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_gUiGoazbEemHHNoZrq-BrA" type="Class_AttributeCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_gUiGoqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_gUiGo6zbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_gUiGpKzbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gUiGpazbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_gUiGpqzbEemHHNoZrq-BrA" type="Class_OperationCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_gUiGp6zbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_gUiGqKzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_gUiGqazbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gUiGqqzbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_gUitsKzbEemHHNoZrq-BrA" type="Class_NestedClassifierCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_gUitsazbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_gUitsqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_gUits6zbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gUittKzbEemHHNoZrq-BrA"/>
+        </children>
+        <element xmi:type="uml:Class" href="PapyrusInJupyterExample.uml#_gUGBwKzbEemHHNoZrq-BrA"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gUg4gazbEemHHNoZrq-BrA" x="154" y="33" width="101" height="101"/>
+      </children>
+      <children xmi:type="notation:Shape" xmi:id="_iW0HcKzbEemHHNoZrq-BrA" type="Class_Shape_CN">
+        <children xmi:type="notation:DecorationNode" xmi:id="_iW0ugKzbEemHHNoZrq-BrA" type="Class_NameLabel_CN"/>
+        <children xmi:type="notation:DecorationNode" xmi:id="_iW0ugazbEemHHNoZrq-BrA" type="Class_FloatingNameLabel_CN">
+          <layoutConstraint xmi:type="notation:Location" xmi:id="_iW0ugqzbEemHHNoZrq-BrA" y="15"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_iW1VkKzbEemHHNoZrq-BrA" type="Class_AttributeCompartment_CN">
+          <children xmi:type="notation:Shape" xmi:id="_j95aAKzbEemHHNoZrq-BrA" type="Property_ClassAttributeLabel">
+            <element xmi:type="uml:Property" href="PapyrusInJupyterExample.uml#_j9a44KzbEemHHNoZrq-BrA"/>
+            <layoutConstraint xmi:type="notation:Location" xmi:id="_j95aAazbEemHHNoZrq-BrA"/>
+          </children>
+          <styles xmi:type="notation:TitleStyle" xmi:id="_iW1VkazbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_iW1VkqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_iW1Vk6zbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iW1VlKzbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_iW2jsKzbEemHHNoZrq-BrA" type="Class_OperationCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_iW2jsazbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_iW2jsqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_iW2js6zbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iW2jtKzbEemHHNoZrq-BrA"/>
+        </children>
+        <children xmi:type="notation:BasicCompartment" xmi:id="_iW2jtazbEemHHNoZrq-BrA" type="Class_NestedClassifierCompartment_CN">
+          <styles xmi:type="notation:TitleStyle" xmi:id="_iW2jtqzbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:SortingStyle" xmi:id="_iW2jt6zbEemHHNoZrq-BrA"/>
+          <styles xmi:type="notation:FilteringStyle" xmi:id="_iW2juKzbEemHHNoZrq-BrA"/>
+          <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iW2juazbEemHHNoZrq-BrA"/>
+        </children>
+        <element xmi:type="uml:Class" href="PapyrusInJupyterExample.uml#_iWVmUKzbEemHHNoZrq-BrA"/>
+        <layoutConstraint xmi:type="notation:Bounds" xmi:id="_iW0HcazbEemHHNoZrq-BrA" x="294" y="33" width="101" height="101"/>
+      </children>
+      <styles xmi:type="notation:TitleStyle" xmi:id="_ULeDEazbEemHHNoZrq-BrA"/>
+      <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ULeDEqzbEemHHNoZrq-BrA"/>
+    </children>
+    <element xmi:type="uml:Package" href="PapyrusInJupyterExample.uml#_ULa_wKzbEemHHNoZrq-BrA"/>
+    <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ULdcAazbEemHHNoZrq-BrA" x="460" y="100" width="441" height="261"/>
+  </children>
+  <styles xmi:type="notation:StringValueStyle" xmi:id="_OWa7QKzbEemHHNoZrq-BrA" name="diagram_compatibility_version" stringValue="1.4.0"/>
+  <styles xmi:type="notation:DiagramStyle" xmi:id="_OWa7QazbEemHHNoZrq-BrA"/>
+  <styles xmi:type="style:PapyrusDiagramStyle" xmi:id="_OWa7QqzbEemHHNoZrq-BrA" diagramKindId="org.eclipse.papyrus.uml.diagram.class">
+    <owner xmi:type="uml:Model" href="PapyrusInJupyterExample.uml#_U_KoUKzEEemHHNoZrq-BrA"/>
+  </styles>
+  <styles xmi:type="notation:CanonicalStyle" xmi:id="_tspYoK0aEemTA-4Tm1djLw"/>
+  <element xmi:type="uml:Model" href="PapyrusInJupyterExample.uml#_U_KoUKzEEemHHNoZrq-BrA"/>
+</notation:Diagram>
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/PapyrusInJupyterExample.uml b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/PapyrusInJupyterExample.uml
new file mode 100644
index 0000000..3d955ac
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/PapyrusInJupyterExample.uml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<uml:Model xmi:version="20131001" xmlns:xmi="http://www.omg.org/spec/XMI/20131001" xmlns:uml="http://www.eclipse.org/uml2/5.0.0/UML" xmi:id="_U_KoUKzEEemHHNoZrq-BrA" name="PapyrusInJupyterExample">
+  <packageImport xmi:type="uml:PackageImport" xmi:id="_VUpJEKzEEemHHNoZrq-BrA">
+    <importedPackage xmi:type="uml:Model" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#_0"/>
+  </packageImport>
+  <packagedElement xmi:type="uml:Package" xmi:id="_P5jh8KzbEemHHNoZrq-BrA" name="sub_package1">
+    <packagedElement xmi:type="uml:Class" xmi:id="_cRJJsKzbEemHHNoZrq-BrA" name="Class1"/>
+    <packagedElement xmi:type="uml:Class" xmi:id="_dis4MKzbEemHHNoZrq-BrA" name="Class2"/>
+  </packagedElement>
+  <packagedElement xmi:type="uml:Package" xmi:id="_ULa_wKzbEemHHNoZrq-BrA" name="sub_package2">
+    <packagedElement xmi:type="uml:Class" xmi:id="_fA7JsKzbEemHHNoZrq-BrA" name="Class1"/>
+    <packagedElement xmi:type="uml:Class" xmi:id="_gUGBwKzbEemHHNoZrq-BrA" name="Class2"/>
+    <packagedElement xmi:type="uml:Class" xmi:id="_iWVmUKzbEemHHNoZrq-BrA" name="Class3">
+      <ownedAttribute xmi:type="uml:Property" xmi:id="_j9a44KzbEemHHNoZrq-BrA" name="Property1">
+        <type xmi:type="uml:PrimitiveType" href="pathmap://UML_LIBRARIES/UMLPrimitiveTypes.library.uml#String"/>
+      </ownedAttribute>
+    </packagedElement>
+  </packagedElement>
+</uml:Model>
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/Readme.MD b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/Readme.MD
new file mode 100644
index 0000000..8b5b13a
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/Readme.MD
@@ -0,0 +1,47 @@
+---------------------------------------------------------------------------------------
+                              SETUP  INFO
+---------------------------------------------------------------------------------------
+
+Jupyter EASE scripting engine is a specialization of the Py4J EASE engine. 
+The Eclipse Preference named "Scripting/Python Scripting (using Py4J)/Python location" 
+should point to a python.exe in Python distribution where Jupyter Notebook is installed.
+
+Important remark : Anaconda (https://www.anaconda.com/) is providing such a distribution. 
+However, the advanced option "Add anaconda to my PATH environnment" option should
+be checked during its install process. (Otherwise, you may have dll/so loading issues during
+engine startup).  
+
+Notice that the engine is also taking the General/Web Browser option to determine
+if the notebook should be run into an Eclipse integrated web browser (internal)
+or an external browser such as Firefox or Google Chrome.
+
+
+--------------------------------------------------------------------------------------
+                              STARTUP  INFO
+--------------------------------------------------------------------------------------
+
+Jupyter ipynb files are considered as script files by our notebook. Existing notebooks
+can be started from a Right click on ipynb file -> Run As -> EASE Script... popup menu.
+
+We don't provide a new Notebook wizard yet. New notebooks can be created either by copy/pasting
+existing ones such as this example, or by starting the Jupyter EASE scripting engine from
+the EASE Script Shell View/"Switch scripting Engine" button.
+This will launch a new Jupyter Notebook session from which you will have to create a new
+EASE Py4J Kernel notebook. Be fast! The EASE engine is waiting for an acknowledgement from
+the Py4J Jupyer kernel, you only have 1 minute to create your notebook before considering 
+a failure occured. 
+
+
+----------------------------------------------------------------------------------------
+                           SHUTDOWN INFO
+----------------------------------------------------------------------------------------
+
+Jupyter Notebook is launched as a third party executable which still runs after the web
+browser is closed => closing the tab in the browser doesn't stop the engine. 
+
+The engine can be explicitly killed with the "Terminate" red button from the Eclipse 
+console view. 
+Notice that when Eclipse terminates normally, all the Jupyter server instances started by EASE
+Jupyter engine are automatically terminated. 
+
+
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/script/hello_world.py b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/script/hello_world.py
new file mode 100644
index 0000000..a9bbe68
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/examples/script/hello_world.py
@@ -0,0 +1,5 @@
+from ipywidgets import interact_manual
+
+@interact_manual(message="Hello Eclipse world from a script file!")
+def open_popup_with_message_from_script(message):
+    ui_module.showInfoDialog(message, "Message from Jupyter")
\ No newline at end of file
diff --git a/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/icons/jupyter_logo.png b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/icons/jupyter_logo.png
new file mode 100644
index 0000000..e9b5b97
--- /dev/null
+++ b/examples/org.eclipse.papyrus.ease.lang.python.jupyter.example/resources/icons/jupyter_logo.png
Binary files differ
diff --git a/examples/pom.xml b/examples/pom.xml
new file mode 100644
index 0000000..957027a
--- /dev/null
+++ b/examples/pom.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+	<modelVersion>4.0.0</modelVersion>
+
+	<!-- Parent of this POM -->
+	<parent>
+		<version>0.7.0-SNAPSHOT</version>
+		<groupId>org.eclipse.papyrus.ease</groupId>
+		<artifactId>org.eclipse.papyrus.ease.root</artifactId>
+	</parent>
+
+	<!-- EASE project root POM (aggregator) -->
+	<artifactId>org.eclipse.papyrus.ease.examples.root</artifactId>
+	<name>EASE Examples</name>
+	<packaging>pom</packaging>
+
+	<!-- Children modules to build -->
+	<modules>
+		<module>org.eclipse.papyrus.ease.lang.python.jupyter.example</module>
+	</modules>
+
+</project>
diff --git a/features/org.eclipse.papyrus.ease.feature/feature.xml b/features/org.eclipse.papyrus.ease.feature/feature.xml
index 23825c0..6e825dc 100644
--- a/features/org.eclipse.papyrus.ease.feature/feature.xml
+++ b/features/org.eclipse.papyrus.ease.feature/feature.xml
@@ -69,7 +69,7 @@
          install-size="0"
          version="0.0.0"
          unpack="false"/>
-
+         
    <plugin
          id="org.eclipse.papyrus.aceeditor"
          download-size="0"
diff --git a/features/org.eclipse.papyrus.ease.jupyter.feature/feature.xml b/features/org.eclipse.papyrus.ease.jupyter.feature/feature.xml
index 751ff16..b3e5e28 100644
--- a/features/org.eclipse.papyrus.ease.jupyter.feature/feature.xml
+++ b/features/org.eclipse.papyrus.ease.jupyter.feature/feature.xml
@@ -37,4 +37,11 @@
          version="0.0.0"
          unpack="false"/>
 
+   <plugin
+         id="org.eclipse.papyrus.ease.lang.python.jupyter.example"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
 </feature>
diff --git a/pom.xml b/pom.xml
index 6914e8e..fda1c83 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,6 +20,7 @@
 	<!-- Children modules to build -->
 	<modules>
 		<module>bundles</module>
+		<module>examples</module>
 		<module>features</module>
 		<module>releng</module>
 	</modules>