diff --git a/plugins/org.polarsys.chess.monitoring/META-INF/MANIFEST.MF b/plugins/org.polarsys.chess.monitoring/META-INF/MANIFEST.MF
index 0fcdc7f..9d04e93 100644
--- a/plugins/org.polarsys.chess.monitoring/META-INF/MANIFEST.MF
+++ b/plugins/org.polarsys.chess.monitoring/META-INF/MANIFEST.MF
@@ -7,9 +7,20 @@
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
-Export-Package: monitoringxml,
- monitoringxml.impl,
- monitoringxml.util
+Export-Package: org.polarsys.chess.monitoring.monitoringxml,
+ org.polarsys.chess.monitoring.monitoringxml.impl,
+ org.polarsys.chess.monitoring.monitoringxml.util
 Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.emf.ecore;visibility:=reexport
+ org.eclipse.emf.ecore;visibility:=reexport,
+ org.eclipse.ui.workbench,
+ org.eclipse.ui,
+ org.eclipse.core.resources
 Bundle-ActivationPolicy: lazy
+Import-Package: org.eclipse.emf.ecore.xmi,
+ org.eclipse.emf.ecore.xmi.impl,
+ org.eclipse.m2m.qvt.oml,
+ org.eclipse.m2m.qvt.oml.util,
+ org.eclipse.papyrus.infra.onefile.model,
+ org.eclipse.xtext.resource,
+ org.polarsys.chess.core.util
+Bundle-Activator: org.polarsys.chess.monitoring.monitoringxml.Activator
diff --git a/plugins/org.polarsys.chess.monitoring/about.html b/plugins/org.polarsys.chess.monitoring/about.html
new file mode 100644
index 0000000..dd3c089
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/about.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+ 
+<p>November 14, 2008</p>	
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
+indicated below, the Content is provided to you under the terms and conditions of the
+Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
+at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
+For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
+being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
+apply to your use of any object code in the Content.  Check the Redistributor's license that was 
+provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
+indicated below, the terms and conditions of the EPL still apply to any source code in the Content
+and such source code may be obtained at <a href="http://www.eclipse.org">http://www.eclipse.org</a>.</p>
+
+</body>
+</html>
\ No newline at end of file
diff --git a/plugins/org.polarsys.chess.monitoring/bin/.gitignore b/plugins/org.polarsys.chess.monitoring/bin/.gitignore
index 8717ad2..1b63298 100644
--- a/plugins/org.polarsys.chess.monitoring/bin/.gitignore
+++ b/plugins/org.polarsys.chess.monitoring/bin/.gitignore
@@ -1 +1,2 @@
 /monitoringxml/
+/org/
diff --git a/plugins/org.polarsys.chess.monitoring/build.properties b/plugins/org.polarsys.chess.monitoring/build.properties
index 4465407..b65fa7c 100644
--- a/plugins/org.polarsys.chess.monitoring/build.properties
+++ b/plugins/org.polarsys.chess.monitoring/build.properties
@@ -4,7 +4,8 @@
                model/,\
                META-INF/,\
                plugin.xml,\
-               plugin.properties
+               plugin.properties,\
+               transforms/
 jars.compile.order = .
 source.. = src/
 output.. = bin/
diff --git a/plugins/org.polarsys.chess.monitoring/model/monitoring.aird b/plugins/org.polarsys.chess.monitoring/model/monitoring.aird
index a63259a..89ee22f 100644
--- a/plugins/org.polarsys.chess.monitoring/model/monitoring.aird
+++ b/plugins/org.polarsys.chess.monitoring/model/monitoring.aird
@@ -1,37 +1,1414 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<viewpoint:DAnalysis xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xmlns:xsd="http://www.eclipse.org/xsd/2002/XSD" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style" xmi:id="_TMF7APKXEeWJGdEk7kJ9Lg" selectedViews="_UU7yYPKXEeWJGdEk7kJ9Lg" version="8.1.1">
+<viewpoint:DAnalysis xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:description="http://www.eclipse.org/sirius/description/1.1.0" xmlns:description_1="http://www.eclipse.org/sirius/diagram/description/1.1.0" xmlns:diagram="http://www.eclipse.org/sirius/diagram/1.1.0" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" xmlns:notation="http://www.eclipse.org/gmf/runtime/1.0.2/notation" xmlns:qvtoperational.expr="http://www.eclipse.org/qvt/1.0.0/Operational/Expressions" xmlns:style="http://www.eclipse.org/sirius/diagram/description/style/1.1.0" xmlns:viewpoint="http://www.eclipse.org/sirius/1.1.0" xmlns:xsd="http://www.eclipse.org/xsd/2002/XSD" xsi:schemaLocation="http://www.eclipse.org/sirius/description/1.1.0 http://www.eclipse.org/sirius/1.1.0#//description http://www.eclipse.org/sirius/diagram/description/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description http://www.eclipse.org/qvt/1.0.0/Operational/Expressions http://www.eclipse.org/QVT/1.0.0/Operational#//expressions http://www.eclipse.org/sirius/diagram/description/style/1.1.0 http://www.eclipse.org/sirius/diagram/1.1.0#//description/style" xmi:id="_TMF7APKXEeWJGdEk7kJ9Lg" selectedViews="_UU7yYPKXEeWJGdEk7kJ9Lg" version="8.1.1">
   <models xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
-  <models xmi:type="genmodel:GenModel" href="monitoring.genmodel#/"/>
   <models xmi:type="xsd:XSDSchema" href="bundleentry://1349.fwk397847959/cache/www.w3.org/2001/XMLSchema-instance.xsd#/"/>
   <models xmi:type="xsd:XSDSchema" href="bundleentry://1349.fwk397847959/cache/www.w3.org/2001/XMLSchema.xsd#/"/>
   <models xmi:type="xsd:XSDSchema" href="bundleentry://1349.fwk397847959/cache/www.w3.org/2001/MagicXMLSchema.xsd#/"/>
+  <models xmi:type="qvtoperational.expr:Library" href="../transforms/CommonUtilities.qvto#/"/>
+  <models xmi:type="ecore:EPackage" href="http://www.eclipse.org/uml2/5.0.0/UML#/"/>
+  <models xmi:type="ecore:EPackage" href="http://www.eclipse.org/ocl/1.1.0/oclstdlib.ecore#/0"/>
+  <models xmi:type="qvtoperational.expr:Library" href="http://www.eclipse.org/m2m/qvt/oml/1.0.0/Stdlib#/"/>
+  <models xmi:type="ecore:EPackage" href="http://CHESS#/"/>
+  <models xmi:type="qvtoperational.expr:OperationalTransformation" href="../transforms/MonitoringXML2Chess.qvto#/"/>
+  <models xmi:type="qvtoperational.expr:Library" href="qvto:/module.env#/"/>
+  <models xmi:type="ecore:EPackage" href="http://www.eclipse.org/papyrus/MARTE/1#/"/>
+  <models xmi:type="ecore:EPackage" href="http://www.eclipse.org/emf/2002/Ecore#/"/>
+  <models xmi:type="ecore:EPackage" href="http://www.eclipse.org/uml2/5.0.0/Types#/"/>
+  <models xmi:type="ecore:EPackage" href="http:///MARTE_Library/BasicNFP_Types.ecore#/"/>
+  <models xmi:type="ecore:EPackage" href="http:///MARTE_Library/MARTE_PrimitivesTypes.ecore#/"/>
+  <models xmi:type="genmodel:GenModel" href="monitoring.genmodel#/"/>
   <ownedViews xmi:type="viewpoint:DRepresentationContainer" xmi:id="_UU7yYPKXEeWJGdEk7kJ9Lg" initialized="true">
     <ownedRepresentations xmi:type="diagram:DSemanticDiagram" xmi:id="_UeMcEPKXEeWJGdEk7kJ9Lg" name="monitoring class diagram">
       <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_UfkVEPKXEeWJGdEk7kJ9Lg" source="GMF_DIAGRAMS">
         <data xmi:type="notation:Diagram" xmi:id="_UfkVEfKXEeWJGdEk7kJ9Lg" type="Sirius" element="_UeMcEPKXEeWJGdEk7kJ9Lg" measurementUnit="Pixel">
-          <children xmi:type="notation:Node" xmi:id="_UgDdQPKXEeWJGdEk7kJ9Lg" type="2001" element="_UeMcEfKXEeWJGdEk7kJ9Lg">
-            <children xmi:type="notation:Node" xmi:id="_UhNT0PKXEeWJGdEk7kJ9Lg" type="5002">
-              <layoutConstraint xmi:type="notation:Location" xmi:id="_UhNT0fKXEeWJGdEk7kJ9Lg" y="5"/>
+          <children xmi:type="notation:Node" xmi:id="_VfmU4Bv7EeaHUeOe1L7u_Q" type="2003" element="_VeUigBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_Vf1lcBv7EeaHUeOe1L7u_Q" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_Vf4BsBv7EeaHUeOe1L7u_Q" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_Vf4BsRv7EeaHUeOe1L7u_Q"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_Vf4Bshv7EeaHUeOe1L7u_Q"/>
             </children>
-            <children xmi:type="notation:Node" xmi:id="_U1-p8PKXEeWJGdEk7kJ9Lg" type="3005" element="_UeMcEvKXEeWJGdEk7kJ9Lg">
-              <styles xmi:type="notation:ShapeStyle" xmi:id="_U1-p8fKXEeWJGdEk7kJ9Lg" fontName="Segoe UI"/>
-              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_U1-p8vKXEeWJGdEk7kJ9Lg"/>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_VfmU4Rv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_VfmU4hv7EeaHUeOe1L7u_Q" x="228" y="170"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_W_bI4Bv7EeaHUeOe1L7u_Q" type="2003" element="_W_NGcBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_W_cXABv7EeaHUeOe1L7u_Q" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_W_cXARv7EeaHUeOe1L7u_Q" type="7004">
+              <children xmi:type="notation:Node" xmi:id="_W_dlIBv7EeaHUeOe1L7u_Q" type="3010" element="_W_W3cBv7EeaHUeOe1L7u_Q">
+                <layoutConstraint xmi:type="notation:Location" xmi:id="_W_dlIRv7EeaHUeOe1L7u_Q"/>
+              </children>
+              <styles xmi:type="notation:SortingStyle" xmi:id="_W_cXAhv7EeaHUeOe1L7u_Q"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_W_cXAxv7EeaHUeOe1L7u_Q"/>
             </children>
-            <styles xmi:type="notation:ShapeStyle" xmi:id="_UgDdQfKXEeWJGdEk7kJ9Lg" fontName="Segoe UI" fontHeight="8"/>
-            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_UgDdQvKXEeWJGdEk7kJ9Lg" width="672" height="67"/>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_W_bI4Rv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8" italic="true"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_W_bI4hv7EeaHUeOe1L7u_Q" x="585" y="36"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_ZuohIBv7EeaHUeOe1L7u_Q" type="2003" element="_ZuKnEBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_ZupvQBv7EeaHUeOe1L7u_Q" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_ZupvQRv7EeaHUeOe1L7u_Q" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_ZupvQhv7EeaHUeOe1L7u_Q"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_ZupvQxv7EeaHUeOe1L7u_Q"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_ZuohIRv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZuohIhv7EeaHUeOe1L7u_Q" x="477" y="405"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_ZuqWUBv7EeaHUeOe1L7u_Q" type="2003" element="_ZuNqYBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_ZuqWUxv7EeaHUeOe1L7u_Q" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_ZuqWVBv7EeaHUeOe1L7u_Q" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_ZuqWVRv7EeaHUeOe1L7u_Q"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_ZuqWVhv7EeaHUeOe1L7u_Q"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_ZuqWURv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZuqWUhv7EeaHUeOe1L7u_Q" x="693" y="369"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_gFptkBv7EeaHUeOe1L7u_Q" type="2003" element="_gFIJIBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFqUoBv7EeaHUeOe1L7u_Q" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_gFq7sBv7EeaHUeOe1L7u_Q" type="7004">
+              <children xmi:type="notation:Node" xmi:id="_gFtX8Bv7EeaHUeOe1L7u_Q" type="3010" element="_gFWyoBv7EeaHUeOe1L7u_Q">
+                <layoutConstraint xmi:type="notation:Location" xmi:id="_gFtX8Rv7EeaHUeOe1L7u_Q"/>
+              </children>
+              <styles xmi:type="notation:SortingStyle" xmi:id="_gFq7sRv7EeaHUeOe1L7u_Q"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_gFq7shv7EeaHUeOe1L7u_Q"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_gFptkRv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFptkhv7EeaHUeOe1L7u_Q" x="1071" y="90"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_gFq7sxv7EeaHUeOe1L7u_Q" type="2003" element="_gFJXQBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFq7thv7EeaHUeOe1L7u_Q" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_gFq7txv7EeaHUeOe1L7u_Q" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_gFq7uBv7EeaHUeOe1L7u_Q"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_gFq7uRv7EeaHUeOe1L7u_Q"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_gFq7tBv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFq7tRv7EeaHUeOe1L7u_Q" x="1080" y="207"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_gFriwBv7EeaHUeOe1L7u_Q" type="2003" element="_gFKlYBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFriwxv7EeaHUeOe1L7u_Q" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_gFrixBv7EeaHUeOe1L7u_Q" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_gFrixRv7EeaHUeOe1L7u_Q"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_gFrixhv7EeaHUeOe1L7u_Q"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_gFriwRv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFriwhv7EeaHUeOe1L7u_Q" x="1089" y="324"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_gFsJ0Bv7EeaHUeOe1L7u_Q" type="2003" element="_gFLMdRv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFsJ0xv7EeaHUeOe1L7u_Q" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_gFsw4Bv7EeaHUeOe1L7u_Q" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_gFsw4Rv7EeaHUeOe1L7u_Q"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_gFsw4hv7EeaHUeOe1L7u_Q"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_gFsJ0Rv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFsJ0hv7EeaHUeOe1L7u_Q" x="1080" y="459"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_gFsw4xv7EeaHUeOe1L7u_Q" type="2003" element="_gFMakBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFsw5hv7EeaHUeOe1L7u_Q" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_gFsw5xv7EeaHUeOe1L7u_Q" type="7004">
+              <styles xmi:type="notation:SortingStyle" xmi:id="_gFsw6Bv7EeaHUeOe1L7u_Q"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_gFsw6Rv7EeaHUeOe1L7u_Q"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_gFsw5Bv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFsw5Rv7EeaHUeOe1L7u_Q" x="1089" y="603"/>
+          </children>
+          <children xmi:type="notation:Node" xmi:id="_gANxwCDOEeamRujSdBUx1A" type="2003" element="_f_3McCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_gAOY0CDOEeamRujSdBUx1A" type="5007"/>
+            <children xmi:type="notation:Node" xmi:id="_gAOY0SDOEeamRujSdBUx1A" type="7004">
+              <children xmi:type="notation:Node" xmi:id="_kRCGsCDOEeamRujSdBUx1A" type="3010" element="_kQtWkCDOEeamRujSdBUx1A">
+                <layoutConstraint xmi:type="notation:Location" xmi:id="_kRCGsSDOEeamRujSdBUx1A"/>
+              </children>
+              <children xmi:type="notation:Node" xmi:id="_0aCKkCDOEeamRujSdBUx1A" type="3010" element="_0Z0IICDOEeamRujSdBUx1A">
+                <layoutConstraint xmi:type="notation:Location" xmi:id="_0aCKkSDOEeamRujSdBUx1A"/>
+              </children>
+              <styles xmi:type="notation:SortingStyle" xmi:id="_gAOY0iDOEeamRujSdBUx1A"/>
+              <styles xmi:type="notation:FilteringStyle" xmi:id="_gAOY0yDOEeamRujSdBUx1A"/>
+            </children>
+            <styles xmi:type="notation:ShapeStyle" xmi:id="_gANxwSDOEeamRujSdBUx1A" fontName=".SF NS Text" fontHeight="8"/>
+            <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gANxwiDOEeamRujSdBUx1A" x="1485" y="324" width="120" height="100"/>
           </children>
           <styles xmi:type="notation:DiagramStyle" xmi:id="_UfkVEvKXEeWJGdEk7kJ9Lg"/>
+          <edges xmi:type="notation:Edge" xmi:id="_Zuv14Bv7EeaHUeOe1L7u_Q" type="4001" element="_Zubs0Bv7EeaHUeOe1L7u_Q" source="_VfmU4Bv7EeaHUeOe1L7u_Q" target="_ZuqWUBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_ZuxEABv7EeaHUeOe1L7u_Q" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZuxEARv7EeaHUeOe1L7u_Q" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_ZuxrEBv7EeaHUeOe1L7u_Q" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZuxrERv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_ZuySIBv7EeaHUeOe1L7u_Q" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZuySIRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_Zuv14Rv7EeaHUeOe1L7u_Q" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_Zuv14hv7EeaHUeOe1L7u_Q" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Zuv14xv7EeaHUeOe1L7u_Q" points="[228, 170, 228, 170]$[639, 446, 639, 446]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Zu9RQBv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Zu9RQRv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_Zu9RQhv7EeaHUeOe1L7u_Q" type="4001" element="_ZukPsBv7EeaHUeOe1L7u_Q" source="_VfmU4Bv7EeaHUeOe1L7u_Q" target="_ZuohIBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_Zu94UBv7EeaHUeOe1L7u_Q" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Zu94URv7EeaHUeOe1L7u_Q" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_Zu94Uhv7EeaHUeOe1L7u_Q" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Zu94Uxv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_Zu-fYBv7EeaHUeOe1L7u_Q" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Zu-fYRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_Zu9RQxv7EeaHUeOe1L7u_Q" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_Zu9RRBv7EeaHUeOe1L7u_Q" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Zu9RRRv7EeaHUeOe1L7u_Q" points="[228, 170, 228, 170]$[609, 416, 609, 416]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Zu-fYhv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Zu-fYxv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_Zu-fZBv7EeaHUeOe1L7u_Q" type="4001" element="_Zuk2zBv7EeaHUeOe1L7u_Q" source="_ZuohIBv7EeaHUeOe1L7u_Q" target="_W_bI4Bv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_Zu_GcBv7EeaHUeOe1L7u_Q" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Zu_GcRv7EeaHUeOe1L7u_Q" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_Zu_Gchv7EeaHUeOe1L7u_Q" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Zu_Gcxv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_Zu_GdBv7EeaHUeOe1L7u_Q" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Zu_GdRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_Zu-fZRv7EeaHUeOe1L7u_Q" routing="Tree"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_Zu-fZhv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Zu-fZxv7EeaHUeOe1L7u_Q" points="[609, 416, 609, 416]$[581, 216, 581, 216]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Zu_tgBv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Zu_tgRv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_Zu_tghv7EeaHUeOe1L7u_Q" type="4001" element="_ZunTABv7EeaHUeOe1L7u_Q" source="_ZuqWUBv7EeaHUeOe1L7u_Q" target="_W_bI4Bv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_Zu_thhv7EeaHUeOe1L7u_Q" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Zu_thxv7EeaHUeOe1L7u_Q" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_Zu_tiBv7EeaHUeOe1L7u_Q" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Zu_tiRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_ZvAUkBv7EeaHUeOe1L7u_Q" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_ZvAUkRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_Zu_tgxv7EeaHUeOe1L7u_Q" routing="Tree"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_Zu_thBv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Zu_thRv7EeaHUeOe1L7u_Q" points="[639, 446, 639, 446]$[581, 216, 581, 216]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ZvAUkhv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_ZvAUkxv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_gFumEBv7EeaHUeOe1L7u_Q" type="4001" element="_gFeucBv7EeaHUeOe1L7u_Q" source="_VfmU4Bv7EeaHUeOe1L7u_Q" target="_gFptkBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFumFBv7EeaHUeOe1L7u_Q" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFumFRv7EeaHUeOe1L7u_Q" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFumFhv7EeaHUeOe1L7u_Q" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFumFxv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFumGBv7EeaHUeOe1L7u_Q" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFumGRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_gFumERv7EeaHUeOe1L7u_Q" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_gFumEhv7EeaHUeOe1L7u_Q" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gFumExv7EeaHUeOe1L7u_Q" points="[228, 170, 228, 170]$[1081, 337, 1081, 337]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFvNIBv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFvNIRv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_gFvNIhv7EeaHUeOe1L7u_Q" type="4001" element="_gFiY0Bv7EeaHUeOe1L7u_Q" source="_W_bI4Bv7EeaHUeOe1L7u_Q" target="_gFq7sxv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFvNJhv7EeaHUeOe1L7u_Q" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFvNJxv7EeaHUeOe1L7u_Q" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFvNKBv7EeaHUeOe1L7u_Q" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFvNKRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFv0MBv7EeaHUeOe1L7u_Q" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFv0MRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_gFvNIxv7EeaHUeOe1L7u_Q" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_gFvNJBv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gFvNJRv7EeaHUeOe1L7u_Q" points="[585, 36, 585, 36]$[1111, 367, 1111, 367]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFv0Mhv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFv0Mxv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_gFv0NBv7EeaHUeOe1L7u_Q" type="4001" element="_gFk1Fhv7EeaHUeOe1L7u_Q" source="_W_bI4Bv7EeaHUeOe1L7u_Q" target="_gFsw4xv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFv0OBv7EeaHUeOe1L7u_Q" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFv0ORv7EeaHUeOe1L7u_Q" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFwbQBv7EeaHUeOe1L7u_Q" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFwbQRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFwbQhv7EeaHUeOe1L7u_Q" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFwbQxv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_gFv0NRv7EeaHUeOe1L7u_Q" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_gFv0Nhv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gFv0Nxv7EeaHUeOe1L7u_Q" points="[585, 36, 585, 36]$[1201, 457, 1201, 457]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFwbRBv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFwbRRv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_gFwbRhv7EeaHUeOe1L7u_Q" type="4001" element="_gFlcJhv7EeaHUeOe1L7u_Q" source="_W_bI4Bv7EeaHUeOe1L7u_Q" target="_gFsJ0Bv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFwbShv7EeaHUeOe1L7u_Q" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFwbSxv7EeaHUeOe1L7u_Q" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFxCUBv7EeaHUeOe1L7u_Q" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFxCURv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFxCUhv7EeaHUeOe1L7u_Q" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFxCUxv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_gFwbRxv7EeaHUeOe1L7u_Q" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_gFwbSBv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gFwbSRv7EeaHUeOe1L7u_Q" points="[585, 36, 585, 36]$[1171, 427, 1171, 427]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFxCVBv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFxCVRv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_gFxCVhv7EeaHUeOe1L7u_Q" type="4001" element="_gFmDMBv7EeaHUeOe1L7u_Q" source="_W_bI4Bv7EeaHUeOe1L7u_Q" target="_gFriwBv7EeaHUeOe1L7u_Q">
+            <children xmi:type="notation:Node" xmi:id="_gFxpYBv7EeaHUeOe1L7u_Q" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFxpYRv7EeaHUeOe1L7u_Q" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFxpYhv7EeaHUeOe1L7u_Q" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFxpYxv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_gFxpZBv7EeaHUeOe1L7u_Q" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_gFxpZRv7EeaHUeOe1L7u_Q" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_gFxCVxv7EeaHUeOe1L7u_Q" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_gFxCWBv7EeaHUeOe1L7u_Q" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_gFxCWRv7EeaHUeOe1L7u_Q" points="[585, 36, 585, 36]$[1141, 397, 1141, 397]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFxpZhv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_gFxpZxv7EeaHUeOe1L7u_Q" id="(0.5,0.5)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_7gq_oCDaEeamRujSdBUx1A" type="4001" element="_7gag8CDaEeamRujSdBUx1A" source="_gFq7sxv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_7gsNwCDaEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7gsNwSDaEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_7gs00CDaEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7gs00SDaEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_7gtb4CDaEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_7gtb4SDaEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_7gq_oSDaEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_7gq_oiDaEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_7gq_oyDaEeamRujSdBUx1A" points="[21, 9, -295, -126]$[407, 9, 91, -126]$[407, 121, 91, -14]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_7guC8CDaEeamRujSdBUx1A" id="(0.825,0.06)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_7guC8SDaEeamRujSdBUx1A" id="(0.075,0.15)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_LXcrECDbEeamRujSdBUx1A" type="4001" element="_LXP2wCDbEeamRujSdBUx1A" source="_gFq7sxv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_LXdSICDbEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LXdSISDbEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_LXdSIiDbEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LXdSIyDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_LXdSJCDbEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_LXdSJSDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_LXcrESDbEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_LXcrEiDbEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_LXcrEyDbEeamRujSdBUx1A" points="[21, 8, -298, -113]$[389, 8, 70, -113]$[389, 108, 70, -13]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_LXdSJiDbEeamRujSdBUx1A" id="(0.825,0.19)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_LXdSJyDbEeamRujSdBUx1A" id="(0.1,0.14)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_TxopICDbEeamRujSdBUx1A" type="4001" element="_TxffMCDbEeamRujSdBUx1A" source="_gFq7sxv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_TxpQMCDbEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TxpQMSDbEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_TxpQMiDbEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TxpQMyDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_TxpQNCDbEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_TxpQNSDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_TxopISDbEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_TxopIiDbEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_TxopIyDbEeamRujSdBUx1A" points="[59, -4, -302, -89]$[406, -4, 45, -89]$[406, 77, 45, -8]"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_TxpQNiDbEeamRujSdBUx1A" id="(0.13333333333333333,0.09)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_prvI8CDbEeamRujSdBUx1A" type="4001" element="_prkJ0CDbEeamRujSdBUx1A" source="_gFriwBv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_prvI9CDbEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_prvI9SDbEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_prvI9iDbEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_prvI9yDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_prvI-CDbEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_prvI-SDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_prvI8SDbEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_prvI8iDbEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_prvI8yDbEeamRujSdBUx1A" points="[16, 7, -280, 1]$[297, 1, 1, -5]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_prvwACDbEeamRujSdBUx1A" id="(0.8666666666666667,0.09)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_prvwASDbEeamRujSdBUx1A" id="(0.025,0.06)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_vbsVYCDbEeamRujSdBUx1A" type="4001" element="_vbikYCDbEeamRujSdBUx1A" source="_gFriwBv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_vbsVZCDbEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vbsVZSDbEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_vbsVZiDbEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vbsVZyDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_vbsVaCDbEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_vbsVaSDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_vbsVYSDbEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_vbsVYiDbEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_vbsVYyDbEeamRujSdBUx1A" points="[22, 13, -301, 13]$[300, 13, -23, 13]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vbsVaiDbEeamRujSdBUx1A" id="(0.8166666666666667,0.15)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_vbsVayDbEeamRujSdBUx1A" id="(0.2,0.15)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_21EWsCDbEeamRujSdBUx1A" type="4001" element="_207z0CDbEeamRujSdBUx1A" source="_gFriwBv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_21EWtCDbEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_21EWtSDbEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_21EWtiDbEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_21EWtyDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_21E9wCDbEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_21E9wSDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_21EWsSDbEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_21EWsiDbEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_21EWsyDbEeamRujSdBUx1A" points="[59, -4, -329, 32]$[337, -4, -51, 32]"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_21E9wiDbEeamRujSdBUx1A" id="(0.43333333333333335,0.14)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="__87TECDbEeamRujSdBUx1A" type="4001" element="__8z-UCDbEeamRujSdBUx1A" source="_gFsJ0Bv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="__876ICDbEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="__876ISDbEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="__876IiDbEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="__876IyDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="__876JCDbEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="__876JSDbEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="__87TESDbEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="__87TEiDbEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="__87TEyDbEeamRujSdBUx1A" points="[12, -2, -295, 67]$[155, -2, -152, 67]$[155, -80, -152, -11]$[299, -80, -8, -11]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="__876JiDbEeamRujSdBUx1A" id="(0.9,0.09)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="__876JyDbEeamRujSdBUx1A" id="(0.075,0.76)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_E72EICDcEeamRujSdBUx1A" type="4001" element="_E7thQCDcEeamRujSdBUx1A" source="_gFsJ0Bv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_E72rMCDcEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E72rMSDcEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_E72rMiDcEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E72rMyDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_E72rNCDcEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_E72rNSDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_E72EISDcEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_E72EIiDcEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_E72EIyDcEeamRujSdBUx1A" points="[37, 11, -314, 79]$[189, 11, -162, 79]$[189, -70, -162, -2]$[324, -70, -27, -2]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_E72rNiDcEeamRujSdBUx1A" id="(0.6916666666666667,0.08)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_E72rNyDcEeamRujSdBUx1A" id="(0.23333333333333334,0.76)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_Kt6JYCDcEeamRujSdBUx1A" type="4001" element="_KtyNkCDcEeamRujSdBUx1A" source="_gFsJ0Bv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_Kt6wcCDcEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kt6wcSDcEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_Kt6wciDcEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kt6wcyDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_Kt6wdCDcEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_Kt6wdSDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_Kt6JYSDcEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_Kt6JYiDcEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_Kt6JYyDcEeamRujSdBUx1A" points="[29, 9, -377, 99]$[334, 9, -72, 99]$[334, -55, -72, 35]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Kt6wdiDcEeamRujSdBUx1A" id="(0.7583333333333333,0.19)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_Kt6wdyDcEeamRujSdBUx1A" id="(0.7666666666666667,0.65)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_W1-HYCDcEeamRujSdBUx1A" type="4001" element="_W11kgCDcEeamRujSdBUx1A" source="_gFsJ0Bv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_W1-HZCDcEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_W1-HZSDcEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_W1-ucCDcEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_W1-ucSDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_W1-uciDcEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_W1-ucyDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_W1-HYSDcEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_W1-HYiDcEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_W1-HYyDcEeamRujSdBUx1A" points="[21, 30, -346, 131]$[335, 30, -32, 131]$[335, -52, -32, 49]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_W1-udCDcEeamRujSdBUx1A" id="(0.825,0.16)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_faS44CDcEeamRujSdBUx1A" type="4001" element="_faJH4CDcEeamRujSdBUx1A" source="_gFsw4xv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_faS45CDcEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_faS45SDcEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_faTf8CDcEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_faTf8SDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_faTf8iDcEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_faTf8yDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_faS44SDcEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_faS44iDcEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_faS44yDcEeamRujSdBUx1A" points="[16, -9, -353, 209]$[371, -194, 2, 24]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_faTf9CDcEeamRujSdBUx1A" id="(0.8666666666666667,0.14)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_faTf9SDcEeamRujSdBUx1A" id="(0.6416666666666667,0.76)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_mb1pACDcEeamRujSdBUx1A" type="4001" element="_mbqC0CDcEeamRujSdBUx1A" source="_gFsw4xv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_mb2QECDcEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mb2QESDcEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_mb2QEiDcEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mb2QEyDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_mb2QFCDcEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_mb2QFSDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_mb1pASDcEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_mb1pAiDcEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_mb1pAyDcEeamRujSdBUx1A" points="[18, 6, -352, 222]$[347, 6, -23, 222]$[347, -202, -23, 14]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mb2QFiDcEeamRujSdBUx1A" id="(0.85,0.22)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_mb2QFyDcEeamRujSdBUx1A" id="(0.6333333333333333,0.86)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_rd4mkCDcEeamRujSdBUx1A" type="4001" element="_rdwDsCDcEeamRujSdBUx1A" source="_gFsw4xv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_rd4mlCDcEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rd4mlSDcEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_rd4mliDcEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rd4mlyDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_rd4mmCDcEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_rd4mmSDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_rd4mkSDcEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_rd4mkiDcEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_rd4mkyDcEeamRujSdBUx1A" points="[19, 40, -337, 284]$[357, 40, 1, 284]$[357, -195, 1, 49]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_rd4mmiDcEeamRujSdBUx1A" id="(0.8416666666666667,0.15)"/>
+          </edges>
+          <edges xmi:type="notation:Edge" xmi:id="_v1eR4CDcEeamRujSdBUx1A" type="4001" element="_v1WWECDcEeamRujSdBUx1A" source="_gFsw4xv7EeaHUeOe1L7u_Q" target="_gANxwCDOEeamRujSdBUx1A">
+            <children xmi:type="notation:Node" xmi:id="_v1eR5CDcEeamRujSdBUx1A" type="6001">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v1eR5SDcEeamRujSdBUx1A" y="-10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_v1eR5iDcEeamRujSdBUx1A" type="6002">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v1eR5yDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <children xmi:type="notation:Node" xmi:id="_v1e48CDcEeamRujSdBUx1A" type="6003">
+              <layoutConstraint xmi:type="notation:Bounds" xmi:id="_v1e48SDcEeamRujSdBUx1A" y="10"/>
+            </children>
+            <styles xmi:type="notation:ConnectorStyle" xmi:id="_v1eR4SDcEeamRujSdBUx1A" routing="Rectilinear" jumpLinkStatus="Above"/>
+            <styles xmi:type="notation:FontStyle" xmi:id="_v1eR4iDcEeamRujSdBUx1A" fontColor="7490599" fontName=".SF NS Text" fontHeight="8"/>
+            <bendpoints xmi:type="notation:RelativeBendpoints" xmi:id="_v1eR4yDcEeamRujSdBUx1A" points="[29, 76, -349, 282]$[397, 76, 19, 282]$[397, -186, 19, 20]"/>
+            <sourceAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v1e48iDcEeamRujSdBUx1A" id="(0.7583333333333333,0.06)"/>
+            <targetAnchor xmi:type="notation:IdentityAnchor" xmi:id="_v1e48yDcEeamRujSdBUx1A" id="(0.6083333333333333,0.8)"/>
+          </edges>
         </data>
       </ownedAnnotationEntries>
-      <ownedDiagramElements xmi:type="diagram:DNode" xmi:id="_UeMcEfKXEeWJGdEk7kJ9Lg" width="-1" height="-1">
-        <target xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
-        <semanticElements xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
-        <ownedStyle xmi:type="diagram:WorkspaceImage" xmi:id="_UeMcEvKXEeWJGdEk7kJ9Lg" showIcon="false" labelPosition="node" workspacePath="/org.eclipse.emf.ecoretools.design/icons/full/back/empty.svg">
-          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_UeMcE_KXEeWJGdEk7kJ9Lg"/>
-          <description xmi:type="style:WorkspaceImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']/@style"/>
-          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_UeMcFPKXEeWJGdEk7kJ9Lg"/>
+      <ownedAnnotationEntries xmi:type="description:AnnotationEntry" xmi:id="_ZueJEBv7EeaHUeOe1L7u_Q" source="DANNOTATION_CUSTOMIZATION_KEY">
+        <data xmi:type="diagram:ComputedStyleDescriptionRegistry" xmi:id="_ZuewIBv7EeaHUeOe1L7u_Q">
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_ZuglUhv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_ZuglUxv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_ZuglVBv7EeaHUeOe1L7u_Q" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_Zuk2whv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_Zuk2wxv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_Zuk2xBv7EeaHUeOe1L7u_Q" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_gFfVghv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_gFfVgxv7EeaHUeOe1L7u_Q" labelFormat="bold" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_gFfVhBv7EeaHUeOe1L7u_Q" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_y1QAQxv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <beginLabelStyleDescription xmi:type="style:BeginLabelStyleDescription" xmi:id="_y1QARBv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:renderEOpposite">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </beginLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_y1QARRv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_1NS1shv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <beginLabelStyleDescription xmi:type="style:BeginLabelStyleDescription" xmi:id="_1NS1sxv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:renderEOpposite">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </beginLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_1NS1tBv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_2cS_chv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <beginLabelStyleDescription xmi:type="style:BeginLabelStyleDescription" xmi:id="_2cS_cxv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:renderEOpposite">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </beginLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_2cS_dBv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_3yZ2whv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <beginLabelStyleDescription xmi:type="style:BeginLabelStyleDescription" xmi:id="_3yZ2wxv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:renderEOpposite">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </beginLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_3yZ2xBv7EeaHUeOe1L7u_Q" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_7gbIASDaEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_7gbIAiDaEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_7gbIAyDaEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_LXQd0iDbEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_LXQd0yDbEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_LXQd1CDbEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_TxffMyDbEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_TxffNCDbEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_TxffNSDbEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_prkw4iDbEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_prkw4yDbEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_prkw5CDbEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_vbjLciDbEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_vbjLcyDbEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_vbjLdCDbEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_208a4iDbEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_208a4yDbEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_208a5CDbEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="__8z-UyDbEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="__8z-VCDbEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="__8z-VSDbEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_E7thQyDcEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_E7thRCDcEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_E7thRSDcEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_KtyNkyDcEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_KtyNlCDcEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_KtyNlSDcEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_W12LkiDcEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_W12LkyDcEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_W12LlCDcEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_faJu8SDcEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_faJu8iDcEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_faJu8yDcEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_mbrQ8iDcEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_mbrQ8yDcEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_mbrQ9CDcEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_rdwqwiDcEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_rdwqwyDcEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_rdwqxCDcEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <computedStyleDescriptions xmi:type="style:EdgeStyleDescription" xmi:id="_v1WWEyDcEeamRujSdBUx1A" sourceArrow="FillDiamond" sizeComputationExpression="1" routingStyle="manhattan">
+            <strokeColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            <centerLabelStyleDescription xmi:type="style:CenterLabelStyleDescription" xmi:id="_v1WWFCDcEeamRujSdBUx1A" showIcon="false" labelExpression="service:render">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='black']"/>
+            </centerLabelStyleDescription>
+            <endLabelStyleDescription xmi:type="style:EndLabelStyleDescription" xmi:id="_v1WWFSDcEeamRujSdBUx1A" labelSize="6" showIcon="false" labelExpression="service:eKeysLabel">
+              <labelColor xmi:type="description:SystemColor" href="environment:/viewpoint#//@systemColors/@entries[name='dark_blue']"/>
+            </endLabelStyleDescription>
+          </computedStyleDescriptions>
+          <cache xmi:type="diagram:DiagramElementMapping2ModelElement" xmi:id="_ZufXMBv7EeaHUeOe1L7u_Q">
+            <key xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_ZuglUBv7EeaHUeOe1L7u_Q">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//Monitoring/ThreadNames"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_ZuglURv7EeaHUeOe1L7u_Q" key="_Zubs0Bv7EeaHUeOe1L7u_Q">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_ZuhMYBv7EeaHUeOe1L7u_Q" value="_ZuglUhv7EeaHUeOe1L7u_Q">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_Zuk2wBv7EeaHUeOe1L7u_Q">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//Monitoring/SharedResources"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_Zuk2wRv7EeaHUeOe1L7u_Q" key="_ZukPsBv7EeaHUeOe1L7u_Q">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_Zuk2xRv7EeaHUeOe1L7u_Q" value="_Zuk2whv7EeaHUeOe1L7u_Q">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_gFfVgBv7EeaHUeOe1L7u_Q">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//Monitoring/analysisContext"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_gFfVgRv7EeaHUeOe1L7u_Q" key="_gFeucBv7EeaHUeOe1L7u_Q">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_gFfVhRv7EeaHUeOe1L7u_Q" value="_gFfVghv7EeaHUeOe1L7u_Q">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_7gag8SDaEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/minimum"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_7gbIACDaEeamRujSdBUx1A" key="_7gag8CDaEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_7gbIBCDaEeamRujSdBUx1A" value="_7gbIASDaEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_LXQd0CDbEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/maximum"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_LXQd0SDbEeamRujSdBUx1A" key="_LXP2wCDbEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_LXQd1SDbEeamRujSdBUx1A" value="_LXQd0iDbEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_TxffMSDbEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/average"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_TxffMiDbEeamRujSdBUx1A" key="_TxffMCDbEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_TxffNiDbEeamRujSdBUx1A" value="_TxffMyDbEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_prkw4CDbEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/minimum"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_prkw4SDbEeamRujSdBUx1A" key="_prkJ0CDbEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_prkw5SDbEeamRujSdBUx1A" value="_prkw4iDbEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_vbjLcCDbEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/maximum"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_vbjLcSDbEeamRujSdBUx1A" key="_vbikYCDbEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_vbjLdSDbEeamRujSdBUx1A" value="_vbjLciDbEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_208a4CDbEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/average"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_208a4SDbEeamRujSdBUx1A" key="_207z0CDbEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_208a5SDbEeamRujSdBUx1A" value="_208a4iDbEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="__8z-USDbEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//Period/minimum"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="__8z-UiDbEeamRujSdBUx1A" key="__8z-UCDbEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="__8z-ViDbEeamRujSdBUx1A" value="__8z-UyDbEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_E7thQSDcEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//Period/maximum"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_E7thQiDcEeamRujSdBUx1A" key="_E7thQCDcEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_E7thRiDcEeamRujSdBUx1A" value="_E7thQyDcEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_KtyNkSDcEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//Period/average"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_KtyNkiDcEeamRujSdBUx1A" key="_KtyNkCDcEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_KtyNliDcEeamRujSdBUx1A" value="_KtyNkyDcEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_W12LkCDcEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//Period/jitter"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_W12LkSDcEeamRujSdBUx1A" key="_W11kgCDcEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_W12LlSDcEeamRujSdBUx1A" value="_W12LkiDcEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_faJH4SDcEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/minimum"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_faJu8CDcEeamRujSdBUx1A" key="_faJH4CDcEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_faJu9CDcEeamRujSdBUx1A" value="_faJu8SDcEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_mbrQ8CDcEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/maximum"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_mbrQ8SDcEeamRujSdBUx1A" key="_mbqC0CDcEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_mbrQ9SDcEeamRujSdBUx1A" value="_mbrQ8iDcEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_rdwqwCDcEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/average"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_rdwqwSDcEeamRujSdBUx1A" key="_rdwDsCDcEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_rdwqxSDcEeamRujSdBUx1A" value="_rdwqwiDcEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_v1WWESDcEeamRujSdBUx1A">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/jitter"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_v1WWEiDcEeamRujSdBUx1A" key="_v1WWECDcEeamRujSdBUx1A">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_v1WWFiDcEeamRujSdBUx1A" value="_v1WWEyDcEeamRujSdBUx1A">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+          </cache>
+          <cache xmi:type="diagram:DiagramElementMapping2ModelElement" xmi:id="_y1QAQBv7EeaHUeOe1L7u_Q">
+            <key xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='Bi-directional%20EC_EReference%20']"/>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_y1QAQRv7EeaHUeOe1L7u_Q">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/executiontime"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_y1QAQhv7EeaHUeOe1L7u_Q" key="_gFmDMBv7EeaHUeOe1L7u_Q">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_y1QARhv7EeaHUeOe1L7u_Q" value="_y1QAQxv7EeaHUeOe1L7u_Q">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_1NS1sBv7EeaHUeOe1L7u_Q">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/blockingtime"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_1NS1sRv7EeaHUeOe1L7u_Q" key="_gFiY0Bv7EeaHUeOe1L7u_Q">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_1NS1tRv7EeaHUeOe1L7u_Q" value="_1NS1shv7EeaHUeOe1L7u_Q">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_2cS_cBv7EeaHUeOe1L7u_Q">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/period"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_2cS_cRv7EeaHUeOe1L7u_Q" key="_gFlcJhv7EeaHUeOe1L7u_Q">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_2cS_dRv7EeaHUeOe1L7u_Q" value="_2cS_chv7EeaHUeOe1L7u_Q">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+            <value xmi:type="diagram:ModelElement2ViewVariable" xmi:id="_3yZ2wBv7EeaHUeOe1L7u_Q">
+              <key xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/responsetime"/>
+              <value xmi:type="diagram:ViewVariable2ContainerVariable" xmi:id="_3yZ2wRv7EeaHUeOe1L7u_Q" key="_gFk1Fhv7EeaHUeOe1L7u_Q">
+                <value xmi:type="diagram:ContainerVariable2StyleDescription" xmi:id="_3yZ2xRv7EeaHUeOe1L7u_Q" value="_3yZ2whv7EeaHUeOe1L7u_Q">
+                  <key xmi:type="ecore:EPackage" href="monitoring.ecore#/"/>
+                </value>
+              </value>
+            </value>
+          </cache>
+        </data>
+      </ownedAnnotationEntries>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_VeUigBv7EeaHUeOe1L7u_Q" name="Monitoring" tooltipText="" outgoingEdges="_Zubs0Bv7EeaHUeOe1L7u_Q _ZukPsBv7EeaHUeOe1L7u_Q _gFeucBv7EeaHUeOe1L7u_Q" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//Monitoring"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//Monitoring"/>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_VeorkBv7EeaHUeOe1L7u_Q" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_VeorkRv7EeaHUeOe1L7u_Q"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_Veorkhv7EeaHUeOe1L7u_Q"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_Veorkxv7EeaHUeOe1L7u_Q" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_VeorlBv7EeaHUeOe1L7u_Q" red="255" green="252" blue="216"/>
         </ownedStyle>
-        <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@nodeMappings[name='Empty%20Diagram']"/>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_W_NGcBv7EeaHUeOe1L7u_Q" name="MonitoredResource" tooltipText="" outgoingEdges="_gFiY0Bv7EeaHUeOe1L7u_Q _gFk1Fhv7EeaHUeOe1L7u_Q _gFlcJhv7EeaHUeOe1L7u_Q _gFmDMBv7EeaHUeOe1L7u_Q" incomingEdges="_Zuk2zBv7EeaHUeOe1L7u_Q _ZunTABv7EeaHUeOe1L7u_Q" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//MonitoredResource"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//MonitoredResource"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_W_QJwBv7EeaHUeOe1L7u_Q" labelFormat="italic" iconPath="/org.eclipse.emf.ecoretools.design/icons/full/obj16/EClass_abstract.gif" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_W_QJwRv7EeaHUeOe1L7u_Q"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@conditionnalStyles.1/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_W_QJwhv7EeaHUeOe1L7u_Q" red="125" green="125" blue="125"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_W_QJwxv7EeaHUeOe1L7u_Q" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_W_QJxBv7EeaHUeOe1L7u_Q" red="228" green="228" blue="228"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+        <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_W_W3cBv7EeaHUeOe1L7u_Q" name="name : EString" tooltipText="">
+          <target xmi:type="ecore:EAttribute" href="monitoring.ecore#//MonitoredResource/name"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="monitoring.ecore#//MonitoredResource/name"/>
+          <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_W_YsoBv7EeaHUeOe1L7u_Q" labelAlignment="LEFT">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_W_YsoRv7EeaHUeOe1L7u_Q"/>
+            <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
+            <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_W_Ysohv7EeaHUeOe1L7u_Q"/>
+            <color xmi:type="viewpoint:RGBValues" xmi:id="_W_Ysoxv7EeaHUeOe1L7u_Q"/>
+          </ownedStyle>
+          <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
+        </ownedElements>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_ZuKnEBv7EeaHUeOe1L7u_Q" name="Resource" tooltipText="" outgoingEdges="_Zuk2zBv7EeaHUeOe1L7u_Q" incomingEdges="_ZukPsBv7EeaHUeOe1L7u_Q" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//Resource"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//Resource"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_ZuMcQBv7EeaHUeOe1L7u_Q" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ZuMcQRv7EeaHUeOe1L7u_Q"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_ZuMcQhv7EeaHUeOe1L7u_Q"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_ZuMcQxv7EeaHUeOe1L7u_Q" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_ZuMcRBv7EeaHUeOe1L7u_Q" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_ZuNqYBv7EeaHUeOe1L7u_Q" name="Thread" tooltipText="" outgoingEdges="_ZunTABv7EeaHUeOe1L7u_Q" incomingEdges="_Zubs0Bv7EeaHUeOe1L7u_Q" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//Thread"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//Thread"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_ZuORcBv7EeaHUeOe1L7u_Q" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ZuORcRv7EeaHUeOe1L7u_Q"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_ZuORchv7EeaHUeOe1L7u_Q"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_ZuORcxv7EeaHUeOe1L7u_Q" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_ZuORdBv7EeaHUeOe1L7u_Q" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_Zubs0Bv7EeaHUeOe1L7u_Q" name="[0..*] ThreadNames" sourceNode="_VeUigBv7EeaHUeOe1L7u_Q" targetNode="_ZuNqYBv7EeaHUeOe1L7u_Q">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//Monitoring/ThreadNames"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//Monitoring/ThreadNames"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_ZujBkBv7EeaHUeOe1L7u_Q" description="_ZuglUhv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_ZujBkRv7EeaHUeOe1L7u_Q"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_ZujBkhv7EeaHUeOe1L7u_Q" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ZujBkxv7EeaHUeOe1L7u_Q"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_ZujBlBv7EeaHUeOe1L7u_Q" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ZujBlRv7EeaHUeOe1L7u_Q" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_ZukPsBv7EeaHUeOe1L7u_Q" name="[0..*] SharedResources" sourceNode="_VeUigBv7EeaHUeOe1L7u_Q" targetNode="_ZuKnEBv7EeaHUeOe1L7u_Q">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//Monitoring/SharedResources"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//Monitoring/SharedResources"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_Zuk2xhv7EeaHUeOe1L7u_Q" description="_Zuk2whv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_Zuk2xxv7EeaHUeOe1L7u_Q"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_Zuk2yBv7EeaHUeOe1L7u_Q" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_Zuk2yRv7EeaHUeOe1L7u_Q"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_Zuk2yhv7EeaHUeOe1L7u_Q" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_Zuk2yxv7EeaHUeOe1L7u_Q" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_Zuk2zBv7EeaHUeOe1L7u_Q" sourceNode="_ZuKnEBv7EeaHUeOe1L7u_Q" targetNode="_W_NGcBv7EeaHUeOe1L7u_Q">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//Resource"/>
+        <semanticElements xmi:type="ecore:EGenericType" href="monitoring.ecore#//Resource/@eGenericSuperTypes.0"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_ZumE4Bv7EeaHUeOe1L7u_Q" targetArrow="InputClosedArrow" routingStyle="tree">
+          <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_ZumE4Rv7EeaHUeOe1L7u_Q" red="136" green="136" blue="136"/>
+          <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_ZumE4hv7EeaHUeOe1L7u_Q" labelFormat="italic" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ZumE4xv7EeaHUeOe1L7u_Q"/>
+          </beginLabelStyle>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_ZumE5Bv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ZumE5Rv7EeaHUeOe1L7u_Q"/>
+          </centerLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_ZunTABv7EeaHUeOe1L7u_Q" sourceNode="_ZuNqYBv7EeaHUeOe1L7u_Q" targetNode="_W_NGcBv7EeaHUeOe1L7u_Q">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//Thread"/>
+        <semanticElements xmi:type="ecore:EGenericType" href="monitoring.ecore#//Thread/@eGenericSuperTypes.0"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_ZunTARv7EeaHUeOe1L7u_Q" targetArrow="InputClosedArrow" routingStyle="tree">
+          <description xmi:type="style:EdgeStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']/@style"/>
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_ZunTAhv7EeaHUeOe1L7u_Q" red="136" green="136" blue="136"/>
+          <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_ZunTAxv7EeaHUeOe1L7u_Q" labelFormat="italic" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ZunTBBv7EeaHUeOe1L7u_Q"/>
+          </beginLabelStyle>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_ZunTBRv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ZunTBhv7EeaHUeOe1L7u_Q"/>
+          </centerLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC%20ESupertypes']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_gFIJIBv7EeaHUeOe1L7u_Q" name="AnalysisContext" tooltipText="" incomingEdges="_gFeucBv7EeaHUeOe1L7u_Q" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//AnalysisContext"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//AnalysisContext"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_gFIwMBv7EeaHUeOe1L7u_Q" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_gFIwMRv7EeaHUeOe1L7u_Q"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_gFIwMhv7EeaHUeOe1L7u_Q"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_gFIwMxv7EeaHUeOe1L7u_Q" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_gFIwNBv7EeaHUeOe1L7u_Q" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+        <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_gFWyoBv7EeaHUeOe1L7u_Q" name="name : EString" tooltipText="">
+          <target xmi:type="ecore:EAttribute" href="monitoring.ecore#//AnalysisContext/name"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="monitoring.ecore#//AnalysisContext/name"/>
+          <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_gFWyoRv7EeaHUeOe1L7u_Q" labelAlignment="LEFT">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_gFWyohv7EeaHUeOe1L7u_Q"/>
+            <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
+            <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_gFWyoxv7EeaHUeOe1L7u_Q"/>
+            <color xmi:type="viewpoint:RGBValues" xmi:id="_gFWypBv7EeaHUeOe1L7u_Q"/>
+          </ownedStyle>
+          <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
+        </ownedElements>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_gFJXQBv7EeaHUeOe1L7u_Q" name="BlockingTime" tooltipText="" outgoingEdges="_7gag8CDaEeamRujSdBUx1A _LXP2wCDbEeamRujSdBUx1A _TxffMCDbEeamRujSdBUx1A" incomingEdges="_gFiY0Bv7EeaHUeOe1L7u_Q" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//BlockingTime"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//BlockingTime"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_Pf01sCDbEeamRujSdBUx1A" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_Pf01sSDbEeamRujSdBUx1A"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_Pf01siDbEeamRujSdBUx1A"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_Pf01syDbEeamRujSdBUx1A" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_Pf01tCDbEeamRujSdBUx1A" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_gFKlYBv7EeaHUeOe1L7u_Q" name="ExecutionTime" tooltipText="" outgoingEdges="_prkJ0CDbEeamRujSdBUx1A _vbikYCDbEeamRujSdBUx1A _207z0CDbEeamRujSdBUx1A" incomingEdges="_gFmDMBv7EeaHUeOe1L7u_Q" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//ExecutionTime"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//ExecutionTime"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_ySQS0CDbEeamRujSdBUx1A" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ySQS0SDbEeamRujSdBUx1A"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_ySQS0iDbEeamRujSdBUx1A"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_ySQS0yDbEeamRujSdBUx1A" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_ySQS1CDbEeamRujSdBUx1A" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_gFLMdRv7EeaHUeOe1L7u_Q" name="Period" tooltipText="" outgoingEdges="__8z-UCDbEeamRujSdBUx1A _E7thQCDcEeamRujSdBUx1A _KtyNkCDcEeamRujSdBUx1A _W11kgCDcEeamRujSdBUx1A" incomingEdges="_gFlcJhv7EeaHUeOe1L7u_Q" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//Period"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//Period"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_Ze8UwCDcEeamRujSdBUx1A" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_Ze8UwSDcEeamRujSdBUx1A"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_Ze8UwiDcEeamRujSdBUx1A"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_Ze8UwyDcEeamRujSdBUx1A" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_Ze8UxCDcEeamRujSdBUx1A" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_gFMakBv7EeaHUeOe1L7u_Q" name="ResponseTime" tooltipText="" outgoingEdges="_faJH4CDcEeamRujSdBUx1A _mbqC0CDcEeamRujSdBUx1A _rdwDsCDcEeamRujSdBUx1A _v1WWECDcEeamRujSdBUx1A" incomingEdges="_gFk1Fhv7EeaHUeOe1L7u_Q" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//ResponseTime"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//ResponseTime"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_ysC2YCDcEeamRujSdBUx1A" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ysC2YSDcEeamRujSdBUx1A"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_ysC2YiDcEeamRujSdBUx1A"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_ysC2YyDcEeamRujSdBUx1A" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_ysC2ZCDcEeamRujSdBUx1A" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_gFeucBv7EeaHUeOe1L7u_Q" name="[1..1] analysisContext" sourceNode="_VeUigBv7EeaHUeOe1L7u_Q" targetNode="_gFIJIBv7EeaHUeOe1L7u_Q">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//Monitoring/analysisContext"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//Monitoring/analysisContext"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_gFf8kBv7EeaHUeOe1L7u_Q" description="_gFfVghv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_gFf8kRv7EeaHUeOe1L7u_Q"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_gFf8khv7EeaHUeOe1L7u_Q" labelFormat="bold" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_gFf8kxv7EeaHUeOe1L7u_Q"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_gFf8lBv7EeaHUeOe1L7u_Q" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_gFf8lRv7EeaHUeOe1L7u_Q" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_gFiY0Bv7EeaHUeOe1L7u_Q" sourceNode="_W_NGcBv7EeaHUeOe1L7u_Q" targetNode="_gFJXQBv7EeaHUeOe1L7u_Q" beginLabel="[0..1] monitoredresource" endLabel="[0..1] blockingtime">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/blockingtime"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/blockingtime"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/monitoredresource"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_1NS1thv7EeaHUeOe1L7u_Q" description="_1NS1shv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_1NS1txv7EeaHUeOe1L7u_Q"/>
+          <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_1NS1uBv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_1NS1uRv7EeaHUeOe1L7u_Q"/>
+          </beginLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_1NS1uhv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_1NS1uxv7EeaHUeOe1L7u_Q"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='Bi-directional%20EC_EReference%20']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_gFk1Fhv7EeaHUeOe1L7u_Q" sourceNode="_W_NGcBv7EeaHUeOe1L7u_Q" targetNode="_gFMakBv7EeaHUeOe1L7u_Q" beginLabel="[0..1] monitoredresource" endLabel="[0..1] responsetime">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/responsetime"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/monitoredresource"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/responsetime"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_3yZ2xhv7EeaHUeOe1L7u_Q" description="_3yZ2whv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_3yZ2xxv7EeaHUeOe1L7u_Q"/>
+          <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_3yZ2yBv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_3yZ2yRv7EeaHUeOe1L7u_Q"/>
+          </beginLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_3yZ2yhv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_3yZ2yxv7EeaHUeOe1L7u_Q"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='Bi-directional%20EC_EReference%20']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_gFlcJhv7EeaHUeOe1L7u_Q" sourceNode="_W_NGcBv7EeaHUeOe1L7u_Q" targetNode="_gFLMdRv7EeaHUeOe1L7u_Q" beginLabel="[0..1] monitoredresource" endLabel="[0..1] period">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/period"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//Period/monitoredresource"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/period"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_2cS_dhv7EeaHUeOe1L7u_Q" description="_2cS_chv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_2cS_dxv7EeaHUeOe1L7u_Q"/>
+          <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_2cS_eBv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_2cS_eRv7EeaHUeOe1L7u_Q"/>
+          </beginLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_2cS_ehv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_2cS_exv7EeaHUeOe1L7u_Q"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='Bi-directional%20EC_EReference%20']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_gFmDMBv7EeaHUeOe1L7u_Q" sourceNode="_W_NGcBv7EeaHUeOe1L7u_Q" targetNode="_gFKlYBv7EeaHUeOe1L7u_Q" beginLabel="[0..1] monitoredresource" endLabel="[0..1] executiontime">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/executiontime"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//MonitoredResource/executiontime"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/monitoredresource"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_y1QARxv7EeaHUeOe1L7u_Q" description="_y1QAQxv7EeaHUeOe1L7u_Q" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_y1QASBv7EeaHUeOe1L7u_Q"/>
+          <beginLabelStyle xmi:type="diagram:BeginLabelStyle" xmi:id="_y1QASRv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_y1QAShv7EeaHUeOe1L7u_Q"/>
+          </beginLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_y1QASxv7EeaHUeOe1L7u_Q" showIcon="false">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_y1QATBv7EeaHUeOe1L7u_Q"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='Bi-directional%20EC_EReference%20']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DNodeList" xmi:id="_f_3McCDOEeamRujSdBUx1A" name="MeasuredValue" tooltipText="" incomingEdges="_7gag8CDaEeamRujSdBUx1A _LXP2wCDbEeamRujSdBUx1A _TxffMCDbEeamRujSdBUx1A _prkJ0CDbEeamRujSdBUx1A _vbikYCDbEeamRujSdBUx1A _207z0CDbEeamRujSdBUx1A __8z-UCDbEeamRujSdBUx1A _E7thQCDcEeamRujSdBUx1A _KtyNkCDcEeamRujSdBUx1A _W11kgCDcEeamRujSdBUx1A _faJH4CDcEeamRujSdBUx1A _mbqC0CDcEeamRujSdBUx1A _rdwDsCDcEeamRujSdBUx1A _v1WWECDcEeamRujSdBUx1A" width="12" height="10">
+        <target xmi:type="ecore:EClass" href="monitoring.ecore#//MeasuredValue"/>
+        <semanticElements xmi:type="ecore:EClass" href="monitoring.ecore#//MeasuredValue"/>
+        <arrangeConstraints>KEEP_LOCATION</arrangeConstraints>
+        <arrangeConstraints>KEEP_SIZE</arrangeConstraints>
+        <arrangeConstraints>KEEP_RATIO</arrangeConstraints>
+        <ownedStyle xmi:type="diagram:FlatContainerStyle" xmi:id="_3aayYCDOEeamRujSdBUx1A" backgroundStyle="Liquid">
+          <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_3aayYSDOEeamRujSdBUx1A"/>
+          <description xmi:type="style:FlatContainerStyleDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@style"/>
+          <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_3aayYiDOEeamRujSdBUx1A"/>
+          <backgroundColor xmi:type="viewpoint:RGBValues" xmi:id="_3aayYyDOEeamRujSdBUx1A" red="255" green="255" blue="255"/>
+          <foregroundColor xmi:type="viewpoint:RGBValues" xmi:id="_3aayZCDOEeamRujSdBUx1A" red="255" green="252" blue="216"/>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:ContainerMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']"/>
+        <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_kQtWkCDOEeamRujSdBUx1A" name="unit : EString" tooltipText="&#xA;ERROR : The required feature 'eAttributeType' of 'org.eclipse.emf.ecore.impl.EAttributeImpl@27bda565{platform:/resource/org.polarsys.chess.monitoring/model/monitoring.ecore#//MeasuredValue/newAttribute}' must be set&#xA;ERROR : The typed element must have a type">
+          <target xmi:type="ecore:EAttribute" href="monitoring.ecore#//MeasuredValue/unit"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="monitoring.ecore#//MeasuredValue/unit"/>
+          <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_ptQe0CDOEeamRujSdBUx1A" labelAlignment="LEFT">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_ptQe0SDOEeamRujSdBUx1A"/>
+            <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
+            <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_ptQe0iDOEeamRujSdBUx1A"/>
+            <color xmi:type="viewpoint:RGBValues" xmi:id="_ptQe0yDOEeamRujSdBUx1A"/>
+          </ownedStyle>
+          <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
+        </ownedElements>
+        <ownedElements xmi:type="diagram:DNodeListElement" xmi:id="_0Z0IICDOEeamRujSdBUx1A" name="value : EFloatObject" tooltipText="&#xA;ERROR : The required feature 'eAttributeType' of 'org.eclipse.emf.ecore.impl.EAttributeImpl@4ee2668d{platform:/resource/org.polarsys.chess.monitoring/model/monitoring.ecore#//MeasuredValue/newAttribute}' must be set&#xA;ERROR : The typed element must have a type">
+          <target xmi:type="ecore:EAttribute" href="monitoring.ecore#//MeasuredValue/value"/>
+          <semanticElements xmi:type="ecore:EAttribute" href="monitoring.ecore#//MeasuredValue/value"/>
+          <ownedStyle xmi:type="diagram:BundledImage" xmi:id="_3adOoCDOEeamRujSdBUx1A" labelAlignment="LEFT">
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_3adOoSDOEeamRujSdBUx1A"/>
+            <description xmi:type="style:BundledImageDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']/@style"/>
+            <borderColor xmi:type="viewpoint:RGBValues" xmi:id="_3adOoiDOEeamRujSdBUx1A"/>
+            <color xmi:type="viewpoint:RGBValues" xmi:id="_3adOoyDOEeamRujSdBUx1A"/>
+          </ownedStyle>
+          <actualMapping xmi:type="description_1:NodeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@containerMappings[name='EC%20EClass']/@subNodeMappings[name='EC%20EAttribute']"/>
+        </ownedElements>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_7gag8CDaEeamRujSdBUx1A" name="[0..1] minimum" sourceNode="_gFJXQBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/minimum"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/minimum"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_7gbIBSDaEeamRujSdBUx1A" description="_7gbIASDaEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_7gbIBiDaEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_7gbIByDaEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_7gbICCDaEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_7gbICSDaEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_7gbICiDaEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_LXP2wCDbEeamRujSdBUx1A" name="[0..1] maximum" sourceNode="_gFJXQBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/maximum"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/maximum"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_LXQd1iDbEeamRujSdBUx1A" description="_LXQd0iDbEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_LXQd1yDbEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_LXQd2CDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_LXQd2SDbEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_LXQd2iDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_LXQd2yDbEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_TxffMCDbEeamRujSdBUx1A" name="[0..1] average" sourceNode="_gFJXQBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/average"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//BlockingTime/average"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_TxffNyDbEeamRujSdBUx1A" description="_TxffMyDbEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_TxffOCDbEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_TxffOSDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_TxffOiDbEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_TxffOyDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_TxffPCDbEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_prkJ0CDbEeamRujSdBUx1A" name="[0..1] minimum" sourceNode="_gFKlYBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/minimum"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/minimum"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_prkw5iDbEeamRujSdBUx1A" description="_prkw4iDbEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_prkw5yDbEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_prkw6CDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_prkw6SDbEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_prkw6iDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_prkw6yDbEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_vbikYCDbEeamRujSdBUx1A" name="[0..1] maximum" sourceNode="_gFKlYBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/maximum"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/maximum"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_vbjLdiDbEeamRujSdBUx1A" description="_vbjLciDbEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_vbjLdyDbEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_vbjLeCDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_vbjLeSDbEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_vbjLeiDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_vbjLeyDbEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_207z0CDbEeamRujSdBUx1A" name="[0..1] average" sourceNode="_gFKlYBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/average"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//ExecutionTime/average"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_208a5iDbEeamRujSdBUx1A" description="_208a4iDbEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_208a5yDbEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_208a6CDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_208a6SDbEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_208a6iDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_208a6yDbEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="__8z-UCDbEeamRujSdBUx1A" name="[0..1] minimum" sourceNode="_gFLMdRv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//Period/minimum"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//Period/minimum"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="__8z-VyDbEeamRujSdBUx1A" description="__8z-UyDbEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="__8z-WCDbEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="__8z-WSDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="__8z-WiDbEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="__8z-WyDbEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="__8z-XCDbEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_E7thQCDcEeamRujSdBUx1A" name="[0..1] maximum" sourceNode="_gFLMdRv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//Period/maximum"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//Period/maximum"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_E7uIUCDcEeamRujSdBUx1A" description="_E7thQyDcEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_E7uIUSDcEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_E7uIUiDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_E7uIUyDcEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_E7uIVCDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_E7uIVSDcEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_KtyNkCDcEeamRujSdBUx1A" name="[0..1] average" sourceNode="_gFLMdRv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//Period/average"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//Period/average"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_KtyNlyDcEeamRujSdBUx1A" description="_KtyNkyDcEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_KtyNmCDcEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_KtyNmSDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_KtyNmiDcEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_KtyNmyDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_KtyNnCDcEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_W11kgCDcEeamRujSdBUx1A" name="[0..1] jitter" sourceNode="_gFLMdRv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//Period/jitter"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//Period/jitter"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_W12LliDcEeamRujSdBUx1A" description="_W12LkiDcEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_W12LlyDcEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_W12LmCDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_W12LmSDcEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_W12LmiDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_W12LmyDcEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_faJH4CDcEeamRujSdBUx1A" name="[0..1] minimum" sourceNode="_gFMakBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/minimum"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/minimum"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_faJu9SDcEeamRujSdBUx1A" description="_faJu8SDcEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_faJu9iDcEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_faJu9yDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_faJu-CDcEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_faJu-SDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_faJu-iDcEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_mbqC0CDcEeamRujSdBUx1A" name="[0..1] maximum" sourceNode="_gFMakBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/maximum"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/maximum"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_mbrQ9iDcEeamRujSdBUx1A" description="_mbrQ8iDcEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_mbrQ9yDcEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_mbrQ-CDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_mbrQ-SDcEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_mbrQ-iDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_mbrQ-yDcEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_rdwDsCDcEeamRujSdBUx1A" name="[0..1] average" sourceNode="_gFMakBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/average"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/average"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_rdwqxiDcEeamRujSdBUx1A" description="_rdwqwiDcEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_rdwqxyDcEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_rdwqyCDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_rdwqySDcEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_rdwqyiDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_rdwqyyDcEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
+      </ownedDiagramElements>
+      <ownedDiagramElements xmi:type="diagram:DEdge" xmi:id="_v1WWECDcEeamRujSdBUx1A" name="[0..1] jitter" sourceNode="_gFMakBv7EeaHUeOe1L7u_Q" targetNode="_f_3McCDOEeamRujSdBUx1A">
+        <target xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/jitter"/>
+        <semanticElements xmi:type="ecore:EReference" href="monitoring.ecore#//ResponseTime/jitter"/>
+        <ownedStyle xmi:type="diagram:EdgeStyle" xmi:id="_v1WWFyDcEeamRujSdBUx1A" description="_v1WWEyDcEeamRujSdBUx1A" sourceArrow="FillDiamond" routingStyle="manhattan">
+          <strokeColor xmi:type="viewpoint:RGBValues" xmi:id="_v1WWGCDcEeamRujSdBUx1A"/>
+          <centerLabelStyle xmi:type="diagram:CenterLabelStyle" xmi:id="_v1WWGSDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_v1WWGiDcEeamRujSdBUx1A"/>
+          </centerLabelStyle>
+          <endLabelStyle xmi:type="diagram:EndLabelStyle" xmi:id="_v1WWGyDcEeamRujSdBUx1A" showIcon="false">
+            <customFeatures>labelSize</customFeatures>
+            <labelColor xmi:type="viewpoint:RGBValues" xmi:id="_v1WWHCDcEeamRujSdBUx1A" red="39" green="76" blue="114"/>
+          </endLabelStyle>
+        </ownedStyle>
+        <actualMapping xmi:type="description_1:EdgeMapping" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']/@defaultLayer/@edgeMappings[name='EC_EReference']"/>
       </ownedDiagramElements>
       <description xmi:type="description_1:DiagramDescription" href="platform:/plugin/org.eclipse.emf.ecoretools.design/description/ecore.odesign#//@ownedViewpoints[name='Design']/@ownedRepresentations[name='Entities']"/>
       <filterVariableHistory xmi:type="diagram:FilterVariableHistory" xmi:id="_UeMcFfKXEeWJGdEk7kJ9Lg"/>
diff --git a/plugins/org.polarsys.chess.monitoring/model/monitoring.ecore b/plugins/org.polarsys.chess.monitoring/model/monitoring.ecore
index 0d6bd10..cf66326 100644
--- a/plugins/org.polarsys.chess.monitoring/model/monitoring.ecore
+++ b/plugins/org.polarsys.chess.monitoring/model/monitoring.ecore
@@ -13,41 +13,65 @@
   <eClassifiers xsi:type="ecore:EClass" name="Thread" eSuperTypes="#//MonitoredResource"/>
   <eClassifiers xsi:type="ecore:EClass" name="Resource" eSuperTypes="#//MonitoredResource"/>
   <eClassifiers xsi:type="ecore:EClass" name="Period">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minimum" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="maximum" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="jitter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="monitoredresource" eType="#//MonitoredResource"
         eOpposite="#//MonitoredResource/period"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="minimum" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="maximum" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="average" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="jitter" eType="#//MeasuredValue"
+        containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="MonitoredResource" abstract="true">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="period" eType="#//Period"
-        eOpposite="#//Period/monitoredresource"/>
+        containment="true" eOpposite="#//Period/monitoredresource"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="executiontime" eType="#//ExecutionTime"
-        eOpposite="#//ExecutionTime/monitoredresource"/>
+        containment="true" eOpposite="#//ExecutionTime/monitoredresource"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="blockingtime" eType="#//BlockingTime"
-        eOpposite="#//BlockingTime/monitoredresource"/>
+        containment="true" eOpposite="#//BlockingTime/monitoredresource"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="responsetime" eType="#//ResponseTime"
-        eOpposite="#//ResponseTime/monitoredresource"/>
+        containment="true" eOpposite="#//ResponseTime/monitoredresource"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ExecutionTime">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minimum" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="maximum" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="monitoredresource" eType="#//MonitoredResource"
         eOpposite="#//MonitoredResource/executiontime"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="minimum" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="maximum" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="average" eType="#//MeasuredValue"
+        containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="BlockingTime">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="maximum" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="monitoredresource" eType="#//MonitoredResource"
         eOpposite="#//MonitoredResource/blockingtime"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="minimum" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="maximum" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="average" eType="#//MeasuredValue"
+        containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ResponseTime">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="maximum" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="jitter" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="monitoredresource" eType="#//MonitoredResource"
         eOpposite="#//MonitoredResource/responsetime"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="minimum" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="maximum" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="average" eType="#//MeasuredValue"
+        containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="jitter" eType="#//MeasuredValue"
+        containment="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="AnalysisContext">
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
   </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="MeasuredValue">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="unit" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="value" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EFloatObject"/>
+  </eClassifiers>
 </ecore:EPackage>
diff --git a/plugins/org.polarsys.chess.monitoring/model/monitoring.genmodel b/plugins/org.polarsys.chess.monitoring/model/monitoring.genmodel
index 583b481..508bfe1 100644
--- a/plugins/org.polarsys.chess.monitoring/model/monitoring.genmodel
+++ b/plugins/org.polarsys.chess.monitoring/model/monitoring.genmodel
@@ -1,9 +1,57 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel"
-    modelDirectory="/org.concerto.monitoring/src" modelPluginID="org.concerto.monitoring"
+<genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" modelDirectory="/org.polarsys.chess.monitoring/src" modelPluginID="org.polarsys.chess.monitoring"
     modelName="Monitoring" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
-    importerID="org.eclipse.emf.importer.ecore" complianceLevel="7.0" copyrightFields="false"
+    importerID="org.eclipse.emf.importer.ecore" complianceLevel="8.0" copyrightFields="false"
     operationReflection="true" importOrganizing="true">
   <foreignModel>monitoring.ecore</foreignModel>
-  <genPackages prefix="Monitoring" disposableProviderFactory="true" ecorePackage="monitoring.ecore#/"/>
+  <genPackages prefix="Monitoringxml" disposableProviderFactory="true" ecorePackage="monitoring.ecore#/">
+    <genClasses ecoreClass="monitoring.ecore#//Monitoring">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//Monitoring/ThreadNames"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//Monitoring/SharedResources"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//Monitoring/analysisContext"/>
+    </genClasses>
+    <genClasses ecoreClass="monitoring.ecore#//Thread"/>
+    <genClasses ecoreClass="monitoring.ecore#//Resource"/>
+    <genClasses ecoreClass="monitoring.ecore#//Period">
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference monitoring.ecore#//Period/monitoredresource"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//Period/minimum"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//Period/maximum"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//Period/average"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//Period/jitter"/>
+    </genClasses>
+    <genClasses image="false" ecoreClass="monitoring.ecore#//MonitoredResource">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute monitoring.ecore#//MonitoredResource/name"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//MonitoredResource/period"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//MonitoredResource/executiontime"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//MonitoredResource/blockingtime"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//MonitoredResource/responsetime"/>
+    </genClasses>
+    <genClasses ecoreClass="monitoring.ecore#//ExecutionTime">
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference monitoring.ecore#//ExecutionTime/monitoredresource"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//ExecutionTime/minimum"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//ExecutionTime/maximum"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//ExecutionTime/average"/>
+    </genClasses>
+    <genClasses ecoreClass="monitoring.ecore#//BlockingTime">
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference monitoring.ecore#//BlockingTime/monitoredresource"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//BlockingTime/minimum"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//BlockingTime/maximum"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//BlockingTime/average"/>
+    </genClasses>
+    <genClasses ecoreClass="monitoring.ecore#//ResponseTime">
+      <genFeatures property="None" notify="false" createChild="false" ecoreFeature="ecore:EReference monitoring.ecore#//ResponseTime/monitoredresource"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//ResponseTime/minimum"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//ResponseTime/maximum"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//ResponseTime/average"/>
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference monitoring.ecore#//ResponseTime/jitter"/>
+    </genClasses>
+    <genClasses ecoreClass="monitoring.ecore#//AnalysisContext">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute monitoring.ecore#//AnalysisContext/name"/>
+    </genClasses>
+    <genClasses ecoreClass="monitoring.ecore#//MeasuredValue">
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute monitoring.ecore#//MeasuredValue/unit"/>
+      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute monitoring.ecore#//MeasuredValue/value"/>
+    </genClasses>
+  </genPackages>
 </genmodel:GenModel>
diff --git a/plugins/org.polarsys.chess.monitoring/plugin.xml b/plugins/org.polarsys.chess.monitoring/plugin.xml
index 7af9a28..a4808e5 100644
--- a/plugins/org.polarsys.chess.monitoring/plugin.xml
+++ b/plugins/org.polarsys.chess.monitoring/plugin.xml
@@ -6,11 +6,41 @@
 
 <plugin>
 
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            id="org.polarsys.chess.monitoring.contribution1"
+            objectClass="org.eclipse.core.resources.IFile">
+         <menu
+               id="org.polarsys.chess.monitoring.menu1"
+               label="CHESS"
+               path="additions">
+            <separator
+                  name="group1">
+            </separator>
+         </menu>
+         <action
+               class="org.polarsys.chess.monitoring.monitoringxml.popup.actions.LaunchTraceAnalysis"
+               enablesFor="1"
+               id="org.polarsys.chess.monitoring.action01"
+               label="Monitoring Trace Analysis"
+               menubarPath="org.polarsys.chess.monitoring.menu1/group1">
+         </action>
+         <action
+               class="org.polarsys.chess.monitoring.monitoringxml.popup.actions.LaunchBackpropagation"
+               enablesFor="1"
+               id="org.polarsys.chess.monitoring.action02"
+               label="Monitoring Backpropagation"
+               menubarPath="org.polarsys.chess.monitoring.menu1/group1">
+         </action>
+      </objectContribution>
+   </extension>
+
    <extension point="org.eclipse.emf.ecore.generated_package">
       <!-- @generated monitoring -->
       <package
             uri="http://www.mdh.se/concerto/monitoring/xml/monitoringxml"
-            class="monitoringxml.MonitoringPackage"
+            class="org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage"
             genModel="model/monitoring.genmodel"/>
    </extension>
 
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/BlockingTime.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/BlockingTime.java
deleted file mode 100644
index 1b7e59d..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/BlockingTime.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */  
-package monitoringxml;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Blocking Time</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * </p>
- * <ul>
- *   <li>{@link monitoringxml.BlockingTime#getMaximum <em>Maximum</em>}</li>
- *   <li>{@link monitoringxml.BlockingTime#getMonitoredresource <em>Monitoredresource</em>}</li>
- * </ul>
- *
- * @see monitoringxml.MonitoringPackage#getBlockingTime()
- * @model
- * @generated
- */
-public interface BlockingTime extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Maximum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Maximum</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Maximum</em>' attribute.
-	 * @see #setMaximum(Float)
-	 * @see monitoringxml.MonitoringPackage#getBlockingTime_Maximum()
-	 * @model
-	 * @generated
-	 */
-	Float getMaximum();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.BlockingTime#getMaximum <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Maximum</em>' attribute.
-	 * @see #getMaximum()
-	 * @generated
-	 */
-	void setMaximum(Float value);
-
-	/**
-	 * Returns the value of the '<em><b>Monitoredresource</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link monitoringxml.MonitoredResource#getBlockingtime <em>Blockingtime</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Monitoredresource</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Monitoredresource</em>' reference.
-	 * @see #setMonitoredresource(MonitoredResource)
-	 * @see monitoringxml.MonitoringPackage#getBlockingTime_Monitoredresource()
-	 * @see monitoringxml.MonitoredResource#getBlockingtime
-	 * @model opposite="blockingtime"
-	 * @generated
-	 */
-	MonitoredResource getMonitoredresource();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.BlockingTime#getMonitoredresource <em>Monitoredresource</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Monitoredresource</em>' reference.
-	 * @see #getMonitoredresource()
-	 * @generated
-	 */
-	void setMonitoredresource(MonitoredResource value);
-
-} // BlockingTime
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/ExecutionTime.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/ExecutionTime.java
deleted file mode 100644
index 9620443..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/ExecutionTime.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Execution Time</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * </p>
- * <ul>
- *   <li>{@link monitoringxml.ExecutionTime#getMinimum <em>Minimum</em>}</li>
- *   <li>{@link monitoringxml.ExecutionTime#getMaximum <em>Maximum</em>}</li>
- *   <li>{@link monitoringxml.ExecutionTime#getMonitoredresource <em>Monitoredresource</em>}</li>
- * </ul>
- *
- * @see monitoringxml.MonitoringPackage#getExecutionTime()
- * @model
- * @generated
- */
-public interface ExecutionTime extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Minimum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Minimum</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Minimum</em>' attribute.
-	 * @see #setMinimum(Float)
-	 * @see monitoringxml.MonitoringPackage#getExecutionTime_Minimum()
-	 * @model
-	 * @generated
-	 */
-	Float getMinimum();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.ExecutionTime#getMinimum <em>Minimum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Minimum</em>' attribute.
-	 * @see #getMinimum()
-	 * @generated
-	 */
-	void setMinimum(Float value);
-
-	/**
-	 * Returns the value of the '<em><b>Maximum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Maximum</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Maximum</em>' attribute.
-	 * @see #setMaximum(Float)
-	 * @see monitoringxml.MonitoringPackage#getExecutionTime_Maximum()
-	 * @model
-	 * @generated
-	 */
-	Float getMaximum();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.ExecutionTime#getMaximum <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Maximum</em>' attribute.
-	 * @see #getMaximum()
-	 * @generated
-	 */
-	void setMaximum(Float value);
-
-	/**
-	 * Returns the value of the '<em><b>Monitoredresource</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link monitoringxml.MonitoredResource#getExecutiontime <em>Executiontime</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Monitoredresource</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Monitoredresource</em>' reference.
-	 * @see #setMonitoredresource(MonitoredResource)
-	 * @see monitoringxml.MonitoringPackage#getExecutionTime_Monitoredresource()
-	 * @see monitoringxml.MonitoredResource#getExecutiontime
-	 * @model opposite="executiontime"
-	 * @generated
-	 */
-	MonitoredResource getMonitoredresource();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.ExecutionTime#getMonitoredresource <em>Monitoredresource</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Monitoredresource</em>' reference.
-	 * @see #getMonitoredresource()
-	 * @generated
-	 */
-	void setMonitoredresource(MonitoredResource value);
-
-} // ExecutionTime
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/MonitoredResource.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/MonitoredResource.java
deleted file mode 100644
index d27dfff..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/MonitoredResource.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */  
-package monitoringxml;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Monitored Resource</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * </p>
- * <ul>
- *   <li>{@link monitoringxml.MonitoredResource#getName <em>Name</em>}</li>
- *   <li>{@link monitoringxml.MonitoredResource#getPeriod <em>Period</em>}</li>
- *   <li>{@link monitoringxml.MonitoredResource#getExecutiontime <em>Executiontime</em>}</li>
- *   <li>{@link monitoringxml.MonitoredResource#getBlockingtime <em>Blockingtime</em>}</li>
- *   <li>{@link monitoringxml.MonitoredResource#getResponsetime <em>Responsetime</em>}</li>
- * </ul>
- *
- * @see monitoringxml.MonitoringPackage#getMonitoredResource()
- * @model abstract="true"
- * @generated
- */
-public interface MonitoredResource extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Name</em>' attribute.
-	 * @see #setName(String)
-	 * @see monitoringxml.MonitoringPackage#getMonitoredResource_Name()
-	 * @model
-	 * @generated
-	 */
-	String getName();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.MonitoredResource#getName <em>Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Name</em>' attribute.
-	 * @see #getName()
-	 * @generated
-	 */
-	void setName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Period</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link monitoringxml.Period#getMonitoredresource <em>Monitoredresource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Period</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Period</em>' reference.
-	 * @see #setPeriod(Period)
-	 * @see monitoringxml.MonitoringPackage#getMonitoredResource_Period()
-	 * @see monitoringxml.Period#getMonitoredresource
-	 * @model opposite="monitoredresource"
-	 * @generated
-	 */
-	Period getPeriod();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.MonitoredResource#getPeriod <em>Period</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Period</em>' reference.
-	 * @see #getPeriod()
-	 * @generated
-	 */
-	void setPeriod(Period value);
-
-	/**
-	 * Returns the value of the '<em><b>Executiontime</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link monitoringxml.ExecutionTime#getMonitoredresource <em>Monitoredresource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Executiontime</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Executiontime</em>' reference.
-	 * @see #setExecutiontime(ExecutionTime)
-	 * @see monitoringxml.MonitoringPackage#getMonitoredResource_Executiontime()
-	 * @see monitoringxml.ExecutionTime#getMonitoredresource
-	 * @model opposite="monitoredresource"
-	 * @generated
-	 */
-	ExecutionTime getExecutiontime();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.MonitoredResource#getExecutiontime <em>Executiontime</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Executiontime</em>' reference.
-	 * @see #getExecutiontime()
-	 * @generated
-	 */
-	void setExecutiontime(ExecutionTime value);
-
-	/**
-	 * Returns the value of the '<em><b>Blockingtime</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link monitoringxml.BlockingTime#getMonitoredresource <em>Monitoredresource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Blockingtime</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Blockingtime</em>' reference.
-	 * @see #setBlockingtime(BlockingTime)
-	 * @see monitoringxml.MonitoringPackage#getMonitoredResource_Blockingtime()
-	 * @see monitoringxml.BlockingTime#getMonitoredresource
-	 * @model opposite="monitoredresource"
-	 * @generated
-	 */
-	BlockingTime getBlockingtime();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.MonitoredResource#getBlockingtime <em>Blockingtime</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Blockingtime</em>' reference.
-	 * @see #getBlockingtime()
-	 * @generated
-	 */
-	void setBlockingtime(BlockingTime value);
-
-	/**
-	 * Returns the value of the '<em><b>Responsetime</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link monitoringxml.ResponseTime#getMonitoredresource <em>Monitoredresource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Responsetime</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Responsetime</em>' reference.
-	 * @see #setResponsetime(ResponseTime)
-	 * @see monitoringxml.MonitoringPackage#getMonitoredResource_Responsetime()
-	 * @see monitoringxml.ResponseTime#getMonitoredresource
-	 * @model opposite="monitoredresource"
-	 * @generated
-	 */
-	ResponseTime getResponsetime();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.MonitoredResource#getResponsetime <em>Responsetime</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Responsetime</em>' reference.
-	 * @see #getResponsetime()
-	 * @generated
-	 */
-	void setResponsetime(ResponseTime value);
-
-} // MonitoredResource
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/MonitoringPackage.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/MonitoringPackage.java
deleted file mode 100644
index 62ccab4..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/MonitoringPackage.java
+++ /dev/null
@@ -1,1208 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- *   <li>each class,</li>
- *   <li>each feature of each class,</li>
- *   <li>each operation of each class,</li>
- *   <li>each enum,</li>
- *   <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * @see monitoringxml.MonitoringFactory
- * @model kind="package"
- * @generated
- */
-public interface MonitoringPackage extends EPackage {
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNAME = "monitoringxml";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_URI = "http://www.mdh.se/concerto/monitoring/xml/monitoringxml";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	String eNS_PREFIX = "monitoringxml";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	MonitoringPackage eINSTANCE = monitoringxml.impl.MonitoringPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link monitoringxml.impl.MonitoringImpl <em>Monitoring</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see monitoringxml.impl.MonitoringImpl
-	 * @see monitoringxml.impl.MonitoringPackageImpl#getMonitoring()
-	 * @generated
-	 */
-	int MONITORING = 0;
-
-	/**
-	 * The feature id for the '<em><b>Thread Names</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORING__THREAD_NAMES = 0;
-
-	/**
-	 * The feature id for the '<em><b>Shared Resources</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORING__SHARED_RESOURCES = 1;
-
-	/**
-	 * The feature id for the '<em><b>Analysis Context</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORING__ANALYSIS_CONTEXT = 2;
-
-	/**
-	 * The number of structural features of the '<em>Monitoring</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORING_FEATURE_COUNT = 3;
-
-	/**
-	 * The number of operations of the '<em>Monitoring</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORING_OPERATION_COUNT = 0;
-
-	/**
-	 * The meta object id for the '{@link monitoringxml.impl.MonitoredResourceImpl <em>Monitored Resource</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see monitoringxml.impl.MonitoredResourceImpl
-	 * @see monitoringxml.impl.MonitoringPackageImpl#getMonitoredResource()
-	 * @generated
-	 */
-	int MONITORED_RESOURCE = 4;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORED_RESOURCE__NAME = 0;
-
-	/**
-	 * The feature id for the '<em><b>Period</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORED_RESOURCE__PERIOD = 1;
-
-	/**
-	 * The feature id for the '<em><b>Executiontime</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORED_RESOURCE__EXECUTIONTIME = 2;
-
-	/**
-	 * The feature id for the '<em><b>Blockingtime</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORED_RESOURCE__BLOCKINGTIME = 3;
-
-	/**
-	 * The feature id for the '<em><b>Responsetime</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORED_RESOURCE__RESPONSETIME = 4;
-
-	/**
-	 * The number of structural features of the '<em>Monitored Resource</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORED_RESOURCE_FEATURE_COUNT = 5;
-
-	/**
-	 * The number of operations of the '<em>Monitored Resource</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int MONITORED_RESOURCE_OPERATION_COUNT = 0;
-
-	/**
-	 * The meta object id for the '{@link monitoringxml.impl.ThreadImpl <em>Thread</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see monitoringxml.impl.ThreadImpl
-	 * @see monitoringxml.impl.MonitoringPackageImpl#getThread()
-	 * @generated
-	 */
-	int THREAD = 1;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int THREAD__NAME = MONITORED_RESOURCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Period</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int THREAD__PERIOD = MONITORED_RESOURCE__PERIOD;
-
-	/**
-	 * The feature id for the '<em><b>Executiontime</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int THREAD__EXECUTIONTIME = MONITORED_RESOURCE__EXECUTIONTIME;
-
-	/**
-	 * The feature id for the '<em><b>Blockingtime</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int THREAD__BLOCKINGTIME = MONITORED_RESOURCE__BLOCKINGTIME;
-
-	/**
-	 * The feature id for the '<em><b>Responsetime</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int THREAD__RESPONSETIME = MONITORED_RESOURCE__RESPONSETIME;
-
-	/**
-	 * The number of structural features of the '<em>Thread</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int THREAD_FEATURE_COUNT = MONITORED_RESOURCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of operations of the '<em>Thread</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int THREAD_OPERATION_COUNT = MONITORED_RESOURCE_OPERATION_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link monitoringxml.impl.ResourceImpl <em>Resource</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see monitoringxml.impl.ResourceImpl
-	 * @see monitoringxml.impl.MonitoringPackageImpl#getResource()
-	 * @generated
-	 */
-	int RESOURCE = 2;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__NAME = MONITORED_RESOURCE__NAME;
-
-	/**
-	 * The feature id for the '<em><b>Period</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__PERIOD = MONITORED_RESOURCE__PERIOD;
-
-	/**
-	 * The feature id for the '<em><b>Executiontime</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__EXECUTIONTIME = MONITORED_RESOURCE__EXECUTIONTIME;
-
-	/**
-	 * The feature id for the '<em><b>Blockingtime</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__BLOCKINGTIME = MONITORED_RESOURCE__BLOCKINGTIME;
-
-	/**
-	 * The feature id for the '<em><b>Responsetime</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE__RESPONSETIME = MONITORED_RESOURCE__RESPONSETIME;
-
-	/**
-	 * The number of structural features of the '<em>Resource</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_FEATURE_COUNT = MONITORED_RESOURCE_FEATURE_COUNT + 0;
-
-	/**
-	 * The number of operations of the '<em>Resource</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESOURCE_OPERATION_COUNT = MONITORED_RESOURCE_OPERATION_COUNT + 0;
-
-	/**
-	 * The meta object id for the '{@link monitoringxml.impl.PeriodImpl <em>Period</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see monitoringxml.impl.PeriodImpl
-	 * @see monitoringxml.impl.MonitoringPackageImpl#getPeriod()
-	 * @generated
-	 */
-	int PERIOD = 3;
-
-	/**
-	 * The feature id for the '<em><b>Minimum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PERIOD__MINIMUM = 0;
-
-	/**
-	 * The feature id for the '<em><b>Maximum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PERIOD__MAXIMUM = 1;
-
-	/**
-	 * The feature id for the '<em><b>Jitter</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PERIOD__JITTER = 2;
-
-	/**
-	 * The feature id for the '<em><b>Monitoredresource</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PERIOD__MONITOREDRESOURCE = 3;
-
-	/**
-	 * The number of structural features of the '<em>Period</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PERIOD_FEATURE_COUNT = 4;
-
-	/**
-	 * The number of operations of the '<em>Period</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PERIOD_OPERATION_COUNT = 0;
-
-	/**
-	 * The meta object id for the '{@link monitoringxml.impl.ExecutionTimeImpl <em>Execution Time</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see monitoringxml.impl.ExecutionTimeImpl
-	 * @see monitoringxml.impl.MonitoringPackageImpl#getExecutionTime()
-	 * @generated
-	 */
-	int EXECUTION_TIME = 5;
-
-	/**
-	 * The feature id for the '<em><b>Minimum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXECUTION_TIME__MINIMUM = 0;
-
-	/**
-	 * The feature id for the '<em><b>Maximum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXECUTION_TIME__MAXIMUM = 1;
-
-	/**
-	 * The feature id for the '<em><b>Monitoredresource</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXECUTION_TIME__MONITOREDRESOURCE = 2;
-
-	/**
-	 * The number of structural features of the '<em>Execution Time</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXECUTION_TIME_FEATURE_COUNT = 3;
-
-	/**
-	 * The number of operations of the '<em>Execution Time</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int EXECUTION_TIME_OPERATION_COUNT = 0;
-
-	/**
-	 * The meta object id for the '{@link monitoringxml.impl.BlockingTimeImpl <em>Blocking Time</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see monitoringxml.impl.BlockingTimeImpl
-	 * @see monitoringxml.impl.MonitoringPackageImpl#getBlockingTime()
-	 * @generated
-	 */
-	int BLOCKING_TIME = 6;
-
-	/**
-	 * The feature id for the '<em><b>Maximum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BLOCKING_TIME__MAXIMUM = 0;
-
-	/**
-	 * The feature id for the '<em><b>Monitoredresource</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BLOCKING_TIME__MONITOREDRESOURCE = 1;
-
-	/**
-	 * The number of structural features of the '<em>Blocking Time</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BLOCKING_TIME_FEATURE_COUNT = 2;
-
-	/**
-	 * The number of operations of the '<em>Blocking Time</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int BLOCKING_TIME_OPERATION_COUNT = 0;
-
-	/**
-	 * The meta object id for the '{@link monitoringxml.impl.ResponseTimeImpl <em>Response Time</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see monitoringxml.impl.ResponseTimeImpl
-	 * @see monitoringxml.impl.MonitoringPackageImpl#getResponseTime()
-	 * @generated
-	 */
-	int RESPONSE_TIME = 7;
-
-	/**
-	 * The feature id for the '<em><b>Maximum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESPONSE_TIME__MAXIMUM = 0;
-
-	/**
-	 * The feature id for the '<em><b>Jitter</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESPONSE_TIME__JITTER = 1;
-
-	/**
-	 * The feature id for the '<em><b>Monitoredresource</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESPONSE_TIME__MONITOREDRESOURCE = 2;
-
-	/**
-	 * The number of structural features of the '<em>Response Time</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESPONSE_TIME_FEATURE_COUNT = 3;
-
-	/**
-	 * The number of operations of the '<em>Response Time</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int RESPONSE_TIME_OPERATION_COUNT = 0;
-
-	/**
-	 * The meta object id for the '{@link monitoringxml.impl.AnalysisContextImpl <em>Analysis Context</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see monitoringxml.impl.AnalysisContextImpl
-	 * @see monitoringxml.impl.MonitoringPackageImpl#getAnalysisContext()
-	 * @generated
-	 */
-	int ANALYSIS_CONTEXT = 8;
-
-	/**
-	 * The feature id for the '<em><b>Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ANALYSIS_CONTEXT__NAME = 0;
-
-	/**
-	 * The number of structural features of the '<em>Analysis Context</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ANALYSIS_CONTEXT_FEATURE_COUNT = 1;
-
-	/**
-	 * The number of operations of the '<em>Analysis Context</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int ANALYSIS_CONTEXT_OPERATION_COUNT = 0;
-
-
-	/**
-	 * Returns the meta object for class '{@link monitoringxml.Monitoring <em>Monitoring</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Monitoring</em>'.
-	 * @see monitoringxml.Monitoring
-	 * @generated
-	 */
-	EClass getMonitoring();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link monitoringxml.Monitoring#getThreadNames <em>Thread Names</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Thread Names</em>'.
-	 * @see monitoringxml.Monitoring#getThreadNames()
-	 * @see #getMonitoring()
-	 * @generated
-	 */
-	EReference getMonitoring_ThreadNames();
-
-	/**
-	 * Returns the meta object for the containment reference list '{@link monitoringxml.Monitoring#getSharedResources <em>Shared Resources</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Shared Resources</em>'.
-	 * @see monitoringxml.Monitoring#getSharedResources()
-	 * @see #getMonitoring()
-	 * @generated
-	 */
-	EReference getMonitoring_SharedResources();
-
-	/**
-	 * Returns the meta object for the containment reference '{@link monitoringxml.Monitoring#getAnalysisContext <em>Analysis Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference '<em>Analysis Context</em>'.
-	 * @see monitoringxml.Monitoring#getAnalysisContext()
-	 * @see #getMonitoring()
-	 * @generated
-	 */
-	EReference getMonitoring_AnalysisContext();
-
-	/**
-	 * Returns the meta object for class '{@link monitoringxml.Thread <em>Thread</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Thread</em>'.
-	 * @see monitoringxml.Thread
-	 * @generated
-	 */
-	EClass getThread();
-
-	/**
-	 * Returns the meta object for class '{@link monitoringxml.Resource <em>Resource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Resource</em>'.
-	 * @see monitoringxml.Resource
-	 * @generated
-	 */
-	EClass getResource();
-
-	/**
-	 * Returns the meta object for class '{@link monitoringxml.Period <em>Period</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Period</em>'.
-	 * @see monitoringxml.Period
-	 * @generated
-	 */
-	EClass getPeriod();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.Period#getMinimum <em>Minimum</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Minimum</em>'.
-	 * @see monitoringxml.Period#getMinimum()
-	 * @see #getPeriod()
-	 * @generated
-	 */
-	EAttribute getPeriod_Minimum();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.Period#getMaximum <em>Maximum</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Maximum</em>'.
-	 * @see monitoringxml.Period#getMaximum()
-	 * @see #getPeriod()
-	 * @generated
-	 */
-	EAttribute getPeriod_Maximum();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.Period#getJitter <em>Jitter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Jitter</em>'.
-	 * @see monitoringxml.Period#getJitter()
-	 * @see #getPeriod()
-	 * @generated
-	 */
-	EAttribute getPeriod_Jitter();
-
-	/**
-	 * Returns the meta object for the reference '{@link monitoringxml.Period#getMonitoredresource <em>Monitoredresource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Monitoredresource</em>'.
-	 * @see monitoringxml.Period#getMonitoredresource()
-	 * @see #getPeriod()
-	 * @generated
-	 */
-	EReference getPeriod_Monitoredresource();
-
-	/**
-	 * Returns the meta object for class '{@link monitoringxml.MonitoredResource <em>Monitored Resource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Monitored Resource</em>'.
-	 * @see monitoringxml.MonitoredResource
-	 * @generated
-	 */
-	EClass getMonitoredResource();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.MonitoredResource#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see monitoringxml.MonitoredResource#getName()
-	 * @see #getMonitoredResource()
-	 * @generated
-	 */
-	EAttribute getMonitoredResource_Name();
-
-	/**
-	 * Returns the meta object for the reference '{@link monitoringxml.MonitoredResource#getPeriod <em>Period</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Period</em>'.
-	 * @see monitoringxml.MonitoredResource#getPeriod()
-	 * @see #getMonitoredResource()
-	 * @generated
-	 */
-	EReference getMonitoredResource_Period();
-
-	/**
-	 * Returns the meta object for the reference '{@link monitoringxml.MonitoredResource#getExecutiontime <em>Executiontime</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Executiontime</em>'.
-	 * @see monitoringxml.MonitoredResource#getExecutiontime()
-	 * @see #getMonitoredResource()
-	 * @generated
-	 */
-	EReference getMonitoredResource_Executiontime();
-
-	/**
-	 * Returns the meta object for the reference '{@link monitoringxml.MonitoredResource#getBlockingtime <em>Blockingtime</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Blockingtime</em>'.
-	 * @see monitoringxml.MonitoredResource#getBlockingtime()
-	 * @see #getMonitoredResource()
-	 * @generated
-	 */
-	EReference getMonitoredResource_Blockingtime();
-
-	/**
-	 * Returns the meta object for the reference '{@link monitoringxml.MonitoredResource#getResponsetime <em>Responsetime</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Responsetime</em>'.
-	 * @see monitoringxml.MonitoredResource#getResponsetime()
-	 * @see #getMonitoredResource()
-	 * @generated
-	 */
-	EReference getMonitoredResource_Responsetime();
-
-	/**
-	 * Returns the meta object for class '{@link monitoringxml.ExecutionTime <em>Execution Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Execution Time</em>'.
-	 * @see monitoringxml.ExecutionTime
-	 * @generated
-	 */
-	EClass getExecutionTime();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.ExecutionTime#getMinimum <em>Minimum</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Minimum</em>'.
-	 * @see monitoringxml.ExecutionTime#getMinimum()
-	 * @see #getExecutionTime()
-	 * @generated
-	 */
-	EAttribute getExecutionTime_Minimum();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.ExecutionTime#getMaximum <em>Maximum</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Maximum</em>'.
-	 * @see monitoringxml.ExecutionTime#getMaximum()
-	 * @see #getExecutionTime()
-	 * @generated
-	 */
-	EAttribute getExecutionTime_Maximum();
-
-	/**
-	 * Returns the meta object for the reference '{@link monitoringxml.ExecutionTime#getMonitoredresource <em>Monitoredresource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Monitoredresource</em>'.
-	 * @see monitoringxml.ExecutionTime#getMonitoredresource()
-	 * @see #getExecutionTime()
-	 * @generated
-	 */
-	EReference getExecutionTime_Monitoredresource();
-
-	/**
-	 * Returns the meta object for class '{@link monitoringxml.BlockingTime <em>Blocking Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Blocking Time</em>'.
-	 * @see monitoringxml.BlockingTime
-	 * @generated
-	 */
-	EClass getBlockingTime();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.BlockingTime#getMaximum <em>Maximum</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Maximum</em>'.
-	 * @see monitoringxml.BlockingTime#getMaximum()
-	 * @see #getBlockingTime()
-	 * @generated
-	 */
-	EAttribute getBlockingTime_Maximum();
-
-	/**
-	 * Returns the meta object for the reference '{@link monitoringxml.BlockingTime#getMonitoredresource <em>Monitoredresource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Monitoredresource</em>'.
-	 * @see monitoringxml.BlockingTime#getMonitoredresource()
-	 * @see #getBlockingTime()
-	 * @generated
-	 */
-	EReference getBlockingTime_Monitoredresource();
-
-	/**
-	 * Returns the meta object for class '{@link monitoringxml.ResponseTime <em>Response Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Response Time</em>'.
-	 * @see monitoringxml.ResponseTime
-	 * @generated
-	 */
-	EClass getResponseTime();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.ResponseTime#getMaximum <em>Maximum</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Maximum</em>'.
-	 * @see monitoringxml.ResponseTime#getMaximum()
-	 * @see #getResponseTime()
-	 * @generated
-	 */
-	EAttribute getResponseTime_Maximum();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.ResponseTime#getJitter <em>Jitter</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Jitter</em>'.
-	 * @see monitoringxml.ResponseTime#getJitter()
-	 * @see #getResponseTime()
-	 * @generated
-	 */
-	EAttribute getResponseTime_Jitter();
-
-	/**
-	 * Returns the meta object for the reference '{@link monitoringxml.ResponseTime#getMonitoredresource <em>Monitoredresource</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the reference '<em>Monitoredresource</em>'.
-	 * @see monitoringxml.ResponseTime#getMonitoredresource()
-	 * @see #getResponseTime()
-	 * @generated
-	 */
-	EReference getResponseTime_Monitoredresource();
-
-	/**
-	 * Returns the meta object for class '{@link monitoringxml.AnalysisContext <em>Analysis Context</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Analysis Context</em>'.
-	 * @see monitoringxml.AnalysisContext
-	 * @generated
-	 */
-	EClass getAnalysisContext();
-
-	/**
-	 * Returns the meta object for the attribute '{@link monitoringxml.AnalysisContext#getName <em>Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Name</em>'.
-	 * @see monitoringxml.AnalysisContext#getName()
-	 * @see #getAnalysisContext()
-	 * @generated
-	 */
-	EAttribute getAnalysisContext_Name();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	MonitoringFactory getMonitoringFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 *   <li>each class,</li>
-	 *   <li>each feature of each class,</li>
-	 *   <li>each operation of each class,</li>
-	 *   <li>each enum,</li>
-	 *   <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link monitoringxml.impl.MonitoringImpl <em>Monitoring</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see monitoringxml.impl.MonitoringImpl
-		 * @see monitoringxml.impl.MonitoringPackageImpl#getMonitoring()
-		 * @generated
-		 */
-		EClass MONITORING = eINSTANCE.getMonitoring();
-
-		/**
-		 * The meta object literal for the '<em><b>Thread Names</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference MONITORING__THREAD_NAMES = eINSTANCE.getMonitoring_ThreadNames();
-
-		/**
-		 * The meta object literal for the '<em><b>Shared Resources</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference MONITORING__SHARED_RESOURCES = eINSTANCE.getMonitoring_SharedResources();
-
-		/**
-		 * The meta object literal for the '<em><b>Analysis Context</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference MONITORING__ANALYSIS_CONTEXT = eINSTANCE.getMonitoring_AnalysisContext();
-
-		/**
-		 * The meta object literal for the '{@link monitoringxml.impl.ThreadImpl <em>Thread</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see monitoringxml.impl.ThreadImpl
-		 * @see monitoringxml.impl.MonitoringPackageImpl#getThread()
-		 * @generated
-		 */
-		EClass THREAD = eINSTANCE.getThread();
-
-		/**
-		 * The meta object literal for the '{@link monitoringxml.impl.ResourceImpl <em>Resource</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see monitoringxml.impl.ResourceImpl
-		 * @see monitoringxml.impl.MonitoringPackageImpl#getResource()
-		 * @generated
-		 */
-		EClass RESOURCE = eINSTANCE.getResource();
-
-		/**
-		 * The meta object literal for the '{@link monitoringxml.impl.PeriodImpl <em>Period</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see monitoringxml.impl.PeriodImpl
-		 * @see monitoringxml.impl.MonitoringPackageImpl#getPeriod()
-		 * @generated
-		 */
-		EClass PERIOD = eINSTANCE.getPeriod();
-
-		/**
-		 * The meta object literal for the '<em><b>Minimum</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PERIOD__MINIMUM = eINSTANCE.getPeriod_Minimum();
-
-		/**
-		 * The meta object literal for the '<em><b>Maximum</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PERIOD__MAXIMUM = eINSTANCE.getPeriod_Maximum();
-
-		/**
-		 * The meta object literal for the '<em><b>Jitter</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute PERIOD__JITTER = eINSTANCE.getPeriod_Jitter();
-
-		/**
-		 * The meta object literal for the '<em><b>Monitoredresource</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference PERIOD__MONITOREDRESOURCE = eINSTANCE.getPeriod_Monitoredresource();
-
-		/**
-		 * The meta object literal for the '{@link monitoringxml.impl.MonitoredResourceImpl <em>Monitored Resource</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see monitoringxml.impl.MonitoredResourceImpl
-		 * @see monitoringxml.impl.MonitoringPackageImpl#getMonitoredResource()
-		 * @generated
-		 */
-		EClass MONITORED_RESOURCE = eINSTANCE.getMonitoredResource();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute MONITORED_RESOURCE__NAME = eINSTANCE.getMonitoredResource_Name();
-
-		/**
-		 * The meta object literal for the '<em><b>Period</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference MONITORED_RESOURCE__PERIOD = eINSTANCE.getMonitoredResource_Period();
-
-		/**
-		 * The meta object literal for the '<em><b>Executiontime</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference MONITORED_RESOURCE__EXECUTIONTIME = eINSTANCE.getMonitoredResource_Executiontime();
-
-		/**
-		 * The meta object literal for the '<em><b>Blockingtime</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference MONITORED_RESOURCE__BLOCKINGTIME = eINSTANCE.getMonitoredResource_Blockingtime();
-
-		/**
-		 * The meta object literal for the '<em><b>Responsetime</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference MONITORED_RESOURCE__RESPONSETIME = eINSTANCE.getMonitoredResource_Responsetime();
-
-		/**
-		 * The meta object literal for the '{@link monitoringxml.impl.ExecutionTimeImpl <em>Execution Time</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see monitoringxml.impl.ExecutionTimeImpl
-		 * @see monitoringxml.impl.MonitoringPackageImpl#getExecutionTime()
-		 * @generated
-		 */
-		EClass EXECUTION_TIME = eINSTANCE.getExecutionTime();
-
-		/**
-		 * The meta object literal for the '<em><b>Minimum</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXECUTION_TIME__MINIMUM = eINSTANCE.getExecutionTime_Minimum();
-
-		/**
-		 * The meta object literal for the '<em><b>Maximum</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute EXECUTION_TIME__MAXIMUM = eINSTANCE.getExecutionTime_Maximum();
-
-		/**
-		 * The meta object literal for the '<em><b>Monitoredresource</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference EXECUTION_TIME__MONITOREDRESOURCE = eINSTANCE.getExecutionTime_Monitoredresource();
-
-		/**
-		 * The meta object literal for the '{@link monitoringxml.impl.BlockingTimeImpl <em>Blocking Time</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see monitoringxml.impl.BlockingTimeImpl
-		 * @see monitoringxml.impl.MonitoringPackageImpl#getBlockingTime()
-		 * @generated
-		 */
-		EClass BLOCKING_TIME = eINSTANCE.getBlockingTime();
-
-		/**
-		 * The meta object literal for the '<em><b>Maximum</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute BLOCKING_TIME__MAXIMUM = eINSTANCE.getBlockingTime_Maximum();
-
-		/**
-		 * The meta object literal for the '<em><b>Monitoredresource</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference BLOCKING_TIME__MONITOREDRESOURCE = eINSTANCE.getBlockingTime_Monitoredresource();
-
-		/**
-		 * The meta object literal for the '{@link monitoringxml.impl.ResponseTimeImpl <em>Response Time</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see monitoringxml.impl.ResponseTimeImpl
-		 * @see monitoringxml.impl.MonitoringPackageImpl#getResponseTime()
-		 * @generated
-		 */
-		EClass RESPONSE_TIME = eINSTANCE.getResponseTime();
-
-		/**
-		 * The meta object literal for the '<em><b>Maximum</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESPONSE_TIME__MAXIMUM = eINSTANCE.getResponseTime_Maximum();
-
-		/**
-		 * The meta object literal for the '<em><b>Jitter</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute RESPONSE_TIME__JITTER = eINSTANCE.getResponseTime_Jitter();
-
-		/**
-		 * The meta object literal for the '<em><b>Monitoredresource</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EReference RESPONSE_TIME__MONITOREDRESOURCE = eINSTANCE.getResponseTime_Monitoredresource();
-
-		/**
-		 * The meta object literal for the '{@link monitoringxml.impl.AnalysisContextImpl <em>Analysis Context</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @see monitoringxml.impl.AnalysisContextImpl
-		 * @see monitoringxml.impl.MonitoringPackageImpl#getAnalysisContext()
-		 * @generated
-		 */
-		EClass ANALYSIS_CONTEXT = eINSTANCE.getAnalysisContext();
-
-		/**
-		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute ANALYSIS_CONTEXT__NAME = eINSTANCE.getAnalysisContext_Name();
-
-	}
-
-} //MonitoringPackage
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/Period.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/Period.java
deleted file mode 100644
index eb621b1..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/Period.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Period</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * </p>
- * <ul>
- *   <li>{@link monitoringxml.Period#getMinimum <em>Minimum</em>}</li>
- *   <li>{@link monitoringxml.Period#getMaximum <em>Maximum</em>}</li>
- *   <li>{@link monitoringxml.Period#getJitter <em>Jitter</em>}</li>
- *   <li>{@link monitoringxml.Period#getMonitoredresource <em>Monitoredresource</em>}</li>
- * </ul>
- *
- * @see monitoringxml.MonitoringPackage#getPeriod()
- * @model
- * @generated
- */
-public interface Period extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Minimum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Minimum</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Minimum</em>' attribute.
-	 * @see #setMinimum(Float)
-	 * @see monitoringxml.MonitoringPackage#getPeriod_Minimum()
-	 * @model
-	 * @generated
-	 */
-	Float getMinimum();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.Period#getMinimum <em>Minimum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Minimum</em>' attribute.
-	 * @see #getMinimum()
-	 * @generated
-	 */
-	void setMinimum(Float value);
-
-	/**
-	 * Returns the value of the '<em><b>Maximum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Maximum</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Maximum</em>' attribute.
-	 * @see #setMaximum(Float)
-	 * @see monitoringxml.MonitoringPackage#getPeriod_Maximum()
-	 * @model
-	 * @generated
-	 */
-	Float getMaximum();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.Period#getMaximum <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Maximum</em>' attribute.
-	 * @see #getMaximum()
-	 * @generated
-	 */
-	void setMaximum(Float value);
-
-	/**
-	 * Returns the value of the '<em><b>Jitter</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Jitter</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Jitter</em>' attribute.
-	 * @see #setJitter(Float)
-	 * @see monitoringxml.MonitoringPackage#getPeriod_Jitter()
-	 * @model
-	 * @generated
-	 */
-	Float getJitter();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.Period#getJitter <em>Jitter</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Jitter</em>' attribute.
-	 * @see #getJitter()
-	 * @generated
-	 */
-	void setJitter(Float value);
-
-	/**
-	 * Returns the value of the '<em><b>Monitoredresource</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link monitoringxml.MonitoredResource#getPeriod <em>Period</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Monitoredresource</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Monitoredresource</em>' reference.
-	 * @see #setMonitoredresource(MonitoredResource)
-	 * @see monitoringxml.MonitoringPackage#getPeriod_Monitoredresource()
-	 * @see monitoringxml.MonitoredResource#getPeriod
-	 * @model opposite="period"
-	 * @generated
-	 */
-	MonitoredResource getMonitoredresource();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.Period#getMonitoredresource <em>Monitoredresource</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Monitoredresource</em>' reference.
-	 * @see #getMonitoredresource()
-	 * @generated
-	 */
-	void setMonitoredresource(MonitoredResource value);
-
-} // Period
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/ResponseTime.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/ResponseTime.java
deleted file mode 100644
index e6e6f81..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/ResponseTime.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Response Time</b></em>'.
- * <!-- end-user-doc -->
- *
- * <p>
- * The following features are supported:
- * </p>
- * <ul>
- *   <li>{@link monitoringxml.ResponseTime#getMaximum <em>Maximum</em>}</li>
- *   <li>{@link monitoringxml.ResponseTime#getJitter <em>Jitter</em>}</li>
- *   <li>{@link monitoringxml.ResponseTime#getMonitoredresource <em>Monitoredresource</em>}</li>
- * </ul>
- *
- * @see monitoringxml.MonitoringPackage#getResponseTime()
- * @model
- * @generated
- */
-public interface ResponseTime extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Maximum</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Maximum</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Maximum</em>' attribute.
-	 * @see #setMaximum(Float)
-	 * @see monitoringxml.MonitoringPackage#getResponseTime_Maximum()
-	 * @model
-	 * @generated
-	 */
-	Float getMaximum();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.ResponseTime#getMaximum <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Maximum</em>' attribute.
-	 * @see #getMaximum()
-	 * @generated
-	 */
-	void setMaximum(Float value);
-
-	/**
-	 * Returns the value of the '<em><b>Jitter</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Jitter</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Jitter</em>' attribute.
-	 * @see #setJitter(Float)
-	 * @see monitoringxml.MonitoringPackage#getResponseTime_Jitter()
-	 * @model
-	 * @generated
-	 */
-	Float getJitter();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.ResponseTime#getJitter <em>Jitter</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Jitter</em>' attribute.
-	 * @see #getJitter()
-	 * @generated
-	 */
-	void setJitter(Float value);
-
-	/**
-	 * Returns the value of the '<em><b>Monitoredresource</b></em>' reference.
-	 * It is bidirectional and its opposite is '{@link monitoringxml.MonitoredResource#getResponsetime <em>Responsetime</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Monitoredresource</em>' reference isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Monitoredresource</em>' reference.
-	 * @see #setMonitoredresource(MonitoredResource)
-	 * @see monitoringxml.MonitoringPackage#getResponseTime_Monitoredresource()
-	 * @see monitoringxml.MonitoredResource#getResponsetime
-	 * @model opposite="responsetime"
-	 * @generated
-	 */
-	MonitoredResource getMonitoredresource();
-
-	/**
-	 * Sets the value of the '{@link monitoringxml.ResponseTime#getMonitoredresource <em>Monitoredresource</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Monitoredresource</em>' reference.
-	 * @see #getMonitoredresource()
-	 * @generated
-	 */
-	void setMonitoredresource(MonitoredResource value);
-
-} // ResponseTime
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/BlockingTimeImpl.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/BlockingTimeImpl.java
deleted file mode 100644
index 7fd706f..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/BlockingTimeImpl.java
+++ /dev/null
@@ -1,291 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml.impl;
-
-import monitoringxml.BlockingTime;
-import monitoringxml.MonitoredResource;
-import monitoringxml.MonitoringPackage;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Blocking Time</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * </p>
- * <ul>
- *   <li>{@link monitoringxml.impl.BlockingTimeImpl#getMaximum <em>Maximum</em>}</li>
- *   <li>{@link monitoringxml.impl.BlockingTimeImpl#getMonitoredresource <em>Monitoredresource</em>}</li>
- * </ul>
- *
- * @generated
- */
-public class BlockingTimeImpl extends MinimalEObjectImpl.Container implements BlockingTime {
-	/**
-	 * The default value of the '{@link #getMaximum() <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaximum()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Float MAXIMUM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMaximum() <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaximum()
-	 * @generated
-	 * @ordered
-	 */
-	protected Float maximum = MAXIMUM_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getMonitoredresource() <em>Monitoredresource</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMonitoredresource()
-	 * @generated
-	 * @ordered
-	 */
-	protected MonitoredResource monitoredresource;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected BlockingTimeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return MonitoringPackage.Literals.BLOCKING_TIME;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Float getMaximum() {
-		return maximum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMaximum(Float newMaximum) {
-		Float oldMaximum = maximum;
-		maximum = newMaximum;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.BLOCKING_TIME__MAXIMUM, oldMaximum, maximum));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MonitoredResource getMonitoredresource() {
-		if (monitoredresource != null && monitoredresource.eIsProxy()) {
-			InternalEObject oldMonitoredresource = (InternalEObject)monitoredresource;
-			monitoredresource = (MonitoredResource)eResolveProxy(oldMonitoredresource);
-			if (monitoredresource != oldMonitoredresource) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE, oldMonitoredresource, monitoredresource));
-			}
-		}
-		return monitoredresource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MonitoredResource basicGetMonitoredresource() {
-		return monitoredresource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMonitoredresource(MonitoredResource newMonitoredresource, NotificationChain msgs) {
-		MonitoredResource oldMonitoredresource = monitoredresource;
-		monitoredresource = newMonitoredresource;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE, oldMonitoredresource, newMonitoredresource);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMonitoredresource(MonitoredResource newMonitoredresource) {
-		if (newMonitoredresource != monitoredresource) {
-			NotificationChain msgs = null;
-			if (monitoredresource != null)
-				msgs = ((InternalEObject)monitoredresource).eInverseRemove(this, MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME, MonitoredResource.class, msgs);
-			if (newMonitoredresource != null)
-				msgs = ((InternalEObject)newMonitoredresource).eInverseAdd(this, MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME, MonitoredResource.class, msgs);
-			msgs = basicSetMonitoredresource(newMonitoredresource, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE, newMonitoredresource, newMonitoredresource));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE:
-				if (monitoredresource != null)
-					msgs = ((InternalEObject)monitoredresource).eInverseRemove(this, MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME, MonitoredResource.class, msgs);
-				return basicSetMonitoredresource((MonitoredResource)otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE:
-				return basicSetMonitoredresource(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MonitoringPackage.BLOCKING_TIME__MAXIMUM:
-				return getMaximum();
-			case MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE:
-				if (resolve) return getMonitoredresource();
-				return basicGetMonitoredresource();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MonitoringPackage.BLOCKING_TIME__MAXIMUM:
-				setMaximum((Float)newValue);
-				return;
-			case MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE:
-				setMonitoredresource((MonitoredResource)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MonitoringPackage.BLOCKING_TIME__MAXIMUM:
-				setMaximum(MAXIMUM_EDEFAULT);
-				return;
-			case MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE:
-				setMonitoredresource((MonitoredResource)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MonitoringPackage.BLOCKING_TIME__MAXIMUM:
-				return MAXIMUM_EDEFAULT == null ? maximum != null : !MAXIMUM_EDEFAULT.equals(maximum);
-			case MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE:
-				return monitoredresource != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (maximum: ");
-		result.append(maximum);
-		result.append(')');
-		return result.toString();
-	}
-
-} //BlockingTimeImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ExecutionTimeImpl.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ExecutionTimeImpl.java
deleted file mode 100644
index fb4c4e1..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ExecutionTimeImpl.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml.impl;
-
-import monitoringxml.ExecutionTime;
-import monitoringxml.MonitoredResource;
-import monitoringxml.MonitoringPackage;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Execution Time</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * </p>
- * <ul>
- *   <li>{@link monitoringxml.impl.ExecutionTimeImpl#getMinimum <em>Minimum</em>}</li>
- *   <li>{@link monitoringxml.impl.ExecutionTimeImpl#getMaximum <em>Maximum</em>}</li>
- *   <li>{@link monitoringxml.impl.ExecutionTimeImpl#getMonitoredresource <em>Monitoredresource</em>}</li>
- * </ul>
- *
- * @generated
- */
-public class ExecutionTimeImpl extends MinimalEObjectImpl.Container implements ExecutionTime {
-	/**
-	 * The default value of the '{@link #getMinimum() <em>Minimum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinimum()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Float MINIMUM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMinimum() <em>Minimum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinimum()
-	 * @generated
-	 * @ordered
-	 */
-	protected Float minimum = MINIMUM_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMaximum() <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaximum()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Float MAXIMUM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMaximum() <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaximum()
-	 * @generated
-	 * @ordered
-	 */
-	protected Float maximum = MAXIMUM_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getMonitoredresource() <em>Monitoredresource</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMonitoredresource()
-	 * @generated
-	 * @ordered
-	 */
-	protected MonitoredResource monitoredresource;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ExecutionTimeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return MonitoringPackage.Literals.EXECUTION_TIME;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Float getMinimum() {
-		return minimum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinimum(Float newMinimum) {
-		Float oldMinimum = minimum;
-		minimum = newMinimum;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.EXECUTION_TIME__MINIMUM, oldMinimum, minimum));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Float getMaximum() {
-		return maximum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMaximum(Float newMaximum) {
-		Float oldMaximum = maximum;
-		maximum = newMaximum;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.EXECUTION_TIME__MAXIMUM, oldMaximum, maximum));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MonitoredResource getMonitoredresource() {
-		if (monitoredresource != null && monitoredresource.eIsProxy()) {
-			InternalEObject oldMonitoredresource = (InternalEObject)monitoredresource;
-			monitoredresource = (MonitoredResource)eResolveProxy(oldMonitoredresource);
-			if (monitoredresource != oldMonitoredresource) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE, oldMonitoredresource, monitoredresource));
-			}
-		}
-		return monitoredresource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MonitoredResource basicGetMonitoredresource() {
-		return monitoredresource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMonitoredresource(MonitoredResource newMonitoredresource, NotificationChain msgs) {
-		MonitoredResource oldMonitoredresource = monitoredresource;
-		monitoredresource = newMonitoredresource;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE, oldMonitoredresource, newMonitoredresource);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMonitoredresource(MonitoredResource newMonitoredresource) {
-		if (newMonitoredresource != monitoredresource) {
-			NotificationChain msgs = null;
-			if (monitoredresource != null)
-				msgs = ((InternalEObject)monitoredresource).eInverseRemove(this, MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME, MonitoredResource.class, msgs);
-			if (newMonitoredresource != null)
-				msgs = ((InternalEObject)newMonitoredresource).eInverseAdd(this, MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME, MonitoredResource.class, msgs);
-			msgs = basicSetMonitoredresource(newMonitoredresource, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE, newMonitoredresource, newMonitoredresource));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE:
-				if (monitoredresource != null)
-					msgs = ((InternalEObject)monitoredresource).eInverseRemove(this, MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME, MonitoredResource.class, msgs);
-				return basicSetMonitoredresource((MonitoredResource)otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE:
-				return basicSetMonitoredresource(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MonitoringPackage.EXECUTION_TIME__MINIMUM:
-				return getMinimum();
-			case MonitoringPackage.EXECUTION_TIME__MAXIMUM:
-				return getMaximum();
-			case MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE:
-				if (resolve) return getMonitoredresource();
-				return basicGetMonitoredresource();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MonitoringPackage.EXECUTION_TIME__MINIMUM:
-				setMinimum((Float)newValue);
-				return;
-			case MonitoringPackage.EXECUTION_TIME__MAXIMUM:
-				setMaximum((Float)newValue);
-				return;
-			case MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE:
-				setMonitoredresource((MonitoredResource)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MonitoringPackage.EXECUTION_TIME__MINIMUM:
-				setMinimum(MINIMUM_EDEFAULT);
-				return;
-			case MonitoringPackage.EXECUTION_TIME__MAXIMUM:
-				setMaximum(MAXIMUM_EDEFAULT);
-				return;
-			case MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE:
-				setMonitoredresource((MonitoredResource)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MonitoringPackage.EXECUTION_TIME__MINIMUM:
-				return MINIMUM_EDEFAULT == null ? minimum != null : !MINIMUM_EDEFAULT.equals(minimum);
-			case MonitoringPackage.EXECUTION_TIME__MAXIMUM:
-				return MAXIMUM_EDEFAULT == null ? maximum != null : !MAXIMUM_EDEFAULT.equals(maximum);
-			case MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE:
-				return monitoredresource != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (minimum: ");
-		result.append(minimum);
-		result.append(", maximum: ");
-		result.append(maximum);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ExecutionTimeImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoringPackageImpl.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoringPackageImpl.java
deleted file mode 100644
index 0738e01..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoringPackageImpl.java
+++ /dev/null
@@ -1,580 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml.impl;
-
-import monitoringxml.AnalysisContext;
-import monitoringxml.BlockingTime;
-import monitoringxml.ExecutionTime;
-import monitoringxml.MonitoredResource;
-import monitoringxml.Monitoring;
-import monitoringxml.MonitoringFactory;
-import monitoringxml.MonitoringPackage;
-import monitoringxml.Period;
-import monitoringxml.Resource;
-import monitoringxml.ResponseTime;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * @generated
- */
-public class MonitoringPackageImpl extends EPackageImpl implements MonitoringPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass monitoringEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass threadEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass resourceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass periodEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass monitoredResourceEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass executionTimeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass blockingTimeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass responseTimeEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private EClass analysisContextEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with
-	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>Note: the correct way to create the package is via the static
-	 * factory method {@link #init init()}, which also performs
-	 * initialization of the package, or returns the registered package,
-	 * if one already exists.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see monitoringxml.MonitoringPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private MonitoringPackageImpl() {
-		super(eNS_URI, MonitoringFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
-	 * 
-	 * <p>This method is used to initialize {@link MonitoringPackage#eINSTANCE} when that field is accessed.
-	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static MonitoringPackage init() {
-		if (isInited) return (MonitoringPackage)EPackage.Registry.INSTANCE.getEPackage(MonitoringPackage.eNS_URI);
-
-		// Obtain or create and register package
-		MonitoringPackageImpl theMonitoringPackage = (MonitoringPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof MonitoringPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new MonitoringPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theMonitoringPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theMonitoringPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theMonitoringPackage.freeze();
-
-  
-		// Update the registry and return the package
-		EPackage.Registry.INSTANCE.put(MonitoringPackage.eNS_URI, theMonitoringPackage);
-		return theMonitoringPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMonitoring() {
-		return monitoringEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMonitoring_ThreadNames() {
-		return (EReference)monitoringEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMonitoring_SharedResources() {
-		return (EReference)monitoringEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMonitoring_AnalysisContext() {
-		return (EReference)monitoringEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getThread() {
-		return threadEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResource() {
-		return resourceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getPeriod() {
-		return periodEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPeriod_Minimum() {
-		return (EAttribute)periodEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPeriod_Maximum() {
-		return (EAttribute)periodEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getPeriod_Jitter() {
-		return (EAttribute)periodEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getPeriod_Monitoredresource() {
-		return (EReference)periodEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getMonitoredResource() {
-		return monitoredResourceEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getMonitoredResource_Name() {
-		return (EAttribute)monitoredResourceEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMonitoredResource_Period() {
-		return (EReference)monitoredResourceEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMonitoredResource_Executiontime() {
-		return (EReference)monitoredResourceEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMonitoredResource_Blockingtime() {
-		return (EReference)monitoredResourceEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getMonitoredResource_Responsetime() {
-		return (EReference)monitoredResourceEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getExecutionTime() {
-		return executionTimeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExecutionTime_Minimum() {
-		return (EAttribute)executionTimeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getExecutionTime_Maximum() {
-		return (EAttribute)executionTimeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getExecutionTime_Monitoredresource() {
-		return (EReference)executionTimeEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getBlockingTime() {
-		return blockingTimeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getBlockingTime_Maximum() {
-		return (EAttribute)blockingTimeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getBlockingTime_Monitoredresource() {
-		return (EReference)blockingTimeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getResponseTime() {
-		return responseTimeEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResponseTime_Maximum() {
-		return (EAttribute)responseTimeEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getResponseTime_Jitter() {
-		return (EAttribute)responseTimeEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EReference getResponseTime_Monitoredresource() {
-		return (EReference)responseTimeEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EClass getAnalysisContext() {
-		return analysisContextEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public EAttribute getAnalysisContext_Name() {
-		return (EAttribute)analysisContextEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MonitoringFactory getMonitoringFactory() {
-		return (MonitoringFactory)getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package.  This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated) return;
-		isCreated = true;
-
-		// Create classes and their features
-		monitoringEClass = createEClass(MONITORING);
-		createEReference(monitoringEClass, MONITORING__THREAD_NAMES);
-		createEReference(monitoringEClass, MONITORING__SHARED_RESOURCES);
-		createEReference(monitoringEClass, MONITORING__ANALYSIS_CONTEXT);
-
-		threadEClass = createEClass(THREAD);
-
-		resourceEClass = createEClass(RESOURCE);
-
-		periodEClass = createEClass(PERIOD);
-		createEAttribute(periodEClass, PERIOD__MINIMUM);
-		createEAttribute(periodEClass, PERIOD__MAXIMUM);
-		createEAttribute(periodEClass, PERIOD__JITTER);
-		createEReference(periodEClass, PERIOD__MONITOREDRESOURCE);
-
-		monitoredResourceEClass = createEClass(MONITORED_RESOURCE);
-		createEAttribute(monitoredResourceEClass, MONITORED_RESOURCE__NAME);
-		createEReference(monitoredResourceEClass, MONITORED_RESOURCE__PERIOD);
-		createEReference(monitoredResourceEClass, MONITORED_RESOURCE__EXECUTIONTIME);
-		createEReference(monitoredResourceEClass, MONITORED_RESOURCE__BLOCKINGTIME);
-		createEReference(monitoredResourceEClass, MONITORED_RESOURCE__RESPONSETIME);
-
-		executionTimeEClass = createEClass(EXECUTION_TIME);
-		createEAttribute(executionTimeEClass, EXECUTION_TIME__MINIMUM);
-		createEAttribute(executionTimeEClass, EXECUTION_TIME__MAXIMUM);
-		createEReference(executionTimeEClass, EXECUTION_TIME__MONITOREDRESOURCE);
-
-		blockingTimeEClass = createEClass(BLOCKING_TIME);
-		createEAttribute(blockingTimeEClass, BLOCKING_TIME__MAXIMUM);
-		createEReference(blockingTimeEClass, BLOCKING_TIME__MONITOREDRESOURCE);
-
-		responseTimeEClass = createEClass(RESPONSE_TIME);
-		createEAttribute(responseTimeEClass, RESPONSE_TIME__MAXIMUM);
-		createEAttribute(responseTimeEClass, RESPONSE_TIME__JITTER);
-		createEReference(responseTimeEClass, RESPONSE_TIME__MONITOREDRESOURCE);
-
-		analysisContextEClass = createEClass(ANALYSIS_CONTEXT);
-		createEAttribute(analysisContextEClass, ANALYSIS_CONTEXT__NAME);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model.  This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized) return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Create type parameters
-
-		// Set bounds for type parameters
-
-		// Add supertypes to classes
-		threadEClass.getESuperTypes().add(this.getMonitoredResource());
-		resourceEClass.getESuperTypes().add(this.getMonitoredResource());
-
-		// Initialize classes, features, and operations; add parameters
-		initEClass(monitoringEClass, Monitoring.class, "Monitoring", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getMonitoring_ThreadNames(), this.getThread(), null, "ThreadNames", null, 0, -1, Monitoring.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMonitoring_SharedResources(), this.getResource(), null, "SharedResources", null, 0, -1, Monitoring.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMonitoring_AnalysisContext(), this.getAnalysisContext(), null, "analysisContext", null, 1, 1, Monitoring.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(threadEClass, monitoringxml.Thread.class, "Thread", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(resourceEClass, Resource.class, "Resource", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-
-		initEClass(periodEClass, Period.class, "Period", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getPeriod_Minimum(), ecorePackage.getEFloatObject(), "minimum", null, 0, 1, Period.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPeriod_Maximum(), ecorePackage.getEFloatObject(), "maximum", null, 0, 1, Period.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getPeriod_Jitter(), ecorePackage.getEFloatObject(), "jitter", null, 0, 1, Period.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getPeriod_Monitoredresource(), this.getMonitoredResource(), this.getMonitoredResource_Period(), "monitoredresource", null, 0, 1, Period.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(monitoredResourceEClass, MonitoredResource.class, "MonitoredResource", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getMonitoredResource_Name(), ecorePackage.getEString(), "name", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMonitoredResource_Period(), this.getPeriod(), this.getPeriod_Monitoredresource(), "period", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMonitoredResource_Executiontime(), this.getExecutionTime(), this.getExecutionTime_Monitoredresource(), "executiontime", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMonitoredResource_Blockingtime(), this.getBlockingTime(), this.getBlockingTime_Monitoredresource(), "blockingtime", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMonitoredResource_Responsetime(), this.getResponseTime(), this.getResponseTime_Monitoredresource(), "responsetime", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(executionTimeEClass, ExecutionTime.class, "ExecutionTime", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getExecutionTime_Minimum(), ecorePackage.getEFloatObject(), "minimum", null, 0, 1, ExecutionTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getExecutionTime_Maximum(), ecorePackage.getEFloatObject(), "maximum", null, 0, 1, ExecutionTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getExecutionTime_Monitoredresource(), this.getMonitoredResource(), this.getMonitoredResource_Executiontime(), "monitoredresource", null, 0, 1, ExecutionTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(blockingTimeEClass, BlockingTime.class, "BlockingTime", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getBlockingTime_Maximum(), ecorePackage.getEFloatObject(), "maximum", null, 0, 1, BlockingTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getBlockingTime_Monitoredresource(), this.getMonitoredResource(), this.getMonitoredResource_Blockingtime(), "monitoredresource", null, 0, 1, BlockingTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(responseTimeEClass, ResponseTime.class, "ResponseTime", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getResponseTime_Maximum(), ecorePackage.getEFloatObject(), "maximum", null, 0, 1, ResponseTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getResponseTime_Jitter(), ecorePackage.getEFloatObject(), "jitter", null, 0, 1, ResponseTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getResponseTime_Monitoredresource(), this.getMonitoredResource(), this.getMonitoredResource_Responsetime(), "monitoredresource", null, 0, 1, ResponseTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(analysisContextEClass, AnalysisContext.class, "AnalysisContext", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getAnalysisContext_Name(), ecorePackage.getEString(), "name", null, 0, 1, AnalysisContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-} //MonitoringPackageImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/PeriodImpl.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/PeriodImpl.java
deleted file mode 100644
index e13eedc..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/PeriodImpl.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml.impl;
-
-import monitoringxml.MonitoredResource;
-import monitoringxml.MonitoringPackage;
-import monitoringxml.Period;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Period</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * </p>
- * <ul>
- *   <li>{@link monitoringxml.impl.PeriodImpl#getMinimum <em>Minimum</em>}</li>
- *   <li>{@link monitoringxml.impl.PeriodImpl#getMaximum <em>Maximum</em>}</li>
- *   <li>{@link monitoringxml.impl.PeriodImpl#getJitter <em>Jitter</em>}</li>
- *   <li>{@link monitoringxml.impl.PeriodImpl#getMonitoredresource <em>Monitoredresource</em>}</li>
- * </ul>
- *
- * @generated
- */
-public class PeriodImpl extends MinimalEObjectImpl.Container implements Period {
-	/**
-	 * The default value of the '{@link #getMinimum() <em>Minimum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinimum()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Float MINIMUM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMinimum() <em>Minimum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMinimum()
-	 * @generated
-	 * @ordered
-	 */
-	protected Float minimum = MINIMUM_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getMaximum() <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaximum()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Float MAXIMUM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMaximum() <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaximum()
-	 * @generated
-	 * @ordered
-	 */
-	protected Float maximum = MAXIMUM_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getJitter() <em>Jitter</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJitter()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Float JITTER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getJitter() <em>Jitter</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJitter()
-	 * @generated
-	 * @ordered
-	 */
-	protected Float jitter = JITTER_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getMonitoredresource() <em>Monitoredresource</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMonitoredresource()
-	 * @generated
-	 * @ordered
-	 */
-	protected MonitoredResource monitoredresource;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected PeriodImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return MonitoringPackage.Literals.PERIOD;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Float getMinimum() {
-		return minimum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMinimum(Float newMinimum) {
-		Float oldMinimum = minimum;
-		minimum = newMinimum;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.PERIOD__MINIMUM, oldMinimum, minimum));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Float getMaximum() {
-		return maximum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMaximum(Float newMaximum) {
-		Float oldMaximum = maximum;
-		maximum = newMaximum;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.PERIOD__MAXIMUM, oldMaximum, maximum));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Float getJitter() {
-		return jitter;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setJitter(Float newJitter) {
-		Float oldJitter = jitter;
-		jitter = newJitter;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.PERIOD__JITTER, oldJitter, jitter));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MonitoredResource getMonitoredresource() {
-		if (monitoredresource != null && monitoredresource.eIsProxy()) {
-			InternalEObject oldMonitoredresource = (InternalEObject)monitoredresource;
-			monitoredresource = (MonitoredResource)eResolveProxy(oldMonitoredresource);
-			if (monitoredresource != oldMonitoredresource) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, MonitoringPackage.PERIOD__MONITOREDRESOURCE, oldMonitoredresource, monitoredresource));
-			}
-		}
-		return monitoredresource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MonitoredResource basicGetMonitoredresource() {
-		return monitoredresource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMonitoredresource(MonitoredResource newMonitoredresource, NotificationChain msgs) {
-		MonitoredResource oldMonitoredresource = monitoredresource;
-		monitoredresource = newMonitoredresource;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringPackage.PERIOD__MONITOREDRESOURCE, oldMonitoredresource, newMonitoredresource);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMonitoredresource(MonitoredResource newMonitoredresource) {
-		if (newMonitoredresource != monitoredresource) {
-			NotificationChain msgs = null;
-			if (monitoredresource != null)
-				msgs = ((InternalEObject)monitoredresource).eInverseRemove(this, MonitoringPackage.MONITORED_RESOURCE__PERIOD, MonitoredResource.class, msgs);
-			if (newMonitoredresource != null)
-				msgs = ((InternalEObject)newMonitoredresource).eInverseAdd(this, MonitoringPackage.MONITORED_RESOURCE__PERIOD, MonitoredResource.class, msgs);
-			msgs = basicSetMonitoredresource(newMonitoredresource, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.PERIOD__MONITOREDRESOURCE, newMonitoredresource, newMonitoredresource));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MonitoringPackage.PERIOD__MONITOREDRESOURCE:
-				if (monitoredresource != null)
-					msgs = ((InternalEObject)monitoredresource).eInverseRemove(this, MonitoringPackage.MONITORED_RESOURCE__PERIOD, MonitoredResource.class, msgs);
-				return basicSetMonitoredresource((MonitoredResource)otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MonitoringPackage.PERIOD__MONITOREDRESOURCE:
-				return basicSetMonitoredresource(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MonitoringPackage.PERIOD__MINIMUM:
-				return getMinimum();
-			case MonitoringPackage.PERIOD__MAXIMUM:
-				return getMaximum();
-			case MonitoringPackage.PERIOD__JITTER:
-				return getJitter();
-			case MonitoringPackage.PERIOD__MONITOREDRESOURCE:
-				if (resolve) return getMonitoredresource();
-				return basicGetMonitoredresource();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MonitoringPackage.PERIOD__MINIMUM:
-				setMinimum((Float)newValue);
-				return;
-			case MonitoringPackage.PERIOD__MAXIMUM:
-				setMaximum((Float)newValue);
-				return;
-			case MonitoringPackage.PERIOD__JITTER:
-				setJitter((Float)newValue);
-				return;
-			case MonitoringPackage.PERIOD__MONITOREDRESOURCE:
-				setMonitoredresource((MonitoredResource)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MonitoringPackage.PERIOD__MINIMUM:
-				setMinimum(MINIMUM_EDEFAULT);
-				return;
-			case MonitoringPackage.PERIOD__MAXIMUM:
-				setMaximum(MAXIMUM_EDEFAULT);
-				return;
-			case MonitoringPackage.PERIOD__JITTER:
-				setJitter(JITTER_EDEFAULT);
-				return;
-			case MonitoringPackage.PERIOD__MONITOREDRESOURCE:
-				setMonitoredresource((MonitoredResource)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MonitoringPackage.PERIOD__MINIMUM:
-				return MINIMUM_EDEFAULT == null ? minimum != null : !MINIMUM_EDEFAULT.equals(minimum);
-			case MonitoringPackage.PERIOD__MAXIMUM:
-				return MAXIMUM_EDEFAULT == null ? maximum != null : !MAXIMUM_EDEFAULT.equals(maximum);
-			case MonitoringPackage.PERIOD__JITTER:
-				return JITTER_EDEFAULT == null ? jitter != null : !JITTER_EDEFAULT.equals(jitter);
-			case MonitoringPackage.PERIOD__MONITOREDRESOURCE:
-				return monitoredresource != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (minimum: ");
-		result.append(minimum);
-		result.append(", maximum: ");
-		result.append(maximum);
-		result.append(", jitter: ");
-		result.append(jitter);
-		result.append(')');
-		return result.toString();
-	}
-
-} //PeriodImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ResponseTimeImpl.java b/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ResponseTimeImpl.java
deleted file mode 100644
index ec6b403..0000000
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ResponseTimeImpl.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml.impl;
-
-import monitoringxml.MonitoredResource;
-import monitoringxml.MonitoringPackage;
-import monitoringxml.ResponseTime;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Response Time</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * </p>
- * <ul>
- *   <li>{@link monitoringxml.impl.ResponseTimeImpl#getMaximum <em>Maximum</em>}</li>
- *   <li>{@link monitoringxml.impl.ResponseTimeImpl#getJitter <em>Jitter</em>}</li>
- *   <li>{@link monitoringxml.impl.ResponseTimeImpl#getMonitoredresource <em>Monitoredresource</em>}</li>
- * </ul>
- *
- * @generated
- */
-public class ResponseTimeImpl extends MinimalEObjectImpl.Container implements ResponseTime {
-	/**
-	 * The default value of the '{@link #getMaximum() <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaximum()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Float MAXIMUM_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMaximum() <em>Maximum</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMaximum()
-	 * @generated
-	 * @ordered
-	 */
-	protected Float maximum = MAXIMUM_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getJitter() <em>Jitter</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJitter()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Float JITTER_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getJitter() <em>Jitter</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getJitter()
-	 * @generated
-	 * @ordered
-	 */
-	protected Float jitter = JITTER_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getMonitoredresource() <em>Monitoredresource</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getMonitoredresource()
-	 * @generated
-	 * @ordered
-	 */
-	protected MonitoredResource monitoredresource;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	protected ResponseTimeImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return MonitoringPackage.Literals.RESPONSE_TIME;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Float getMaximum() {
-		return maximum;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMaximum(Float newMaximum) {
-		Float oldMaximum = maximum;
-		maximum = newMaximum;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.RESPONSE_TIME__MAXIMUM, oldMaximum, maximum));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Float getJitter() {
-		return jitter;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setJitter(Float newJitter) {
-		Float oldJitter = jitter;
-		jitter = newJitter;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.RESPONSE_TIME__JITTER, oldJitter, jitter));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MonitoredResource getMonitoredresource() {
-		if (monitoredresource != null && monitoredresource.eIsProxy()) {
-			InternalEObject oldMonitoredresource = (InternalEObject)monitoredresource;
-			monitoredresource = (MonitoredResource)eResolveProxy(oldMonitoredresource);
-			if (monitoredresource != oldMonitoredresource) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE, oldMonitoredresource, monitoredresource));
-			}
-		}
-		return monitoredresource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public MonitoredResource basicGetMonitoredresource() {
-		return monitoredresource;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public NotificationChain basicSetMonitoredresource(MonitoredResource newMonitoredresource, NotificationChain msgs) {
-		MonitoredResource oldMonitoredresource = monitoredresource;
-		monitoredresource = newMonitoredresource;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE, oldMonitoredresource, newMonitoredresource);
-			if (msgs == null) msgs = notification; else msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setMonitoredresource(MonitoredResource newMonitoredresource) {
-		if (newMonitoredresource != monitoredresource) {
-			NotificationChain msgs = null;
-			if (monitoredresource != null)
-				msgs = ((InternalEObject)monitoredresource).eInverseRemove(this, MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME, MonitoredResource.class, msgs);
-			if (newMonitoredresource != null)
-				msgs = ((InternalEObject)newMonitoredresource).eInverseAdd(this, MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME, MonitoredResource.class, msgs);
-			msgs = basicSetMonitoredresource(newMonitoredresource, msgs);
-			if (msgs != null) msgs.dispatch();
-		}
-		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE, newMonitoredresource, newMonitoredresource));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE:
-				if (monitoredresource != null)
-					msgs = ((InternalEObject)monitoredresource).eInverseRemove(this, MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME, MonitoredResource.class, msgs);
-				return basicSetMonitoredresource((MonitoredResource)otherEnd, msgs);
-		}
-		return super.eInverseAdd(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-			case MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE:
-				return basicSetMonitoredresource(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-			case MonitoringPackage.RESPONSE_TIME__MAXIMUM:
-				return getMaximum();
-			case MonitoringPackage.RESPONSE_TIME__JITTER:
-				return getJitter();
-			case MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE:
-				if (resolve) return getMonitoredresource();
-				return basicGetMonitoredresource();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-			case MonitoringPackage.RESPONSE_TIME__MAXIMUM:
-				setMaximum((Float)newValue);
-				return;
-			case MonitoringPackage.RESPONSE_TIME__JITTER:
-				setJitter((Float)newValue);
-				return;
-			case MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE:
-				setMonitoredresource((MonitoredResource)newValue);
-				return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-			case MonitoringPackage.RESPONSE_TIME__MAXIMUM:
-				setMaximum(MAXIMUM_EDEFAULT);
-				return;
-			case MonitoringPackage.RESPONSE_TIME__JITTER:
-				setJitter(JITTER_EDEFAULT);
-				return;
-			case MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE:
-				setMonitoredresource((MonitoredResource)null);
-				return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-			case MonitoringPackage.RESPONSE_TIME__MAXIMUM:
-				return MAXIMUM_EDEFAULT == null ? maximum != null : !MAXIMUM_EDEFAULT.equals(maximum);
-			case MonitoringPackage.RESPONSE_TIME__JITTER:
-				return JITTER_EDEFAULT == null ? jitter != null : !JITTER_EDEFAULT.equals(jitter);
-			case MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE:
-				return monitoredresource != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy()) return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (maximum: ");
-		result.append(maximum);
-		result.append(", jitter: ");
-		result.append(jitter);
-		result.append(')');
-		return result.toString();
-	}
-
-} //ResponseTimeImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Activator.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Activator.java
new file mode 100644
index 0000000..ff3cfef
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Activator.java
@@ -0,0 +1,66 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */  
+
+package org.polarsys.chess.monitoring.monitoringxml;
+
+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 = "org.polarsys.chess.monitoring"; //$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;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/AnalysisContext.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/AnalysisContext.java
similarity index 79%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/AnalysisContext.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/AnalysisContext.java
index 7ecbf5d..29ab72c 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/AnalysisContext.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/AnalysisContext.java
@@ -13,7 +13,7 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */  
-package monitoringxml;
+package org.polarsys.chess.monitoring.monitoringxml;
 
 import org.eclipse.emf.ecore.EObject;
 
@@ -24,12 +24,12 @@
  *
  * <p>
  * The following features are supported:
- * </p>
  * <ul>
- *   <li>{@link monitoringxml.AnalysisContext#getName <em>Name</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.AnalysisContext#getName <em>Name</em>}</li>
  * </ul>
+ * </p>
  *
- * @see monitoringxml.MonitoringPackage#getAnalysisContext()
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getAnalysisContext()
  * @model
  * @generated
  */
@@ -44,14 +44,14 @@
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Name</em>' attribute.
 	 * @see #setName(String)
-	 * @see monitoringxml.MonitoringPackage#getAnalysisContext_Name()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getAnalysisContext_Name()
 	 * @model
 	 * @generated
 	 */
 	String getName();
 
 	/**
-	 * Sets the value of the '{@link monitoringxml.AnalysisContext#getName <em>Name</em>}' attribute.
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.AnalysisContext#getName <em>Name</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Name</em>' attribute.
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/BlockingTime.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/BlockingTime.java
new file mode 100644
index 0000000..3381281
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/BlockingTime.java
@@ -0,0 +1,146 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */  
+package org.polarsys.chess.monitoring.monitoringxml;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Blocking Time</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMonitoredresource <em>Monitoredresource</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMinimum <em>Minimum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMaximum <em>Maximum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getAverage <em>Average</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getBlockingTime()
+ * @model
+ * @generated
+ */
+public interface BlockingTime extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Monitoredresource</b></em>' container reference.
+	 * It is bidirectional and its opposite is '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getBlockingtime <em>Blockingtime</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Monitoredresource</em>' container reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Monitoredresource</em>' container reference.
+	 * @see #setMonitoredresource(MonitoredResource)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getBlockingTime_Monitoredresource()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getBlockingtime
+	 * @model opposite="blockingtime" transient="false"
+	 * @generated
+	 */
+	MonitoredResource getMonitoredresource();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMonitoredresource <em>Monitoredresource</em>}' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Monitoredresource</em>' container reference.
+	 * @see #getMonitoredresource()
+	 * @generated
+	 */
+	void setMonitoredresource(MonitoredResource value);
+
+	/**
+	 * Returns the value of the '<em><b>Minimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Minimum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Minimum</em>' containment reference.
+	 * @see #setMinimum(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getBlockingTime_Minimum()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getMinimum();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMinimum <em>Minimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Minimum</em>' containment reference.
+	 * @see #getMinimum()
+	 * @generated
+	 */
+	void setMinimum(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Maximum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Maximum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Maximum</em>' containment reference.
+	 * @see #setMaximum(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getBlockingTime_Maximum()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getMaximum();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMaximum <em>Maximum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Maximum</em>' containment reference.
+	 * @see #getMaximum()
+	 * @generated
+	 */
+	void setMaximum(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Average</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Average</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Average</em>' containment reference.
+	 * @see #setAverage(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getBlockingTime_Average()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getAverage();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getAverage <em>Average</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Average</em>' containment reference.
+	 * @see #getAverage()
+	 * @generated
+	 */
+	void setAverage(MeasuredValue value);
+
+} // BlockingTime
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/ExecutionTime.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/ExecutionTime.java
new file mode 100644
index 0000000..7c952ad
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/ExecutionTime.java
@@ -0,0 +1,146 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */  
+package org.polarsys.chess.monitoring.monitoringxml;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Execution Time</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMonitoredresource <em>Monitoredresource</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMinimum <em>Minimum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMaximum <em>Maximum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getAverage <em>Average</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getExecutionTime()
+ * @model
+ * @generated
+ */
+public interface ExecutionTime extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Monitoredresource</b></em>' container reference.
+	 * It is bidirectional and its opposite is '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getExecutiontime <em>Executiontime</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Monitoredresource</em>' container reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Monitoredresource</em>' container reference.
+	 * @see #setMonitoredresource(MonitoredResource)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getExecutionTime_Monitoredresource()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getExecutiontime
+	 * @model opposite="executiontime" transient="false"
+	 * @generated
+	 */
+	MonitoredResource getMonitoredresource();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMonitoredresource <em>Monitoredresource</em>}' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Monitoredresource</em>' container reference.
+	 * @see #getMonitoredresource()
+	 * @generated
+	 */
+	void setMonitoredresource(MonitoredResource value);
+
+	/**
+	 * Returns the value of the '<em><b>Minimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Minimum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Minimum</em>' containment reference.
+	 * @see #setMinimum(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getExecutionTime_Minimum()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getMinimum();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMinimum <em>Minimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Minimum</em>' containment reference.
+	 * @see #getMinimum()
+	 * @generated
+	 */
+	void setMinimum(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Maximum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Maximum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Maximum</em>' containment reference.
+	 * @see #setMaximum(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getExecutionTime_Maximum()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getMaximum();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMaximum <em>Maximum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Maximum</em>' containment reference.
+	 * @see #getMaximum()
+	 * @generated
+	 */
+	void setMaximum(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Average</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Average</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Average</em>' containment reference.
+	 * @see #setAverage(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getExecutionTime_Average()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getAverage();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getAverage <em>Average</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Average</em>' containment reference.
+	 * @see #getAverage()
+	 * @generated
+	 */
+	void setAverage(MeasuredValue value);
+
+} // ExecutionTime
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MeasuredValue.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MeasuredValue.java
new file mode 100644
index 0000000..a969e05
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MeasuredValue.java
@@ -0,0 +1,89 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 Malardalen University, Sweden                     --
+--                                                                   --                      --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Measured Value</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.MeasuredValue#getUnit <em>Unit</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.MeasuredValue#getValue <em>Value</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMeasuredValue()
+ * @model
+ * @generated
+ */
+public interface MeasuredValue extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Unit</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Unit</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Unit</em>' attribute.
+	 * @see #setUnit(String)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMeasuredValue_Unit()
+	 * @model
+	 * @generated
+	 */
+	String getUnit();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.MeasuredValue#getUnit <em>Unit</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Unit</em>' attribute.
+	 * @see #getUnit()
+	 * @generated
+	 */
+	void setUnit(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(Float)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMeasuredValue_Value()
+	 * @model
+	 * @generated
+	 */
+	Float getValue();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.MeasuredValue#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(Float value);
+
+} // MeasuredValue
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MonitoredResource.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MonitoredResource.java
new file mode 100644
index 0000000..5ba62af
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MonitoredResource.java
@@ -0,0 +1,179 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Monitored Resource</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getName <em>Name</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getPeriod <em>Period</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getExecutiontime <em>Executiontime</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getBlockingtime <em>Blockingtime</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getResponsetime <em>Responsetime</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoredResource()
+ * @model abstract="true"
+ * @generated
+ */
+public interface MonitoredResource extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoredResource_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Period</b></em>' containment reference.
+	 * It is bidirectional and its opposite is '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMonitoredresource <em>Monitoredresource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Period</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Period</em>' containment reference.
+	 * @see #setPeriod(Period)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoredResource_Period()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Period#getMonitoredresource
+	 * @model opposite="monitoredresource" containment="true"
+	 * @generated
+	 */
+	Period getPeriod();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getPeriod <em>Period</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Period</em>' containment reference.
+	 * @see #getPeriod()
+	 * @generated
+	 */
+	void setPeriod(Period value);
+
+	/**
+	 * Returns the value of the '<em><b>Executiontime</b></em>' containment reference.
+	 * It is bidirectional and its opposite is '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMonitoredresource <em>Monitoredresource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Executiontime</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Executiontime</em>' containment reference.
+	 * @see #setExecutiontime(ExecutionTime)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoredResource_Executiontime()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMonitoredresource
+	 * @model opposite="monitoredresource" containment="true"
+	 * @generated
+	 */
+	ExecutionTime getExecutiontime();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getExecutiontime <em>Executiontime</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Executiontime</em>' containment reference.
+	 * @see #getExecutiontime()
+	 * @generated
+	 */
+	void setExecutiontime(ExecutionTime value);
+
+	/**
+	 * Returns the value of the '<em><b>Blockingtime</b></em>' containment reference.
+	 * It is bidirectional and its opposite is '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMonitoredresource <em>Monitoredresource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Blockingtime</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Blockingtime</em>' containment reference.
+	 * @see #setBlockingtime(BlockingTime)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoredResource_Blockingtime()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMonitoredresource
+	 * @model opposite="monitoredresource" containment="true"
+	 * @generated
+	 */
+	BlockingTime getBlockingtime();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getBlockingtime <em>Blockingtime</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Blockingtime</em>' containment reference.
+	 * @see #getBlockingtime()
+	 * @generated
+	 */
+	void setBlockingtime(BlockingTime value);
+
+	/**
+	 * Returns the value of the '<em><b>Responsetime</b></em>' containment reference.
+	 * It is bidirectional and its opposite is '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMonitoredresource <em>Monitoredresource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Responsetime</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Responsetime</em>' containment reference.
+	 * @see #setResponsetime(ResponseTime)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoredResource_Responsetime()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMonitoredresource
+	 * @model opposite="monitoredresource" containment="true"
+	 * @generated
+	 */
+	ResponseTime getResponsetime();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getResponsetime <em>Responsetime</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Responsetime</em>' containment reference.
+	 * @see #getResponsetime()
+	 * @generated
+	 */
+	void setResponsetime(ResponseTime value);
+
+} // MonitoredResource
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/Monitoring.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Monitoring.java
similarity index 71%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/Monitoring.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Monitoring.java
index d0765a4..7d2ffd2 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/Monitoring.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Monitoring.java
@@ -13,7 +13,7 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml;
+package org.polarsys.chess.monitoring.monitoringxml;
 
 import org.eclipse.emf.common.util.EList;
 
@@ -26,21 +26,21 @@
  *
  * <p>
  * The following features are supported:
- * </p>
  * <ul>
- *   <li>{@link monitoringxml.Monitoring#getThreadNames <em>Thread Names</em>}</li>
- *   <li>{@link monitoringxml.Monitoring#getSharedResources <em>Shared Resources</em>}</li>
- *   <li>{@link monitoringxml.Monitoring#getAnalysisContext <em>Analysis Context</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.Monitoring#getThreadNames <em>Thread Names</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.Monitoring#getSharedResources <em>Shared Resources</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.Monitoring#getAnalysisContext <em>Analysis Context</em>}</li>
  * </ul>
+ * </p>
  *
- * @see monitoringxml.MonitoringPackage#getMonitoring()
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoring()
  * @model
  * @generated
  */
 public interface Monitoring extends EObject {
 	/**
 	 * Returns the value of the '<em><b>Thread Names</b></em>' containment reference list.
-	 * The list contents are of type {@link monitoringxml.Thread}.
+	 * The list contents are of type {@link org.polarsys.chess.monitoring.monitoringxml.Thread}.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Thread Names</em>' containment reference list isn't clear,
@@ -48,15 +48,15 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Thread Names</em>' containment reference list.
-	 * @see monitoringxml.MonitoringPackage#getMonitoring_ThreadNames()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoring_ThreadNames()
 	 * @model containment="true"
 	 * @generated
 	 */
-	EList<monitoringxml.Thread> getThreadNames();
+	EList<org.polarsys.chess.monitoring.monitoringxml.Thread> getThreadNames();
 
 	/**
 	 * Returns the value of the '<em><b>Shared Resources</b></em>' containment reference list.
-	 * The list contents are of type {@link monitoringxml.Resource}.
+	 * The list contents are of type {@link org.polarsys.chess.monitoring.monitoringxml.Resource}.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Shared Resources</em>' containment reference list isn't clear,
@@ -64,7 +64,7 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Shared Resources</em>' containment reference list.
-	 * @see monitoringxml.MonitoringPackage#getMonitoring_SharedResources()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoring_SharedResources()
 	 * @model containment="true"
 	 * @generated
 	 */
@@ -80,14 +80,14 @@
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Analysis Context</em>' containment reference.
 	 * @see #setAnalysisContext(AnalysisContext)
-	 * @see monitoringxml.MonitoringPackage#getMonitoring_AnalysisContext()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getMonitoring_AnalysisContext()
 	 * @model containment="true" required="true"
 	 * @generated
 	 */
 	AnalysisContext getAnalysisContext();
 
 	/**
-	 * Sets the value of the '{@link monitoringxml.Monitoring#getAnalysisContext <em>Analysis Context</em>}' containment reference.
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.Monitoring#getAnalysisContext <em>Analysis Context</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Analysis Context</em>' containment reference.
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/MonitoringFactory.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MonitoringxmlFactory.java
similarity index 83%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/MonitoringFactory.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MonitoringxmlFactory.java
index 2b877a4..f0fbc1f 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/MonitoringFactory.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MonitoringxmlFactory.java
@@ -13,7 +13,7 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml;
+package org.polarsys.chess.monitoring.monitoringxml;
 
 import org.eclipse.emf.ecore.EFactory;
 
@@ -22,17 +22,17 @@
  * The <b>Factory</b> for the model.
  * It provides a create method for each non-abstract class of the model.
  * <!-- end-user-doc -->
- * @see monitoringxml.MonitoringPackage
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage
  * @generated
  */
-public interface MonitoringFactory extends EFactory {
+public interface MonitoringxmlFactory extends EFactory {
 	/**
 	 * The singleton instance of the factory.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	MonitoringFactory eINSTANCE = monitoringxml.impl.MonitoringFactoryImpl.init();
+	MonitoringxmlFactory eINSTANCE = org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlFactoryImpl.init();
 
 	/**
 	 * Returns a new object of class '<em>Monitoring</em>'.
@@ -107,12 +107,21 @@
 	AnalysisContext createAnalysisContext();
 
 	/**
+	 * Returns a new object of class '<em>Measured Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Measured Value</em>'.
+	 * @generated
+	 */
+	MeasuredValue createMeasuredValue();
+
+	/**
 	 * Returns the package supported by this factory.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the package supported by this factory.
 	 * @generated
 	 */
-	MonitoringPackage getMonitoringPackage();
+	MonitoringxmlPackage getMonitoringxmlPackage();
 
-} //MonitoringFactory
+} //MonitoringxmlFactory
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MonitoringxmlPackage.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MonitoringxmlPackage.java
new file mode 100644
index 0000000..be9e5dd
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/MonitoringxmlPackage.java
@@ -0,0 +1,1480 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Package</b> for the model.
+ * It contains accessors for the meta objects to represent
+ * <ul>
+ *   <li>each class,</li>
+ *   <li>each feature of each class,</li>
+ *   <li>each operation of each class,</li>
+ *   <li>each enum,</li>
+ *   <li>and each data type</li>
+ * </ul>
+ * <!-- end-user-doc -->
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlFactory
+ * @model kind="package"
+ * @generated
+ */
+public interface MonitoringxmlPackage extends EPackage {
+	/**
+	 * The package name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNAME = "monitoringxml";
+
+	/**
+	 * The package namespace URI.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_URI = "http://www.mdh.se/concerto/monitoring/xml/monitoringxml";
+
+	/**
+	 * The package namespace name.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	String eNS_PREFIX = "monitoringxml";
+
+	/**
+	 * The singleton instance of the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	MonitoringxmlPackage eINSTANCE = org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl.init();
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringImpl <em>Monitoring</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getMonitoring()
+	 * @generated
+	 */
+	int MONITORING = 0;
+
+	/**
+	 * The feature id for the '<em><b>Thread Names</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORING__THREAD_NAMES = 0;
+
+	/**
+	 * The feature id for the '<em><b>Shared Resources</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORING__SHARED_RESOURCES = 1;
+
+	/**
+	 * The feature id for the '<em><b>Analysis Context</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORING__ANALYSIS_CONTEXT = 2;
+
+	/**
+	 * The number of structural features of the '<em>Monitoring</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORING_FEATURE_COUNT = 3;
+
+	/**
+	 * The number of operations of the '<em>Monitoring</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORING_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoredResourceImpl <em>Monitored Resource</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoredResourceImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getMonitoredResource()
+	 * @generated
+	 */
+	int MONITORED_RESOURCE = 4;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORED_RESOURCE__NAME = 0;
+
+	/**
+	 * The feature id for the '<em><b>Period</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORED_RESOURCE__PERIOD = 1;
+
+	/**
+	 * The feature id for the '<em><b>Executiontime</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORED_RESOURCE__EXECUTIONTIME = 2;
+
+	/**
+	 * The feature id for the '<em><b>Blockingtime</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORED_RESOURCE__BLOCKINGTIME = 3;
+
+	/**
+	 * The feature id for the '<em><b>Responsetime</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORED_RESOURCE__RESPONSETIME = 4;
+
+	/**
+	 * The number of structural features of the '<em>Monitored Resource</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORED_RESOURCE_FEATURE_COUNT = 5;
+
+	/**
+	 * The number of operations of the '<em>Monitored Resource</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MONITORED_RESOURCE_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.ThreadImpl <em>Thread</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.ThreadImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getThread()
+	 * @generated
+	 */
+	int THREAD = 1;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int THREAD__NAME = MONITORED_RESOURCE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Period</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int THREAD__PERIOD = MONITORED_RESOURCE__PERIOD;
+
+	/**
+	 * The feature id for the '<em><b>Executiontime</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int THREAD__EXECUTIONTIME = MONITORED_RESOURCE__EXECUTIONTIME;
+
+	/**
+	 * The feature id for the '<em><b>Blockingtime</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int THREAD__BLOCKINGTIME = MONITORED_RESOURCE__BLOCKINGTIME;
+
+	/**
+	 * The feature id for the '<em><b>Responsetime</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int THREAD__RESPONSETIME = MONITORED_RESOURCE__RESPONSETIME;
+
+	/**
+	 * The number of structural features of the '<em>Thread</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int THREAD_FEATURE_COUNT = MONITORED_RESOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Thread</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int THREAD_OPERATION_COUNT = MONITORED_RESOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.ResourceImpl <em>Resource</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.ResourceImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getResource()
+	 * @generated
+	 */
+	int RESOURCE = 2;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESOURCE__NAME = MONITORED_RESOURCE__NAME;
+
+	/**
+	 * The feature id for the '<em><b>Period</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESOURCE__PERIOD = MONITORED_RESOURCE__PERIOD;
+
+	/**
+	 * The feature id for the '<em><b>Executiontime</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESOURCE__EXECUTIONTIME = MONITORED_RESOURCE__EXECUTIONTIME;
+
+	/**
+	 * The feature id for the '<em><b>Blockingtime</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESOURCE__BLOCKINGTIME = MONITORED_RESOURCE__BLOCKINGTIME;
+
+	/**
+	 * The feature id for the '<em><b>Responsetime</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESOURCE__RESPONSETIME = MONITORED_RESOURCE__RESPONSETIME;
+
+	/**
+	 * The number of structural features of the '<em>Resource</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESOURCE_FEATURE_COUNT = MONITORED_RESOURCE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of operations of the '<em>Resource</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESOURCE_OPERATION_COUNT = MONITORED_RESOURCE_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.PeriodImpl <em>Period</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.PeriodImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getPeriod()
+	 * @generated
+	 */
+	int PERIOD = 3;
+
+	/**
+	 * The feature id for the '<em><b>Monitoredresource</b></em>' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PERIOD__MONITOREDRESOURCE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Minimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PERIOD__MINIMUM = 1;
+
+	/**
+	 * The feature id for the '<em><b>Maximum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PERIOD__MAXIMUM = 2;
+
+	/**
+	 * The feature id for the '<em><b>Average</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PERIOD__AVERAGE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Jitter</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PERIOD__JITTER = 4;
+
+	/**
+	 * The number of structural features of the '<em>Period</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PERIOD_FEATURE_COUNT = 5;
+
+	/**
+	 * The number of operations of the '<em>Period</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PERIOD_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.ExecutionTimeImpl <em>Execution Time</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.ExecutionTimeImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getExecutionTime()
+	 * @generated
+	 */
+	int EXECUTION_TIME = 5;
+
+	/**
+	 * The feature id for the '<em><b>Monitoredresource</b></em>' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXECUTION_TIME__MONITOREDRESOURCE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Minimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXECUTION_TIME__MINIMUM = 1;
+
+	/**
+	 * The feature id for the '<em><b>Maximum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXECUTION_TIME__MAXIMUM = 2;
+
+	/**
+	 * The feature id for the '<em><b>Average</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXECUTION_TIME__AVERAGE = 3;
+
+	/**
+	 * The number of structural features of the '<em>Execution Time</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXECUTION_TIME_FEATURE_COUNT = 4;
+
+	/**
+	 * The number of operations of the '<em>Execution Time</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int EXECUTION_TIME_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.BlockingTimeImpl <em>Blocking Time</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.BlockingTimeImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getBlockingTime()
+	 * @generated
+	 */
+	int BLOCKING_TIME = 6;
+
+	/**
+	 * The feature id for the '<em><b>Monitoredresource</b></em>' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCKING_TIME__MONITOREDRESOURCE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Minimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCKING_TIME__MINIMUM = 1;
+
+	/**
+	 * The feature id for the '<em><b>Maximum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCKING_TIME__MAXIMUM = 2;
+
+	/**
+	 * The feature id for the '<em><b>Average</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCKING_TIME__AVERAGE = 3;
+
+	/**
+	 * The number of structural features of the '<em>Blocking Time</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCKING_TIME_FEATURE_COUNT = 4;
+
+	/**
+	 * The number of operations of the '<em>Blocking Time</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BLOCKING_TIME_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.ResponseTimeImpl <em>Response Time</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.ResponseTimeImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getResponseTime()
+	 * @generated
+	 */
+	int RESPONSE_TIME = 7;
+
+	/**
+	 * The feature id for the '<em><b>Monitoredresource</b></em>' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSE_TIME__MONITOREDRESOURCE = 0;
+
+	/**
+	 * The feature id for the '<em><b>Minimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSE_TIME__MINIMUM = 1;
+
+	/**
+	 * The feature id for the '<em><b>Maximum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSE_TIME__MAXIMUM = 2;
+
+	/**
+	 * The feature id for the '<em><b>Average</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSE_TIME__AVERAGE = 3;
+
+	/**
+	 * The feature id for the '<em><b>Jitter</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSE_TIME__JITTER = 4;
+
+	/**
+	 * The number of structural features of the '<em>Response Time</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSE_TIME_FEATURE_COUNT = 5;
+
+	/**
+	 * The number of operations of the '<em>Response Time</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int RESPONSE_TIME_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.AnalysisContextImpl <em>Analysis Context</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.AnalysisContextImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getAnalysisContext()
+	 * @generated
+	 */
+	int ANALYSIS_CONTEXT = 8;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ANALYSIS_CONTEXT__NAME = 0;
+
+	/**
+	 * The number of structural features of the '<em>Analysis Context</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ANALYSIS_CONTEXT_FEATURE_COUNT = 1;
+
+	/**
+	 * The number of operations of the '<em>Analysis Context</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int ANALYSIS_CONTEXT_OPERATION_COUNT = 0;
+
+	/**
+	 * The meta object id for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.MeasuredValueImpl <em>Measured Value</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MeasuredValueImpl
+	 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getMeasuredValue()
+	 * @generated
+	 */
+	int MEASURED_VALUE = 9;
+
+	/**
+	 * The feature id for the '<em><b>Unit</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MEASURED_VALUE__UNIT = 0;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MEASURED_VALUE__VALUE = 1;
+
+	/**
+	 * The number of structural features of the '<em>Measured Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MEASURED_VALUE_FEATURE_COUNT = 2;
+
+	/**
+	 * The number of operations of the '<em>Measured Value</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MEASURED_VALUE_OPERATION_COUNT = 0;
+
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.Monitoring <em>Monitoring</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Monitoring</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Monitoring
+	 * @generated
+	 */
+	EClass getMonitoring();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.polarsys.chess.monitoring.monitoringxml.Monitoring#getThreadNames <em>Thread Names</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Thread Names</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Monitoring#getThreadNames()
+	 * @see #getMonitoring()
+	 * @generated
+	 */
+	EReference getMonitoring_ThreadNames();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.polarsys.chess.monitoring.monitoringxml.Monitoring#getSharedResources <em>Shared Resources</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Shared Resources</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Monitoring#getSharedResources()
+	 * @see #getMonitoring()
+	 * @generated
+	 */
+	EReference getMonitoring_SharedResources();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.Monitoring#getAnalysisContext <em>Analysis Context</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Analysis Context</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Monitoring#getAnalysisContext()
+	 * @see #getMonitoring()
+	 * @generated
+	 */
+	EReference getMonitoring_AnalysisContext();
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.Thread <em>Thread</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Thread</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Thread
+	 * @generated
+	 */
+	EClass getThread();
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.Resource <em>Resource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Resource</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Resource
+	 * @generated
+	 */
+	EClass getResource();
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.Period <em>Period</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Period</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Period
+	 * @generated
+	 */
+	EClass getPeriod();
+
+	/**
+	 * Returns the meta object for the container reference '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMonitoredresource <em>Monitoredresource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the container reference '<em>Monitoredresource</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Period#getMonitoredresource()
+	 * @see #getPeriod()
+	 * @generated
+	 */
+	EReference getPeriod_Monitoredresource();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMinimum <em>Minimum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Minimum</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Period#getMinimum()
+	 * @see #getPeriod()
+	 * @generated
+	 */
+	EReference getPeriod_Minimum();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMaximum <em>Maximum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Maximum</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Period#getMaximum()
+	 * @see #getPeriod()
+	 * @generated
+	 */
+	EReference getPeriod_Maximum();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getAverage <em>Average</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Average</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Period#getAverage()
+	 * @see #getPeriod()
+	 * @generated
+	 */
+	EReference getPeriod_Average();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getJitter <em>Jitter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Jitter</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Period#getJitter()
+	 * @see #getPeriod()
+	 * @generated
+	 */
+	EReference getPeriod_Jitter();
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource <em>Monitored Resource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Monitored Resource</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource
+	 * @generated
+	 */
+	EClass getMonitoredResource();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getName()
+	 * @see #getMonitoredResource()
+	 * @generated
+	 */
+	EAttribute getMonitoredResource_Name();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getPeriod <em>Period</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Period</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getPeriod()
+	 * @see #getMonitoredResource()
+	 * @generated
+	 */
+	EReference getMonitoredResource_Period();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getExecutiontime <em>Executiontime</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Executiontime</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getExecutiontime()
+	 * @see #getMonitoredResource()
+	 * @generated
+	 */
+	EReference getMonitoredResource_Executiontime();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getBlockingtime <em>Blockingtime</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Blockingtime</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getBlockingtime()
+	 * @see #getMonitoredResource()
+	 * @generated
+	 */
+	EReference getMonitoredResource_Blockingtime();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getResponsetime <em>Responsetime</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Responsetime</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getResponsetime()
+	 * @see #getMonitoredResource()
+	 * @generated
+	 */
+	EReference getMonitoredResource_Responsetime();
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime <em>Execution Time</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Execution Time</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ExecutionTime
+	 * @generated
+	 */
+	EClass getExecutionTime();
+
+	/**
+	 * Returns the meta object for the container reference '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMonitoredresource <em>Monitoredresource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the container reference '<em>Monitoredresource</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMonitoredresource()
+	 * @see #getExecutionTime()
+	 * @generated
+	 */
+	EReference getExecutionTime_Monitoredresource();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMinimum <em>Minimum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Minimum</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMinimum()
+	 * @see #getExecutionTime()
+	 * @generated
+	 */
+	EReference getExecutionTime_Minimum();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMaximum <em>Maximum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Maximum</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getMaximum()
+	 * @see #getExecutionTime()
+	 * @generated
+	 */
+	EReference getExecutionTime_Maximum();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getAverage <em>Average</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Average</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ExecutionTime#getAverage()
+	 * @see #getExecutionTime()
+	 * @generated
+	 */
+	EReference getExecutionTime_Average();
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime <em>Blocking Time</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Blocking Time</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.BlockingTime
+	 * @generated
+	 */
+	EClass getBlockingTime();
+
+	/**
+	 * Returns the meta object for the container reference '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMonitoredresource <em>Monitoredresource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the container reference '<em>Monitoredresource</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMonitoredresource()
+	 * @see #getBlockingTime()
+	 * @generated
+	 */
+	EReference getBlockingTime_Monitoredresource();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMinimum <em>Minimum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Minimum</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMinimum()
+	 * @see #getBlockingTime()
+	 * @generated
+	 */
+	EReference getBlockingTime_Minimum();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMaximum <em>Maximum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Maximum</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getMaximum()
+	 * @see #getBlockingTime()
+	 * @generated
+	 */
+	EReference getBlockingTime_Maximum();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getAverage <em>Average</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Average</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.BlockingTime#getAverage()
+	 * @see #getBlockingTime()
+	 * @generated
+	 */
+	EReference getBlockingTime_Average();
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime <em>Response Time</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Response Time</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ResponseTime
+	 * @generated
+	 */
+	EClass getResponseTime();
+
+	/**
+	 * Returns the meta object for the container reference '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMonitoredresource <em>Monitoredresource</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the container reference '<em>Monitoredresource</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMonitoredresource()
+	 * @see #getResponseTime()
+	 * @generated
+	 */
+	EReference getResponseTime_Monitoredresource();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMinimum <em>Minimum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Minimum</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMinimum()
+	 * @see #getResponseTime()
+	 * @generated
+	 */
+	EReference getResponseTime_Minimum();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMaximum <em>Maximum</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Maximum</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMaximum()
+	 * @see #getResponseTime()
+	 * @generated
+	 */
+	EReference getResponseTime_Maximum();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getAverage <em>Average</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Average</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getAverage()
+	 * @see #getResponseTime()
+	 * @generated
+	 */
+	EReference getResponseTime_Average();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getJitter <em>Jitter</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Jitter</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getJitter()
+	 * @see #getResponseTime()
+	 * @generated
+	 */
+	EReference getResponseTime_Jitter();
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.AnalysisContext <em>Analysis Context</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Analysis Context</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.AnalysisContext
+	 * @generated
+	 */
+	EClass getAnalysisContext();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.polarsys.chess.monitoring.monitoringxml.AnalysisContext#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.AnalysisContext#getName()
+	 * @see #getAnalysisContext()
+	 * @generated
+	 */
+	EAttribute getAnalysisContext_Name();
+
+	/**
+	 * Returns the meta object for class '{@link org.polarsys.chess.monitoring.monitoringxml.MeasuredValue <em>Measured Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Measured Value</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MeasuredValue
+	 * @generated
+	 */
+	EClass getMeasuredValue();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.polarsys.chess.monitoring.monitoringxml.MeasuredValue#getUnit <em>Unit</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Unit</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MeasuredValue#getUnit()
+	 * @see #getMeasuredValue()
+	 * @generated
+	 */
+	EAttribute getMeasuredValue_Unit();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.polarsys.chess.monitoring.monitoringxml.MeasuredValue#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MeasuredValue#getValue()
+	 * @see #getMeasuredValue()
+	 * @generated
+	 */
+	EAttribute getMeasuredValue_Value();
+
+	/**
+	 * Returns the factory that creates the instances of the model.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the factory that creates the instances of the model.
+	 * @generated
+	 */
+	MonitoringxmlFactory getMonitoringxmlFactory();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * Defines literals for the meta objects that represent
+	 * <ul>
+	 *   <li>each class,</li>
+	 *   <li>each feature of each class,</li>
+	 *   <li>each operation of each class,</li>
+	 *   <li>each enum,</li>
+	 *   <li>and each data type</li>
+	 * </ul>
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	interface Literals {
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringImpl <em>Monitoring</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getMonitoring()
+		 * @generated
+		 */
+		EClass MONITORING = eINSTANCE.getMonitoring();
+
+		/**
+		 * The meta object literal for the '<em><b>Thread Names</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MONITORING__THREAD_NAMES = eINSTANCE.getMonitoring_ThreadNames();
+
+		/**
+		 * The meta object literal for the '<em><b>Shared Resources</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MONITORING__SHARED_RESOURCES = eINSTANCE.getMonitoring_SharedResources();
+
+		/**
+		 * The meta object literal for the '<em><b>Analysis Context</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MONITORING__ANALYSIS_CONTEXT = eINSTANCE.getMonitoring_AnalysisContext();
+
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.ThreadImpl <em>Thread</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.ThreadImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getThread()
+		 * @generated
+		 */
+		EClass THREAD = eINSTANCE.getThread();
+
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.ResourceImpl <em>Resource</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.ResourceImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getResource()
+		 * @generated
+		 */
+		EClass RESOURCE = eINSTANCE.getResource();
+
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.PeriodImpl <em>Period</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.PeriodImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getPeriod()
+		 * @generated
+		 */
+		EClass PERIOD = eINSTANCE.getPeriod();
+
+		/**
+		 * The meta object literal for the '<em><b>Monitoredresource</b></em>' container reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PERIOD__MONITOREDRESOURCE = eINSTANCE.getPeriod_Monitoredresource();
+
+		/**
+		 * The meta object literal for the '<em><b>Minimum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PERIOD__MINIMUM = eINSTANCE.getPeriod_Minimum();
+
+		/**
+		 * The meta object literal for the '<em><b>Maximum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PERIOD__MAXIMUM = eINSTANCE.getPeriod_Maximum();
+
+		/**
+		 * The meta object literal for the '<em><b>Average</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PERIOD__AVERAGE = eINSTANCE.getPeriod_Average();
+
+		/**
+		 * The meta object literal for the '<em><b>Jitter</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference PERIOD__JITTER = eINSTANCE.getPeriod_Jitter();
+
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoredResourceImpl <em>Monitored Resource</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoredResourceImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getMonitoredResource()
+		 * @generated
+		 */
+		EClass MONITORED_RESOURCE = eINSTANCE.getMonitoredResource();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MONITORED_RESOURCE__NAME = eINSTANCE.getMonitoredResource_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Period</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MONITORED_RESOURCE__PERIOD = eINSTANCE.getMonitoredResource_Period();
+
+		/**
+		 * The meta object literal for the '<em><b>Executiontime</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MONITORED_RESOURCE__EXECUTIONTIME = eINSTANCE.getMonitoredResource_Executiontime();
+
+		/**
+		 * The meta object literal for the '<em><b>Blockingtime</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MONITORED_RESOURCE__BLOCKINGTIME = eINSTANCE.getMonitoredResource_Blockingtime();
+
+		/**
+		 * The meta object literal for the '<em><b>Responsetime</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference MONITORED_RESOURCE__RESPONSETIME = eINSTANCE.getMonitoredResource_Responsetime();
+
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.ExecutionTimeImpl <em>Execution Time</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.ExecutionTimeImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getExecutionTime()
+		 * @generated
+		 */
+		EClass EXECUTION_TIME = eINSTANCE.getExecutionTime();
+
+		/**
+		 * The meta object literal for the '<em><b>Monitoredresource</b></em>' container reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXECUTION_TIME__MONITOREDRESOURCE = eINSTANCE.getExecutionTime_Monitoredresource();
+
+		/**
+		 * The meta object literal for the '<em><b>Minimum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXECUTION_TIME__MINIMUM = eINSTANCE.getExecutionTime_Minimum();
+
+		/**
+		 * The meta object literal for the '<em><b>Maximum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXECUTION_TIME__MAXIMUM = eINSTANCE.getExecutionTime_Maximum();
+
+		/**
+		 * The meta object literal for the '<em><b>Average</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference EXECUTION_TIME__AVERAGE = eINSTANCE.getExecutionTime_Average();
+
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.BlockingTimeImpl <em>Blocking Time</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.BlockingTimeImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getBlockingTime()
+		 * @generated
+		 */
+		EClass BLOCKING_TIME = eINSTANCE.getBlockingTime();
+
+		/**
+		 * The meta object literal for the '<em><b>Monitoredresource</b></em>' container reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BLOCKING_TIME__MONITOREDRESOURCE = eINSTANCE.getBlockingTime_Monitoredresource();
+
+		/**
+		 * The meta object literal for the '<em><b>Minimum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BLOCKING_TIME__MINIMUM = eINSTANCE.getBlockingTime_Minimum();
+
+		/**
+		 * The meta object literal for the '<em><b>Maximum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BLOCKING_TIME__MAXIMUM = eINSTANCE.getBlockingTime_Maximum();
+
+		/**
+		 * The meta object literal for the '<em><b>Average</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BLOCKING_TIME__AVERAGE = eINSTANCE.getBlockingTime_Average();
+
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.ResponseTimeImpl <em>Response Time</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.ResponseTimeImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getResponseTime()
+		 * @generated
+		 */
+		EClass RESPONSE_TIME = eINSTANCE.getResponseTime();
+
+		/**
+		 * The meta object literal for the '<em><b>Monitoredresource</b></em>' container reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RESPONSE_TIME__MONITOREDRESOURCE = eINSTANCE.getResponseTime_Monitoredresource();
+
+		/**
+		 * The meta object literal for the '<em><b>Minimum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RESPONSE_TIME__MINIMUM = eINSTANCE.getResponseTime_Minimum();
+
+		/**
+		 * The meta object literal for the '<em><b>Maximum</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RESPONSE_TIME__MAXIMUM = eINSTANCE.getResponseTime_Maximum();
+
+		/**
+		 * The meta object literal for the '<em><b>Average</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RESPONSE_TIME__AVERAGE = eINSTANCE.getResponseTime_Average();
+
+		/**
+		 * The meta object literal for the '<em><b>Jitter</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference RESPONSE_TIME__JITTER = eINSTANCE.getResponseTime_Jitter();
+
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.AnalysisContextImpl <em>Analysis Context</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.AnalysisContextImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getAnalysisContext()
+		 * @generated
+		 */
+		EClass ANALYSIS_CONTEXT = eINSTANCE.getAnalysisContext();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute ANALYSIS_CONTEXT__NAME = eINSTANCE.getAnalysisContext_Name();
+
+		/**
+		 * The meta object literal for the '{@link org.polarsys.chess.monitoring.monitoringxml.impl.MeasuredValueImpl <em>Measured Value</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MeasuredValueImpl
+		 * @see org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringxmlPackageImpl#getMeasuredValue()
+		 * @generated
+		 */
+		EClass MEASURED_VALUE = eINSTANCE.getMeasuredValue();
+
+		/**
+		 * The meta object literal for the '<em><b>Unit</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MEASURED_VALUE__UNIT = eINSTANCE.getMeasuredValue_Unit();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute MEASURED_VALUE__VALUE = eINSTANCE.getMeasuredValue_Value();
+
+	}
+
+} //MonitoringxmlPackage
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Period.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Period.java
new file mode 100644
index 0000000..2cd3cbc
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Period.java
@@ -0,0 +1,173 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Period</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMonitoredresource <em>Monitoredresource</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMinimum <em>Minimum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMaximum <em>Maximum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.Period#getAverage <em>Average</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.Period#getJitter <em>Jitter</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getPeriod()
+ * @model
+ * @generated
+ */
+public interface Period extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Monitoredresource</b></em>' container reference.
+	 * It is bidirectional and its opposite is '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getPeriod <em>Period</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Monitoredresource</em>' container reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Monitoredresource</em>' container reference.
+	 * @see #setMonitoredresource(MonitoredResource)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getPeriod_Monitoredresource()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getPeriod
+	 * @model opposite="period" transient="false"
+	 * @generated
+	 */
+	MonitoredResource getMonitoredresource();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMonitoredresource <em>Monitoredresource</em>}' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Monitoredresource</em>' container reference.
+	 * @see #getMonitoredresource()
+	 * @generated
+	 */
+	void setMonitoredresource(MonitoredResource value);
+
+	/**
+	 * Returns the value of the '<em><b>Minimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Minimum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Minimum</em>' containment reference.
+	 * @see #setMinimum(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getPeriod_Minimum()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getMinimum();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMinimum <em>Minimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Minimum</em>' containment reference.
+	 * @see #getMinimum()
+	 * @generated
+	 */
+	void setMinimum(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Maximum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Maximum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Maximum</em>' containment reference.
+	 * @see #setMaximum(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getPeriod_Maximum()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getMaximum();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getMaximum <em>Maximum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Maximum</em>' containment reference.
+	 * @see #getMaximum()
+	 * @generated
+	 */
+	void setMaximum(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Average</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Average</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Average</em>' containment reference.
+	 * @see #setAverage(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getPeriod_Average()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getAverage();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getAverage <em>Average</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Average</em>' containment reference.
+	 * @see #getAverage()
+	 * @generated
+	 */
+	void setAverage(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Jitter</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Jitter</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Jitter</em>' containment reference.
+	 * @see #setJitter(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getPeriod_Jitter()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getJitter();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.Period#getJitter <em>Jitter</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Jitter</em>' containment reference.
+	 * @see #getJitter()
+	 * @generated
+	 */
+	void setJitter(MeasuredValue value);
+
+} // Period
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/Resource.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Resource.java
similarity index 89%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/Resource.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Resource.java
index 8149228..4d1dce0 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/Resource.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Resource.java
@@ -13,7 +13,7 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml;
+package org.polarsys.chess.monitoring.monitoringxml;
 
 
 /**
@@ -22,7 +22,7 @@
  * <!-- end-user-doc -->
  *
  *
- * @see monitoringxml.MonitoringPackage#getResource()
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getResource()
  * @model
  * @generated
  */
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/ResponseTime.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/ResponseTime.java
new file mode 100644
index 0000000..9ebcf17
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/ResponseTime.java
@@ -0,0 +1,173 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml;
+
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Response Time</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMonitoredresource <em>Monitoredresource</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMinimum <em>Minimum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMaximum <em>Maximum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getAverage <em>Average</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getJitter <em>Jitter</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getResponseTime()
+ * @model
+ * @generated
+ */
+public interface ResponseTime extends EObject {
+	/**
+	 * Returns the value of the '<em><b>Monitoredresource</b></em>' container reference.
+	 * It is bidirectional and its opposite is '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getResponsetime <em>Responsetime</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Monitoredresource</em>' container reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Monitoredresource</em>' container reference.
+	 * @see #setMonitoredresource(MonitoredResource)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getResponseTime_Monitoredresource()
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource#getResponsetime
+	 * @model opposite="responsetime" transient="false"
+	 * @generated
+	 */
+	MonitoredResource getMonitoredresource();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMonitoredresource <em>Monitoredresource</em>}' container reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Monitoredresource</em>' container reference.
+	 * @see #getMonitoredresource()
+	 * @generated
+	 */
+	void setMonitoredresource(MonitoredResource value);
+
+	/**
+	 * Returns the value of the '<em><b>Minimum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Minimum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Minimum</em>' containment reference.
+	 * @see #setMinimum(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getResponseTime_Minimum()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getMinimum();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMinimum <em>Minimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Minimum</em>' containment reference.
+	 * @see #getMinimum()
+	 * @generated
+	 */
+	void setMinimum(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Maximum</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Maximum</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Maximum</em>' containment reference.
+	 * @see #setMaximum(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getResponseTime_Maximum()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getMaximum();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getMaximum <em>Maximum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Maximum</em>' containment reference.
+	 * @see #getMaximum()
+	 * @generated
+	 */
+	void setMaximum(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Average</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Average</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Average</em>' containment reference.
+	 * @see #setAverage(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getResponseTime_Average()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getAverage();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getAverage <em>Average</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Average</em>' containment reference.
+	 * @see #getAverage()
+	 * @generated
+	 */
+	void setAverage(MeasuredValue value);
+
+	/**
+	 * Returns the value of the '<em><b>Jitter</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Jitter</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Jitter</em>' containment reference.
+	 * @see #setJitter(MeasuredValue)
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getResponseTime_Jitter()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MeasuredValue getJitter();
+
+	/**
+	 * Sets the value of the '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime#getJitter <em>Jitter</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Jitter</em>' containment reference.
+	 * @see #getJitter()
+	 * @generated
+	 */
+	void setJitter(MeasuredValue value);
+
+} // ResponseTime
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/Thread.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Thread.java
similarity index 89%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/Thread.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Thread.java
index fff6c5c..c7eea79 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/Thread.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/Thread.java
@@ -13,7 +13,7 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml;
+package org.polarsys.chess.monitoring.monitoringxml;
 
 
 /**
@@ -22,7 +22,7 @@
  * <!-- end-user-doc -->
  *
  *
- * @see monitoringxml.MonitoringPackage#getThread()
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#getThread()
  * @model
  * @generated
  */
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/AnalysisContextImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/AnalysisContextImpl.java
similarity index 85%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/AnalysisContextImpl.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/AnalysisContextImpl.java
index 0afe3a7..84ba3a1 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/AnalysisContextImpl.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/AnalysisContextImpl.java
@@ -13,17 +13,14 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml.impl;
-
-import monitoringxml.AnalysisContext;
-import monitoringxml.MonitoringPackage;
+package org.polarsys.chess.monitoring.monitoringxml.impl;
 
 import org.eclipse.emf.common.notify.Notification;
-
 import org.eclipse.emf.ecore.EClass;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.polarsys.chess.monitoring.monitoringxml.AnalysisContext;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
 
 /**
  * <!-- begin-user-doc -->
@@ -31,10 +28,10 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
- * </p>
  * <ul>
- *   <li>{@link monitoringxml.impl.AnalysisContextImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.AnalysisContextImpl#getName <em>Name</em>}</li>
  * </ul>
+ * </p>
  *
  * @generated
  */
@@ -75,7 +72,7 @@
 	 */
 	@Override
 	protected EClass eStaticClass() {
-		return MonitoringPackage.Literals.ANALYSIS_CONTEXT;
+		return MonitoringxmlPackage.Literals.ANALYSIS_CONTEXT;
 	}
 
 	/**
@@ -96,7 +93,7 @@
 		String oldName = name;
 		name = newName;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.ANALYSIS_CONTEXT__NAME, oldName, name));
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.ANALYSIS_CONTEXT__NAME, oldName, name));
 	}
 
 	/**
@@ -107,7 +104,7 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case MonitoringPackage.ANALYSIS_CONTEXT__NAME:
+			case MonitoringxmlPackage.ANALYSIS_CONTEXT__NAME:
 				return getName();
 		}
 		return super.eGet(featureID, resolve, coreType);
@@ -121,7 +118,7 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case MonitoringPackage.ANALYSIS_CONTEXT__NAME:
+			case MonitoringxmlPackage.ANALYSIS_CONTEXT__NAME:
 				setName((String)newValue);
 				return;
 		}
@@ -136,7 +133,7 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case MonitoringPackage.ANALYSIS_CONTEXT__NAME:
+			case MonitoringxmlPackage.ANALYSIS_CONTEXT__NAME:
 				setName(NAME_EDEFAULT);
 				return;
 		}
@@ -151,7 +148,7 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case MonitoringPackage.ANALYSIS_CONTEXT__NAME:
+			case MonitoringxmlPackage.ANALYSIS_CONTEXT__NAME:
 				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
 		}
 		return super.eIsSet(featureID);
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/BlockingTimeImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/BlockingTimeImpl.java
new file mode 100644
index 0000000..67f469f
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/BlockingTimeImpl.java
@@ -0,0 +1,404 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.polarsys.chess.monitoring.monitoringxml.BlockingTime;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoredResource;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Blocking Time</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.BlockingTimeImpl#getMonitoredresource <em>Monitoredresource</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.BlockingTimeImpl#getMinimum <em>Minimum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.BlockingTimeImpl#getMaximum <em>Maximum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.BlockingTimeImpl#getAverage <em>Average</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class BlockingTimeImpl extends MinimalEObjectImpl.Container implements BlockingTime {
+	/**
+	 * The cached value of the '{@link #getMinimum() <em>Minimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMinimum()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue minimum;
+
+	/**
+	 * The cached value of the '{@link #getMaximum() <em>Maximum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMaximum()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue maximum;
+
+	/**
+	 * The cached value of the '{@link #getAverage() <em>Average</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAverage()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue average;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BlockingTimeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return MonitoringxmlPackage.Literals.BLOCKING_TIME;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MonitoredResource getMonitoredresource() {
+		if (eContainerFeatureID() != MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE) return null;
+		return (MonitoredResource)eInternalContainer();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMonitoredresource(MonitoredResource newMonitoredresource, NotificationChain msgs) {
+		msgs = eBasicSetContainer((InternalEObject)newMonitoredresource, MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE, msgs);
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMonitoredresource(MonitoredResource newMonitoredresource) {
+		if (newMonitoredresource != eInternalContainer() || (eContainerFeatureID() != MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE && newMonitoredresource != null)) {
+			if (EcoreUtil.isAncestor(this, newMonitoredresource))
+				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
+			NotificationChain msgs = null;
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			if (newMonitoredresource != null)
+				msgs = ((InternalEObject)newMonitoredresource).eInverseAdd(this, MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME, MonitoredResource.class, msgs);
+			msgs = basicSetMonitoredresource(newMonitoredresource, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE, newMonitoredresource, newMonitoredresource));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getMinimum() {
+		return minimum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMinimum(MeasuredValue newMinimum, NotificationChain msgs) {
+		MeasuredValue oldMinimum = minimum;
+		minimum = newMinimum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.BLOCKING_TIME__MINIMUM, oldMinimum, newMinimum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMinimum(MeasuredValue newMinimum) {
+		if (newMinimum != minimum) {
+			NotificationChain msgs = null;
+			if (minimum != null)
+				msgs = ((InternalEObject)minimum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.BLOCKING_TIME__MINIMUM, null, msgs);
+			if (newMinimum != null)
+				msgs = ((InternalEObject)newMinimum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.BLOCKING_TIME__MINIMUM, null, msgs);
+			msgs = basicSetMinimum(newMinimum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.BLOCKING_TIME__MINIMUM, newMinimum, newMinimum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getMaximum() {
+		return maximum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMaximum(MeasuredValue newMaximum, NotificationChain msgs) {
+		MeasuredValue oldMaximum = maximum;
+		maximum = newMaximum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.BLOCKING_TIME__MAXIMUM, oldMaximum, newMaximum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMaximum(MeasuredValue newMaximum) {
+		if (newMaximum != maximum) {
+			NotificationChain msgs = null;
+			if (maximum != null)
+				msgs = ((InternalEObject)maximum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.BLOCKING_TIME__MAXIMUM, null, msgs);
+			if (newMaximum != null)
+				msgs = ((InternalEObject)newMaximum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.BLOCKING_TIME__MAXIMUM, null, msgs);
+			msgs = basicSetMaximum(newMaximum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.BLOCKING_TIME__MAXIMUM, newMaximum, newMaximum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getAverage() {
+		return average;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetAverage(MeasuredValue newAverage, NotificationChain msgs) {
+		MeasuredValue oldAverage = average;
+		average = newAverage;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.BLOCKING_TIME__AVERAGE, oldAverage, newAverage);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAverage(MeasuredValue newAverage) {
+		if (newAverage != average) {
+			NotificationChain msgs = null;
+			if (average != null)
+				msgs = ((InternalEObject)average).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.BLOCKING_TIME__AVERAGE, null, msgs);
+			if (newAverage != null)
+				msgs = ((InternalEObject)newAverage).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.BLOCKING_TIME__AVERAGE, null, msgs);
+			msgs = basicSetAverage(newAverage, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.BLOCKING_TIME__AVERAGE, newAverage, newAverage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE:
+				if (eInternalContainer() != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+				return basicSetMonitoredresource((MonitoredResource)otherEnd, msgs);
+		}
+		return super.eInverseAdd(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE:
+				return basicSetMonitoredresource(null, msgs);
+			case MonitoringxmlPackage.BLOCKING_TIME__MINIMUM:
+				return basicSetMinimum(null, msgs);
+			case MonitoringxmlPackage.BLOCKING_TIME__MAXIMUM:
+				return basicSetMaximum(null, msgs);
+			case MonitoringxmlPackage.BLOCKING_TIME__AVERAGE:
+				return basicSetAverage(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+		switch (eContainerFeatureID()) {
+			case MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE:
+				return eInternalContainer().eInverseRemove(this, MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME, MonitoredResource.class, msgs);
+		}
+		return super.eBasicRemoveFromContainerFeature(msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE:
+				return getMonitoredresource();
+			case MonitoringxmlPackage.BLOCKING_TIME__MINIMUM:
+				return getMinimum();
+			case MonitoringxmlPackage.BLOCKING_TIME__MAXIMUM:
+				return getMaximum();
+			case MonitoringxmlPackage.BLOCKING_TIME__AVERAGE:
+				return getAverage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE:
+				setMonitoredresource((MonitoredResource)newValue);
+				return;
+			case MonitoringxmlPackage.BLOCKING_TIME__MINIMUM:
+				setMinimum((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.BLOCKING_TIME__MAXIMUM:
+				setMaximum((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.BLOCKING_TIME__AVERAGE:
+				setAverage((MeasuredValue)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE:
+				setMonitoredresource((MonitoredResource)null);
+				return;
+			case MonitoringxmlPackage.BLOCKING_TIME__MINIMUM:
+				setMinimum((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.BLOCKING_TIME__MAXIMUM:
+				setMaximum((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.BLOCKING_TIME__AVERAGE:
+				setAverage((MeasuredValue)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE:
+				return getMonitoredresource() != null;
+			case MonitoringxmlPackage.BLOCKING_TIME__MINIMUM:
+				return minimum != null;
+			case MonitoringxmlPackage.BLOCKING_TIME__MAXIMUM:
+				return maximum != null;
+			case MonitoringxmlPackage.BLOCKING_TIME__AVERAGE:
+				return average != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //BlockingTimeImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ExecutionTimeImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ExecutionTimeImpl.java
new file mode 100644
index 0000000..2d0ffbb
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ExecutionTimeImpl.java
@@ -0,0 +1,404 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.polarsys.chess.monitoring.monitoringxml.ExecutionTime;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoredResource;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Execution Time</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.ExecutionTimeImpl#getMonitoredresource <em>Monitoredresource</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.ExecutionTimeImpl#getMinimum <em>Minimum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.ExecutionTimeImpl#getMaximum <em>Maximum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.ExecutionTimeImpl#getAverage <em>Average</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ExecutionTimeImpl extends MinimalEObjectImpl.Container implements ExecutionTime {
+	/**
+	 * The cached value of the '{@link #getMinimum() <em>Minimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMinimum()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue minimum;
+
+	/**
+	 * The cached value of the '{@link #getMaximum() <em>Maximum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMaximum()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue maximum;
+
+	/**
+	 * The cached value of the '{@link #getAverage() <em>Average</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAverage()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue average;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ExecutionTimeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return MonitoringxmlPackage.Literals.EXECUTION_TIME;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MonitoredResource getMonitoredresource() {
+		if (eContainerFeatureID() != MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE) return null;
+		return (MonitoredResource)eInternalContainer();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMonitoredresource(MonitoredResource newMonitoredresource, NotificationChain msgs) {
+		msgs = eBasicSetContainer((InternalEObject)newMonitoredresource, MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE, msgs);
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMonitoredresource(MonitoredResource newMonitoredresource) {
+		if (newMonitoredresource != eInternalContainer() || (eContainerFeatureID() != MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE && newMonitoredresource != null)) {
+			if (EcoreUtil.isAncestor(this, newMonitoredresource))
+				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
+			NotificationChain msgs = null;
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			if (newMonitoredresource != null)
+				msgs = ((InternalEObject)newMonitoredresource).eInverseAdd(this, MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME, MonitoredResource.class, msgs);
+			msgs = basicSetMonitoredresource(newMonitoredresource, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE, newMonitoredresource, newMonitoredresource));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getMinimum() {
+		return minimum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMinimum(MeasuredValue newMinimum, NotificationChain msgs) {
+		MeasuredValue oldMinimum = minimum;
+		minimum = newMinimum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.EXECUTION_TIME__MINIMUM, oldMinimum, newMinimum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMinimum(MeasuredValue newMinimum) {
+		if (newMinimum != minimum) {
+			NotificationChain msgs = null;
+			if (minimum != null)
+				msgs = ((InternalEObject)minimum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.EXECUTION_TIME__MINIMUM, null, msgs);
+			if (newMinimum != null)
+				msgs = ((InternalEObject)newMinimum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.EXECUTION_TIME__MINIMUM, null, msgs);
+			msgs = basicSetMinimum(newMinimum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.EXECUTION_TIME__MINIMUM, newMinimum, newMinimum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getMaximum() {
+		return maximum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMaximum(MeasuredValue newMaximum, NotificationChain msgs) {
+		MeasuredValue oldMaximum = maximum;
+		maximum = newMaximum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.EXECUTION_TIME__MAXIMUM, oldMaximum, newMaximum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMaximum(MeasuredValue newMaximum) {
+		if (newMaximum != maximum) {
+			NotificationChain msgs = null;
+			if (maximum != null)
+				msgs = ((InternalEObject)maximum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.EXECUTION_TIME__MAXIMUM, null, msgs);
+			if (newMaximum != null)
+				msgs = ((InternalEObject)newMaximum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.EXECUTION_TIME__MAXIMUM, null, msgs);
+			msgs = basicSetMaximum(newMaximum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.EXECUTION_TIME__MAXIMUM, newMaximum, newMaximum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getAverage() {
+		return average;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetAverage(MeasuredValue newAverage, NotificationChain msgs) {
+		MeasuredValue oldAverage = average;
+		average = newAverage;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.EXECUTION_TIME__AVERAGE, oldAverage, newAverage);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAverage(MeasuredValue newAverage) {
+		if (newAverage != average) {
+			NotificationChain msgs = null;
+			if (average != null)
+				msgs = ((InternalEObject)average).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.EXECUTION_TIME__AVERAGE, null, msgs);
+			if (newAverage != null)
+				msgs = ((InternalEObject)newAverage).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.EXECUTION_TIME__AVERAGE, null, msgs);
+			msgs = basicSetAverage(newAverage, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.EXECUTION_TIME__AVERAGE, newAverage, newAverage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE:
+				if (eInternalContainer() != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+				return basicSetMonitoredresource((MonitoredResource)otherEnd, msgs);
+		}
+		return super.eInverseAdd(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE:
+				return basicSetMonitoredresource(null, msgs);
+			case MonitoringxmlPackage.EXECUTION_TIME__MINIMUM:
+				return basicSetMinimum(null, msgs);
+			case MonitoringxmlPackage.EXECUTION_TIME__MAXIMUM:
+				return basicSetMaximum(null, msgs);
+			case MonitoringxmlPackage.EXECUTION_TIME__AVERAGE:
+				return basicSetAverage(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+		switch (eContainerFeatureID()) {
+			case MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE:
+				return eInternalContainer().eInverseRemove(this, MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME, MonitoredResource.class, msgs);
+		}
+		return super.eBasicRemoveFromContainerFeature(msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE:
+				return getMonitoredresource();
+			case MonitoringxmlPackage.EXECUTION_TIME__MINIMUM:
+				return getMinimum();
+			case MonitoringxmlPackage.EXECUTION_TIME__MAXIMUM:
+				return getMaximum();
+			case MonitoringxmlPackage.EXECUTION_TIME__AVERAGE:
+				return getAverage();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE:
+				setMonitoredresource((MonitoredResource)newValue);
+				return;
+			case MonitoringxmlPackage.EXECUTION_TIME__MINIMUM:
+				setMinimum((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.EXECUTION_TIME__MAXIMUM:
+				setMaximum((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.EXECUTION_TIME__AVERAGE:
+				setAverage((MeasuredValue)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE:
+				setMonitoredresource((MonitoredResource)null);
+				return;
+			case MonitoringxmlPackage.EXECUTION_TIME__MINIMUM:
+				setMinimum((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.EXECUTION_TIME__MAXIMUM:
+				setMaximum((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.EXECUTION_TIME__AVERAGE:
+				setAverage((MeasuredValue)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE:
+				return getMonitoredresource() != null;
+			case MonitoringxmlPackage.EXECUTION_TIME__MINIMUM:
+				return minimum != null;
+			case MonitoringxmlPackage.EXECUTION_TIME__MAXIMUM:
+				return maximum != null;
+			case MonitoringxmlPackage.EXECUTION_TIME__AVERAGE:
+				return average != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ExecutionTimeImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MeasuredValueImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MeasuredValueImpl.java
new file mode 100644
index 0000000..4e5f729
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MeasuredValueImpl.java
@@ -0,0 +1,226 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 Malardalen University, Sweden                     --
+--                                                                   --                      --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Measured Value</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MeasuredValueImpl#getUnit <em>Unit</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MeasuredValueImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class MeasuredValueImpl extends MinimalEObjectImpl.Container implements MeasuredValue {
+	/**
+	 * The default value of the '{@link #getUnit() <em>Unit</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUnit()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String UNIT_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getUnit() <em>Unit</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getUnit()
+	 * @generated
+	 * @ordered
+	 */
+	protected String unit = UNIT_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final Float VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected Float value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected MeasuredValueImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return MonitoringxmlPackage.Literals.MEASURED_VALUE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getUnit() {
+		return unit;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setUnit(String newUnit) {
+		String oldUnit = unit;
+		unit = newUnit;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MEASURED_VALUE__UNIT, oldUnit, unit));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Float getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(Float newValue) {
+		Float oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MEASURED_VALUE__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case MonitoringxmlPackage.MEASURED_VALUE__UNIT:
+				return getUnit();
+			case MonitoringxmlPackage.MEASURED_VALUE__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case MonitoringxmlPackage.MEASURED_VALUE__UNIT:
+				setUnit((String)newValue);
+				return;
+			case MonitoringxmlPackage.MEASURED_VALUE__VALUE:
+				setValue((Float)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.MEASURED_VALUE__UNIT:
+				setUnit(UNIT_EDEFAULT);
+				return;
+			case MonitoringxmlPackage.MEASURED_VALUE__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.MEASURED_VALUE__UNIT:
+				return UNIT_EDEFAULT == null ? unit != null : !UNIT_EDEFAULT.equals(unit);
+			case MonitoringxmlPackage.MEASURED_VALUE__VALUE:
+				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (unit: ");
+		result.append(unit);
+		result.append(", value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //MeasuredValueImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoredResourceImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoredResourceImpl.java
similarity index 63%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoredResourceImpl.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoredResourceImpl.java
index f3395ed..35dd530 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoredResourceImpl.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoredResourceImpl.java
@@ -13,23 +13,20 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml.impl;
-
-import monitoringxml.BlockingTime;
-import monitoringxml.ExecutionTime;
-import monitoringxml.MonitoredResource;
-import monitoringxml.MonitoringPackage;
-import monitoringxml.Period;
-import monitoringxml.ResponseTime;
+package org.polarsys.chess.monitoring.monitoringxml.impl;
 
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.polarsys.chess.monitoring.monitoringxml.BlockingTime;
+import org.polarsys.chess.monitoring.monitoringxml.ExecutionTime;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoredResource;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.Period;
+import org.polarsys.chess.monitoring.monitoringxml.ResponseTime;
 
 /**
  * <!-- begin-user-doc -->
@@ -37,14 +34,14 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
- * </p>
  * <ul>
- *   <li>{@link monitoringxml.impl.MonitoredResourceImpl#getName <em>Name</em>}</li>
- *   <li>{@link monitoringxml.impl.MonitoredResourceImpl#getPeriod <em>Period</em>}</li>
- *   <li>{@link monitoringxml.impl.MonitoredResourceImpl#getExecutiontime <em>Executiontime</em>}</li>
- *   <li>{@link monitoringxml.impl.MonitoredResourceImpl#getBlockingtime <em>Blockingtime</em>}</li>
- *   <li>{@link monitoringxml.impl.MonitoredResourceImpl#getResponsetime <em>Responsetime</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoredResourceImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoredResourceImpl#getPeriod <em>Period</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoredResourceImpl#getExecutiontime <em>Executiontime</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoredResourceImpl#getBlockingtime <em>Blockingtime</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoredResourceImpl#getResponsetime <em>Responsetime</em>}</li>
  * </ul>
+ * </p>
  *
  * @generated
  */
@@ -70,7 +67,7 @@
 	protected String name = NAME_EDEFAULT;
 
 	/**
-	 * The cached value of the '{@link #getPeriod() <em>Period</em>}' reference.
+	 * The cached value of the '{@link #getPeriod() <em>Period</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @see #getPeriod()
@@ -80,7 +77,7 @@
 	protected Period period;
 
 	/**
-	 * The cached value of the '{@link #getExecutiontime() <em>Executiontime</em>}' reference.
+	 * The cached value of the '{@link #getExecutiontime() <em>Executiontime</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @see #getExecutiontime()
@@ -90,7 +87,7 @@
 	protected ExecutionTime executiontime;
 
 	/**
-	 * The cached value of the '{@link #getBlockingtime() <em>Blockingtime</em>}' reference.
+	 * The cached value of the '{@link #getBlockingtime() <em>Blockingtime</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @see #getBlockingtime()
@@ -100,7 +97,7 @@
 	protected BlockingTime blockingtime;
 
 	/**
-	 * The cached value of the '{@link #getResponsetime() <em>Responsetime</em>}' reference.
+	 * The cached value of the '{@link #getResponsetime() <em>Responsetime</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @see #getResponsetime()
@@ -125,7 +122,7 @@
 	 */
 	@Override
 	protected EClass eStaticClass() {
-		return MonitoringPackage.Literals.MONITORED_RESOURCE;
+		return MonitoringxmlPackage.Literals.MONITORED_RESOURCE;
 	}
 
 	/**
@@ -146,7 +143,7 @@
 		String oldName = name;
 		name = newName;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORED_RESOURCE__NAME, oldName, name));
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORED_RESOURCE__NAME, oldName, name));
 	}
 
 	/**
@@ -155,23 +152,6 @@
 	 * @generated
 	 */
 	public Period getPeriod() {
-		if (period != null && period.eIsProxy()) {
-			InternalEObject oldPeriod = (InternalEObject)period;
-			period = (Period)eResolveProxy(oldPeriod);
-			if (period != oldPeriod) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, MonitoringPackage.MONITORED_RESOURCE__PERIOD, oldPeriod, period));
-			}
-		}
-		return period;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public Period basicGetPeriod() {
 		return period;
 	}
 
@@ -184,7 +164,7 @@
 		Period oldPeriod = period;
 		period = newPeriod;
 		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORED_RESOURCE__PERIOD, oldPeriod, newPeriod);
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD, oldPeriod, newPeriod);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
 		return msgs;
@@ -199,14 +179,14 @@
 		if (newPeriod != period) {
 			NotificationChain msgs = null;
 			if (period != null)
-				msgs = ((InternalEObject)period).eInverseRemove(this, MonitoringPackage.PERIOD__MONITOREDRESOURCE, Period.class, msgs);
+				msgs = ((InternalEObject)period).eInverseRemove(this, MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE, Period.class, msgs);
 			if (newPeriod != null)
-				msgs = ((InternalEObject)newPeriod).eInverseAdd(this, MonitoringPackage.PERIOD__MONITOREDRESOURCE, Period.class, msgs);
+				msgs = ((InternalEObject)newPeriod).eInverseAdd(this, MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE, Period.class, msgs);
 			msgs = basicSetPeriod(newPeriod, msgs);
 			if (msgs != null) msgs.dispatch();
 		}
 		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORED_RESOURCE__PERIOD, newPeriod, newPeriod));
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD, newPeriod, newPeriod));
 	}
 
 	/**
@@ -215,23 +195,6 @@
 	 * @generated
 	 */
 	public ExecutionTime getExecutiontime() {
-		if (executiontime != null && executiontime.eIsProxy()) {
-			InternalEObject oldExecutiontime = (InternalEObject)executiontime;
-			executiontime = (ExecutionTime)eResolveProxy(oldExecutiontime);
-			if (executiontime != oldExecutiontime) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME, oldExecutiontime, executiontime));
-			}
-		}
-		return executiontime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ExecutionTime basicGetExecutiontime() {
 		return executiontime;
 	}
 
@@ -244,7 +207,7 @@
 		ExecutionTime oldExecutiontime = executiontime;
 		executiontime = newExecutiontime;
 		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME, oldExecutiontime, newExecutiontime);
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME, oldExecutiontime, newExecutiontime);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
 		return msgs;
@@ -259,14 +222,14 @@
 		if (newExecutiontime != executiontime) {
 			NotificationChain msgs = null;
 			if (executiontime != null)
-				msgs = ((InternalEObject)executiontime).eInverseRemove(this, MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE, ExecutionTime.class, msgs);
+				msgs = ((InternalEObject)executiontime).eInverseRemove(this, MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE, ExecutionTime.class, msgs);
 			if (newExecutiontime != null)
-				msgs = ((InternalEObject)newExecutiontime).eInverseAdd(this, MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE, ExecutionTime.class, msgs);
+				msgs = ((InternalEObject)newExecutiontime).eInverseAdd(this, MonitoringxmlPackage.EXECUTION_TIME__MONITOREDRESOURCE, ExecutionTime.class, msgs);
 			msgs = basicSetExecutiontime(newExecutiontime, msgs);
 			if (msgs != null) msgs.dispatch();
 		}
 		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME, newExecutiontime, newExecutiontime));
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME, newExecutiontime, newExecutiontime));
 	}
 
 	/**
@@ -275,23 +238,6 @@
 	 * @generated
 	 */
 	public BlockingTime getBlockingtime() {
-		if (blockingtime != null && blockingtime.eIsProxy()) {
-			InternalEObject oldBlockingtime = (InternalEObject)blockingtime;
-			blockingtime = (BlockingTime)eResolveProxy(oldBlockingtime);
-			if (blockingtime != oldBlockingtime) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME, oldBlockingtime, blockingtime));
-			}
-		}
-		return blockingtime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public BlockingTime basicGetBlockingtime() {
 		return blockingtime;
 	}
 
@@ -304,7 +250,7 @@
 		BlockingTime oldBlockingtime = blockingtime;
 		blockingtime = newBlockingtime;
 		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME, oldBlockingtime, newBlockingtime);
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME, oldBlockingtime, newBlockingtime);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
 		return msgs;
@@ -319,14 +265,14 @@
 		if (newBlockingtime != blockingtime) {
 			NotificationChain msgs = null;
 			if (blockingtime != null)
-				msgs = ((InternalEObject)blockingtime).eInverseRemove(this, MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE, BlockingTime.class, msgs);
+				msgs = ((InternalEObject)blockingtime).eInverseRemove(this, MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE, BlockingTime.class, msgs);
 			if (newBlockingtime != null)
-				msgs = ((InternalEObject)newBlockingtime).eInverseAdd(this, MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE, BlockingTime.class, msgs);
+				msgs = ((InternalEObject)newBlockingtime).eInverseAdd(this, MonitoringxmlPackage.BLOCKING_TIME__MONITOREDRESOURCE, BlockingTime.class, msgs);
 			msgs = basicSetBlockingtime(newBlockingtime, msgs);
 			if (msgs != null) msgs.dispatch();
 		}
 		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME, newBlockingtime, newBlockingtime));
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME, newBlockingtime, newBlockingtime));
 	}
 
 	/**
@@ -335,23 +281,6 @@
 	 * @generated
 	 */
 	public ResponseTime getResponsetime() {
-		if (responsetime != null && responsetime.eIsProxy()) {
-			InternalEObject oldResponsetime = (InternalEObject)responsetime;
-			responsetime = (ResponseTime)eResolveProxy(oldResponsetime);
-			if (responsetime != oldResponsetime) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME, oldResponsetime, responsetime));
-			}
-		}
-		return responsetime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public ResponseTime basicGetResponsetime() {
 		return responsetime;
 	}
 
@@ -364,7 +293,7 @@
 		ResponseTime oldResponsetime = responsetime;
 		responsetime = newResponsetime;
 		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME, oldResponsetime, newResponsetime);
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME, oldResponsetime, newResponsetime);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
 		return msgs;
@@ -379,14 +308,14 @@
 		if (newResponsetime != responsetime) {
 			NotificationChain msgs = null;
 			if (responsetime != null)
-				msgs = ((InternalEObject)responsetime).eInverseRemove(this, MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE, ResponseTime.class, msgs);
+				msgs = ((InternalEObject)responsetime).eInverseRemove(this, MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE, ResponseTime.class, msgs);
 			if (newResponsetime != null)
-				msgs = ((InternalEObject)newResponsetime).eInverseAdd(this, MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE, ResponseTime.class, msgs);
+				msgs = ((InternalEObject)newResponsetime).eInverseAdd(this, MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE, ResponseTime.class, msgs);
 			msgs = basicSetResponsetime(newResponsetime, msgs);
 			if (msgs != null) msgs.dispatch();
 		}
 		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME, newResponsetime, newResponsetime));
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME, newResponsetime, newResponsetime));
 	}
 
 	/**
@@ -397,21 +326,21 @@
 	@Override
 	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORED_RESOURCE__PERIOD:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD:
 				if (period != null)
-					msgs = ((InternalEObject)period).eInverseRemove(this, MonitoringPackage.PERIOD__MONITOREDRESOURCE, Period.class, msgs);
+					msgs = ((InternalEObject)period).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD, null, msgs);
 				return basicSetPeriod((Period)otherEnd, msgs);
-			case MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME:
 				if (executiontime != null)
-					msgs = ((InternalEObject)executiontime).eInverseRemove(this, MonitoringPackage.EXECUTION_TIME__MONITOREDRESOURCE, ExecutionTime.class, msgs);
+					msgs = ((InternalEObject)executiontime).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME, null, msgs);
 				return basicSetExecutiontime((ExecutionTime)otherEnd, msgs);
-			case MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME:
 				if (blockingtime != null)
-					msgs = ((InternalEObject)blockingtime).eInverseRemove(this, MonitoringPackage.BLOCKING_TIME__MONITOREDRESOURCE, BlockingTime.class, msgs);
+					msgs = ((InternalEObject)blockingtime).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME, null, msgs);
 				return basicSetBlockingtime((BlockingTime)otherEnd, msgs);
-			case MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME:
 				if (responsetime != null)
-					msgs = ((InternalEObject)responsetime).eInverseRemove(this, MonitoringPackage.RESPONSE_TIME__MONITOREDRESOURCE, ResponseTime.class, msgs);
+					msgs = ((InternalEObject)responsetime).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME, null, msgs);
 				return basicSetResponsetime((ResponseTime)otherEnd, msgs);
 		}
 		return super.eInverseAdd(otherEnd, featureID, msgs);
@@ -425,13 +354,13 @@
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORED_RESOURCE__PERIOD:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD:
 				return basicSetPeriod(null, msgs);
-			case MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME:
 				return basicSetExecutiontime(null, msgs);
-			case MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME:
 				return basicSetBlockingtime(null, msgs);
-			case MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME:
 				return basicSetResponsetime(null, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
@@ -445,20 +374,16 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORED_RESOURCE__NAME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__NAME:
 				return getName();
-			case MonitoringPackage.MONITORED_RESOURCE__PERIOD:
-				if (resolve) return getPeriod();
-				return basicGetPeriod();
-			case MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME:
-				if (resolve) return getExecutiontime();
-				return basicGetExecutiontime();
-			case MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME:
-				if (resolve) return getBlockingtime();
-				return basicGetBlockingtime();
-			case MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME:
-				if (resolve) return getResponsetime();
-				return basicGetResponsetime();
+			case MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD:
+				return getPeriod();
+			case MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME:
+				return getExecutiontime();
+			case MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME:
+				return getBlockingtime();
+			case MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME:
+				return getResponsetime();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -471,19 +396,19 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORED_RESOURCE__NAME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__NAME:
 				setName((String)newValue);
 				return;
-			case MonitoringPackage.MONITORED_RESOURCE__PERIOD:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD:
 				setPeriod((Period)newValue);
 				return;
-			case MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME:
 				setExecutiontime((ExecutionTime)newValue);
 				return;
-			case MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME:
 				setBlockingtime((BlockingTime)newValue);
 				return;
-			case MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME:
 				setResponsetime((ResponseTime)newValue);
 				return;
 		}
@@ -498,19 +423,19 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORED_RESOURCE__NAME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__NAME:
 				setName(NAME_EDEFAULT);
 				return;
-			case MonitoringPackage.MONITORED_RESOURCE__PERIOD:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD:
 				setPeriod((Period)null);
 				return;
-			case MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME:
 				setExecutiontime((ExecutionTime)null);
 				return;
-			case MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME:
 				setBlockingtime((BlockingTime)null);
 				return;
-			case MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME:
 				setResponsetime((ResponseTime)null);
 				return;
 		}
@@ -525,15 +450,15 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORED_RESOURCE__NAME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__NAME:
 				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
-			case MonitoringPackage.MONITORED_RESOURCE__PERIOD:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD:
 				return period != null;
-			case MonitoringPackage.MONITORED_RESOURCE__EXECUTIONTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__EXECUTIONTIME:
 				return executiontime != null;
-			case MonitoringPackage.MONITORED_RESOURCE__BLOCKINGTIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__BLOCKINGTIME:
 				return blockingtime != null;
-			case MonitoringPackage.MONITORED_RESOURCE__RESPONSETIME:
+			case MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME:
 				return responsetime != null;
 		}
 		return super.eIsSet(featureID);
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoringImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoringImpl.java
similarity index 71%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoringImpl.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoringImpl.java
index c57d372..a78132a 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoringImpl.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoringImpl.java
@@ -13,28 +13,23 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml.impl;
+package org.polarsys.chess.monitoring.monitoringxml.impl;
 
 import java.util.Collection;
 
-import monitoringxml.AnalysisContext;
-import monitoringxml.Monitoring;
-import monitoringxml.MonitoringPackage;
-import monitoringxml.Resource;
-
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
-
 import org.eclipse.emf.common.util.EList;
-
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.InternalEObject;
-
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
-
 import org.eclipse.emf.ecore.util.EObjectContainmentEList;
 import org.eclipse.emf.ecore.util.InternalEList;
+import org.polarsys.chess.monitoring.monitoringxml.AnalysisContext;
+import org.polarsys.chess.monitoring.monitoringxml.Monitoring;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.Resource;
 
 /**
  * <!-- begin-user-doc -->
@@ -42,12 +37,12 @@
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
- * </p>
  * <ul>
- *   <li>{@link monitoringxml.impl.MonitoringImpl#getThreadNames <em>Thread Names</em>}</li>
- *   <li>{@link monitoringxml.impl.MonitoringImpl#getSharedResources <em>Shared Resources</em>}</li>
- *   <li>{@link monitoringxml.impl.MonitoringImpl#getAnalysisContext <em>Analysis Context</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringImpl#getThreadNames <em>Thread Names</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringImpl#getSharedResources <em>Shared Resources</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.MonitoringImpl#getAnalysisContext <em>Analysis Context</em>}</li>
  * </ul>
+ * </p>
  *
  * @generated
  */
@@ -60,7 +55,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected EList<monitoringxml.Thread> threadNames;
+	protected EList<org.polarsys.chess.monitoring.monitoringxml.Thread> threadNames;
 
 	/**
 	 * The cached value of the '{@link #getSharedResources() <em>Shared Resources</em>}' containment reference list.
@@ -98,7 +93,7 @@
 	 */
 	@Override
 	protected EClass eStaticClass() {
-		return MonitoringPackage.Literals.MONITORING;
+		return MonitoringxmlPackage.Literals.MONITORING;
 	}
 
 	/**
@@ -106,9 +101,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList<monitoringxml.Thread> getThreadNames() {
+	public EList<org.polarsys.chess.monitoring.monitoringxml.Thread> getThreadNames() {
 		if (threadNames == null) {
-			threadNames = new EObjectContainmentEList<monitoringxml.Thread>(monitoringxml.Thread.class, this, MonitoringPackage.MONITORING__THREAD_NAMES);
+			threadNames = new EObjectContainmentEList<org.polarsys.chess.monitoring.monitoringxml.Thread>(org.polarsys.chess.monitoring.monitoringxml.Thread.class, this, MonitoringxmlPackage.MONITORING__THREAD_NAMES);
 		}
 		return threadNames;
 	}
@@ -120,7 +115,7 @@
 	 */
 	public EList<Resource> getSharedResources() {
 		if (sharedResources == null) {
-			sharedResources = new EObjectContainmentEList<Resource>(Resource.class, this, MonitoringPackage.MONITORING__SHARED_RESOURCES);
+			sharedResources = new EObjectContainmentEList<Resource>(Resource.class, this, MonitoringxmlPackage.MONITORING__SHARED_RESOURCES);
 		}
 		return sharedResources;
 	}
@@ -143,7 +138,7 @@
 		AnalysisContext oldAnalysisContext = analysisContext;
 		analysisContext = newAnalysisContext;
 		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORING__ANALYSIS_CONTEXT, oldAnalysisContext, newAnalysisContext);
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORING__ANALYSIS_CONTEXT, oldAnalysisContext, newAnalysisContext);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
 		return msgs;
@@ -158,14 +153,14 @@
 		if (newAnalysisContext != analysisContext) {
 			NotificationChain msgs = null;
 			if (analysisContext != null)
-				msgs = ((InternalEObject)analysisContext).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringPackage.MONITORING__ANALYSIS_CONTEXT, null, msgs);
+				msgs = ((InternalEObject)analysisContext).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.MONITORING__ANALYSIS_CONTEXT, null, msgs);
 			if (newAnalysisContext != null)
-				msgs = ((InternalEObject)newAnalysisContext).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringPackage.MONITORING__ANALYSIS_CONTEXT, null, msgs);
+				msgs = ((InternalEObject)newAnalysisContext).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.MONITORING__ANALYSIS_CONTEXT, null, msgs);
 			msgs = basicSetAnalysisContext(newAnalysisContext, msgs);
 			if (msgs != null) msgs.dispatch();
 		}
 		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringPackage.MONITORING__ANALYSIS_CONTEXT, newAnalysisContext, newAnalysisContext));
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.MONITORING__ANALYSIS_CONTEXT, newAnalysisContext, newAnalysisContext));
 	}
 
 	/**
@@ -176,11 +171,11 @@
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORING__THREAD_NAMES:
+			case MonitoringxmlPackage.MONITORING__THREAD_NAMES:
 				return ((InternalEList<?>)getThreadNames()).basicRemove(otherEnd, msgs);
-			case MonitoringPackage.MONITORING__SHARED_RESOURCES:
+			case MonitoringxmlPackage.MONITORING__SHARED_RESOURCES:
 				return ((InternalEList<?>)getSharedResources()).basicRemove(otherEnd, msgs);
-			case MonitoringPackage.MONITORING__ANALYSIS_CONTEXT:
+			case MonitoringxmlPackage.MONITORING__ANALYSIS_CONTEXT:
 				return basicSetAnalysisContext(null, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
@@ -194,11 +189,11 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORING__THREAD_NAMES:
+			case MonitoringxmlPackage.MONITORING__THREAD_NAMES:
 				return getThreadNames();
-			case MonitoringPackage.MONITORING__SHARED_RESOURCES:
+			case MonitoringxmlPackage.MONITORING__SHARED_RESOURCES:
 				return getSharedResources();
-			case MonitoringPackage.MONITORING__ANALYSIS_CONTEXT:
+			case MonitoringxmlPackage.MONITORING__ANALYSIS_CONTEXT:
 				return getAnalysisContext();
 		}
 		return super.eGet(featureID, resolve, coreType);
@@ -213,15 +208,15 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORING__THREAD_NAMES:
+			case MonitoringxmlPackage.MONITORING__THREAD_NAMES:
 				getThreadNames().clear();
-				getThreadNames().addAll((Collection<? extends monitoringxml.Thread>)newValue);
+				getThreadNames().addAll((Collection<? extends org.polarsys.chess.monitoring.monitoringxml.Thread>)newValue);
 				return;
-			case MonitoringPackage.MONITORING__SHARED_RESOURCES:
+			case MonitoringxmlPackage.MONITORING__SHARED_RESOURCES:
 				getSharedResources().clear();
 				getSharedResources().addAll((Collection<? extends Resource>)newValue);
 				return;
-			case MonitoringPackage.MONITORING__ANALYSIS_CONTEXT:
+			case MonitoringxmlPackage.MONITORING__ANALYSIS_CONTEXT:
 				setAnalysisContext((AnalysisContext)newValue);
 				return;
 		}
@@ -236,13 +231,13 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORING__THREAD_NAMES:
+			case MonitoringxmlPackage.MONITORING__THREAD_NAMES:
 				getThreadNames().clear();
 				return;
-			case MonitoringPackage.MONITORING__SHARED_RESOURCES:
+			case MonitoringxmlPackage.MONITORING__SHARED_RESOURCES:
 				getSharedResources().clear();
 				return;
-			case MonitoringPackage.MONITORING__ANALYSIS_CONTEXT:
+			case MonitoringxmlPackage.MONITORING__ANALYSIS_CONTEXT:
 				setAnalysisContext((AnalysisContext)null);
 				return;
 		}
@@ -257,11 +252,11 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case MonitoringPackage.MONITORING__THREAD_NAMES:
+			case MonitoringxmlPackage.MONITORING__THREAD_NAMES:
 				return threadNames != null && !threadNames.isEmpty();
-			case MonitoringPackage.MONITORING__SHARED_RESOURCES:
+			case MonitoringxmlPackage.MONITORING__SHARED_RESOURCES:
 				return sharedResources != null && !sharedResources.isEmpty();
-			case MonitoringPackage.MONITORING__ANALYSIS_CONTEXT:
+			case MonitoringxmlPackage.MONITORING__ANALYSIS_CONTEXT:
 				return analysisContext != null;
 		}
 		return super.eIsSet(featureID);
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoringFactoryImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoringxmlFactoryImpl.java
similarity index 61%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoringFactoryImpl.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoringxmlFactoryImpl.java
index 559eac1..7d24cbf 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/MonitoringFactoryImpl.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoringxmlFactoryImpl.java
@@ -13,25 +13,23 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml.impl;
-
-import monitoringxml.AnalysisContext;
-import monitoringxml.BlockingTime;
-import monitoringxml.ExecutionTime;
-import monitoringxml.Monitoring;
-import monitoringxml.MonitoringFactory;
-import monitoringxml.MonitoringPackage;
-import monitoringxml.Period;
-import monitoringxml.Resource;
-import monitoringxml.ResponseTime;
+package org.polarsys.chess.monitoring.monitoringxml.impl;
 
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
-
 import org.eclipse.emf.ecore.impl.EFactoryImpl;
-
 import org.eclipse.emf.ecore.plugin.EcorePlugin;
+import org.polarsys.chess.monitoring.monitoringxml.AnalysisContext;
+import org.polarsys.chess.monitoring.monitoringxml.BlockingTime;
+import org.polarsys.chess.monitoring.monitoringxml.ExecutionTime;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.Monitoring;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlFactory;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.Period;
+import org.polarsys.chess.monitoring.monitoringxml.Resource;
+import org.polarsys.chess.monitoring.monitoringxml.ResponseTime;
 
 /**
  * <!-- begin-user-doc -->
@@ -39,24 +37,24 @@
  * <!-- end-user-doc -->
  * @generated
  */
-public class MonitoringFactoryImpl extends EFactoryImpl implements MonitoringFactory {
+public class MonitoringxmlFactoryImpl extends EFactoryImpl implements MonitoringxmlFactory {
 	/**
 	 * Creates the default factory implementation.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static MonitoringFactory init() {
+	public static MonitoringxmlFactory init() {
 		try {
-			MonitoringFactory theMonitoringFactory = (MonitoringFactory)EPackage.Registry.INSTANCE.getEFactory(MonitoringPackage.eNS_URI);
-			if (theMonitoringFactory != null) {
-				return theMonitoringFactory;
+			MonitoringxmlFactory theMonitoringxmlFactory = (MonitoringxmlFactory)EPackage.Registry.INSTANCE.getEFactory(MonitoringxmlPackage.eNS_URI);
+			if (theMonitoringxmlFactory != null) {
+				return theMonitoringxmlFactory;
 			}
 		}
 		catch (Exception exception) {
 			EcorePlugin.INSTANCE.log(exception);
 		}
-		return new MonitoringFactoryImpl();
+		return new MonitoringxmlFactoryImpl();
 	}
 
 	/**
@@ -65,7 +63,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public MonitoringFactoryImpl() {
+	public MonitoringxmlFactoryImpl() {
 		super();
 	}
 
@@ -77,14 +75,15 @@
 	@Override
 	public EObject create(EClass eClass) {
 		switch (eClass.getClassifierID()) {
-			case MonitoringPackage.MONITORING: return createMonitoring();
-			case MonitoringPackage.THREAD: return createThread();
-			case MonitoringPackage.RESOURCE: return createResource();
-			case MonitoringPackage.PERIOD: return createPeriod();
-			case MonitoringPackage.EXECUTION_TIME: return createExecutionTime();
-			case MonitoringPackage.BLOCKING_TIME: return createBlockingTime();
-			case MonitoringPackage.RESPONSE_TIME: return createResponseTime();
-			case MonitoringPackage.ANALYSIS_CONTEXT: return createAnalysisContext();
+			case MonitoringxmlPackage.MONITORING: return createMonitoring();
+			case MonitoringxmlPackage.THREAD: return createThread();
+			case MonitoringxmlPackage.RESOURCE: return createResource();
+			case MonitoringxmlPackage.PERIOD: return createPeriod();
+			case MonitoringxmlPackage.EXECUTION_TIME: return createExecutionTime();
+			case MonitoringxmlPackage.BLOCKING_TIME: return createBlockingTime();
+			case MonitoringxmlPackage.RESPONSE_TIME: return createResponseTime();
+			case MonitoringxmlPackage.ANALYSIS_CONTEXT: return createAnalysisContext();
+			case MonitoringxmlPackage.MEASURED_VALUE: return createMeasuredValue();
 			default:
 				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
 		}
@@ -105,7 +104,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public monitoringxml.Thread createThread() {
+	public org.polarsys.chess.monitoring.monitoringxml.Thread createThread() {
 		ThreadImpl thread = new ThreadImpl();
 		return thread;
 	}
@@ -175,8 +174,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public MonitoringPackage getMonitoringPackage() {
-		return (MonitoringPackage)getEPackage();
+	public MeasuredValue createMeasuredValue() {
+		MeasuredValueImpl measuredValue = new MeasuredValueImpl();
+		return measuredValue;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MonitoringxmlPackage getMonitoringxmlPackage() {
+		return (MonitoringxmlPackage)getEPackage();
 	}
 
 	/**
@@ -186,8 +195,8 @@
 	 * @generated
 	 */
 	@Deprecated
-	public static MonitoringPackage getPackage() {
-		return MonitoringPackage.eINSTANCE;
+	public static MonitoringxmlPackage getPackage() {
+		return MonitoringxmlPackage.eINSTANCE;
 	}
 
-} //MonitoringFactoryImpl
+} //MonitoringxmlFactoryImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoringxmlPackageImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoringxmlPackageImpl.java
new file mode 100644
index 0000000..edc5928
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/MonitoringxmlPackageImpl.java
@@ -0,0 +1,674 @@
+/**
+ */
+package org.polarsys.chess.monitoring.monitoringxml.impl;
+
+import org.eclipse.emf.ecore.EAttribute;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.EReference;
+import org.eclipse.emf.ecore.impl.EPackageImpl;
+import org.polarsys.chess.monitoring.monitoringxml.AnalysisContext;
+import org.polarsys.chess.monitoring.monitoringxml.BlockingTime;
+import org.polarsys.chess.monitoring.monitoringxml.ExecutionTime;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoredResource;
+import org.polarsys.chess.monitoring.monitoringxml.Monitoring;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlFactory;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.Period;
+import org.polarsys.chess.monitoring.monitoringxml.Resource;
+import org.polarsys.chess.monitoring.monitoringxml.ResponseTime;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model <b>Package</b>.
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class MonitoringxmlPackageImpl extends EPackageImpl implements MonitoringxmlPackage {
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass monitoringEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass threadEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass resourceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass periodEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass monitoredResourceEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass executionTimeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass blockingTimeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass responseTimeEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass analysisContextEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass measuredValueEClass = null;
+
+	/**
+	 * Creates an instance of the model <b>Package</b>, registered with
+	 * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package
+	 * package URI value.
+	 * <p>Note: the correct way to create the package is via the static
+	 * factory method {@link #init init()}, which also performs
+	 * initialization of the package, or returns the registered package,
+	 * if one already exists.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.emf.ecore.EPackage.Registry
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage#eNS_URI
+	 * @see #init()
+	 * @generated
+	 */
+	private MonitoringxmlPackageImpl() {
+		super(eNS_URI, MonitoringxmlFactory.eINSTANCE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private static boolean isInited = false;
+
+	/**
+	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
+	 * 
+	 * <p>This method is used to initialize {@link MonitoringxmlPackage#eINSTANCE} when that field is accessed.
+	 * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #eNS_URI
+	 * @see #createPackageContents()
+	 * @see #initializePackageContents()
+	 * @generated
+	 */
+	public static MonitoringxmlPackage init() {
+		if (isInited) return (MonitoringxmlPackage)EPackage.Registry.INSTANCE.getEPackage(MonitoringxmlPackage.eNS_URI);
+
+		// Obtain or create and register package
+		MonitoringxmlPackageImpl theMonitoringxmlPackage = (MonitoringxmlPackageImpl)(EPackage.Registry.INSTANCE.get(eNS_URI) instanceof MonitoringxmlPackageImpl ? EPackage.Registry.INSTANCE.get(eNS_URI) : new MonitoringxmlPackageImpl());
+
+		isInited = true;
+
+		// Create package meta-data objects
+		theMonitoringxmlPackage.createPackageContents();
+
+		// Initialize created meta-data
+		theMonitoringxmlPackage.initializePackageContents();
+
+		// Mark meta-data to indicate it can't be changed
+		theMonitoringxmlPackage.freeze();
+
+  
+		// Update the registry and return the package
+		EPackage.Registry.INSTANCE.put(MonitoringxmlPackage.eNS_URI, theMonitoringxmlPackage);
+		return theMonitoringxmlPackage;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getMonitoring() {
+		return monitoringEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMonitoring_ThreadNames() {
+		return (EReference)monitoringEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMonitoring_SharedResources() {
+		return (EReference)monitoringEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMonitoring_AnalysisContext() {
+		return (EReference)monitoringEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getThread() {
+		return threadEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getResource() {
+		return resourceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getPeriod() {
+		return periodEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPeriod_Monitoredresource() {
+		return (EReference)periodEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPeriod_Minimum() {
+		return (EReference)periodEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPeriod_Maximum() {
+		return (EReference)periodEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPeriod_Average() {
+		return (EReference)periodEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getPeriod_Jitter() {
+		return (EReference)periodEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getMonitoredResource() {
+		return monitoredResourceEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getMonitoredResource_Name() {
+		return (EAttribute)monitoredResourceEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMonitoredResource_Period() {
+		return (EReference)monitoredResourceEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMonitoredResource_Executiontime() {
+		return (EReference)monitoredResourceEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMonitoredResource_Blockingtime() {
+		return (EReference)monitoredResourceEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getMonitoredResource_Responsetime() {
+		return (EReference)monitoredResourceEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getExecutionTime() {
+		return executionTimeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExecutionTime_Monitoredresource() {
+		return (EReference)executionTimeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExecutionTime_Minimum() {
+		return (EReference)executionTimeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExecutionTime_Maximum() {
+		return (EReference)executionTimeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getExecutionTime_Average() {
+		return (EReference)executionTimeEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBlockingTime() {
+		return blockingTimeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBlockingTime_Monitoredresource() {
+		return (EReference)blockingTimeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBlockingTime_Minimum() {
+		return (EReference)blockingTimeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBlockingTime_Maximum() {
+		return (EReference)blockingTimeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBlockingTime_Average() {
+		return (EReference)blockingTimeEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getResponseTime() {
+		return responseTimeEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getResponseTime_Monitoredresource() {
+		return (EReference)responseTimeEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getResponseTime_Minimum() {
+		return (EReference)responseTimeEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getResponseTime_Maximum() {
+		return (EReference)responseTimeEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getResponseTime_Average() {
+		return (EReference)responseTimeEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getResponseTime_Jitter() {
+		return (EReference)responseTimeEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getAnalysisContext() {
+		return analysisContextEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getAnalysisContext_Name() {
+		return (EAttribute)analysisContextEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getMeasuredValue() {
+		return measuredValueEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getMeasuredValue_Unit() {
+		return (EAttribute)measuredValueEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getMeasuredValue_Value() {
+		return (EAttribute)measuredValueEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MonitoringxmlFactory getMonitoringxmlFactory() {
+		return (MonitoringxmlFactory)getEFactoryInstance();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isCreated = false;
+
+	/**
+	 * Creates the meta-model objects for the package.  This method is
+	 * guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void createPackageContents() {
+		if (isCreated) return;
+		isCreated = true;
+
+		// Create classes and their features
+		monitoringEClass = createEClass(MONITORING);
+		createEReference(monitoringEClass, MONITORING__THREAD_NAMES);
+		createEReference(monitoringEClass, MONITORING__SHARED_RESOURCES);
+		createEReference(monitoringEClass, MONITORING__ANALYSIS_CONTEXT);
+
+		threadEClass = createEClass(THREAD);
+
+		resourceEClass = createEClass(RESOURCE);
+
+		periodEClass = createEClass(PERIOD);
+		createEReference(periodEClass, PERIOD__MONITOREDRESOURCE);
+		createEReference(periodEClass, PERIOD__MINIMUM);
+		createEReference(periodEClass, PERIOD__MAXIMUM);
+		createEReference(periodEClass, PERIOD__AVERAGE);
+		createEReference(periodEClass, PERIOD__JITTER);
+
+		monitoredResourceEClass = createEClass(MONITORED_RESOURCE);
+		createEAttribute(monitoredResourceEClass, MONITORED_RESOURCE__NAME);
+		createEReference(monitoredResourceEClass, MONITORED_RESOURCE__PERIOD);
+		createEReference(monitoredResourceEClass, MONITORED_RESOURCE__EXECUTIONTIME);
+		createEReference(monitoredResourceEClass, MONITORED_RESOURCE__BLOCKINGTIME);
+		createEReference(monitoredResourceEClass, MONITORED_RESOURCE__RESPONSETIME);
+
+		executionTimeEClass = createEClass(EXECUTION_TIME);
+		createEReference(executionTimeEClass, EXECUTION_TIME__MONITOREDRESOURCE);
+		createEReference(executionTimeEClass, EXECUTION_TIME__MINIMUM);
+		createEReference(executionTimeEClass, EXECUTION_TIME__MAXIMUM);
+		createEReference(executionTimeEClass, EXECUTION_TIME__AVERAGE);
+
+		blockingTimeEClass = createEClass(BLOCKING_TIME);
+		createEReference(blockingTimeEClass, BLOCKING_TIME__MONITOREDRESOURCE);
+		createEReference(blockingTimeEClass, BLOCKING_TIME__MINIMUM);
+		createEReference(blockingTimeEClass, BLOCKING_TIME__MAXIMUM);
+		createEReference(blockingTimeEClass, BLOCKING_TIME__AVERAGE);
+
+		responseTimeEClass = createEClass(RESPONSE_TIME);
+		createEReference(responseTimeEClass, RESPONSE_TIME__MONITOREDRESOURCE);
+		createEReference(responseTimeEClass, RESPONSE_TIME__MINIMUM);
+		createEReference(responseTimeEClass, RESPONSE_TIME__MAXIMUM);
+		createEReference(responseTimeEClass, RESPONSE_TIME__AVERAGE);
+		createEReference(responseTimeEClass, RESPONSE_TIME__JITTER);
+
+		analysisContextEClass = createEClass(ANALYSIS_CONTEXT);
+		createEAttribute(analysisContextEClass, ANALYSIS_CONTEXT__NAME);
+
+		measuredValueEClass = createEClass(MEASURED_VALUE);
+		createEAttribute(measuredValueEClass, MEASURED_VALUE__UNIT);
+		createEAttribute(measuredValueEClass, MEASURED_VALUE__VALUE);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private boolean isInitialized = false;
+
+	/**
+	 * Complete the initialization of the package and its meta-model.  This
+	 * method is guarded to have no affect on any invocation but its first.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void initializePackageContents() {
+		if (isInitialized) return;
+		isInitialized = true;
+
+		// Initialize package
+		setName(eNAME);
+		setNsPrefix(eNS_PREFIX);
+		setNsURI(eNS_URI);
+
+		// Create type parameters
+
+		// Set bounds for type parameters
+
+		// Add supertypes to classes
+		threadEClass.getESuperTypes().add(this.getMonitoredResource());
+		resourceEClass.getESuperTypes().add(this.getMonitoredResource());
+
+		// Initialize classes, features, and operations; add parameters
+		initEClass(monitoringEClass, Monitoring.class, "Monitoring", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getMonitoring_ThreadNames(), this.getThread(), null, "ThreadNames", null, 0, -1, Monitoring.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMonitoring_SharedResources(), this.getResource(), null, "SharedResources", null, 0, -1, Monitoring.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMonitoring_AnalysisContext(), this.getAnalysisContext(), null, "analysisContext", null, 1, 1, Monitoring.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(threadEClass, org.polarsys.chess.monitoring.monitoringxml.Thread.class, "Thread", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(resourceEClass, Resource.class, "Resource", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(periodEClass, Period.class, "Period", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getPeriod_Monitoredresource(), this.getMonitoredResource(), this.getMonitoredResource_Period(), "monitoredresource", null, 0, 1, Period.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPeriod_Minimum(), this.getMeasuredValue(), null, "minimum", null, 0, 1, Period.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPeriod_Maximum(), this.getMeasuredValue(), null, "maximum", null, 0, 1, Period.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPeriod_Average(), this.getMeasuredValue(), null, "average", null, 0, 1, Period.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getPeriod_Jitter(), this.getMeasuredValue(), null, "jitter", null, 0, 1, Period.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(monitoredResourceEClass, MonitoredResource.class, "MonitoredResource", IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getMonitoredResource_Name(), ecorePackage.getEString(), "name", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMonitoredResource_Period(), this.getPeriod(), this.getPeriod_Monitoredresource(), "period", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMonitoredResource_Executiontime(), this.getExecutionTime(), this.getExecutionTime_Monitoredresource(), "executiontime", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMonitoredResource_Blockingtime(), this.getBlockingTime(), this.getBlockingTime_Monitoredresource(), "blockingtime", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getMonitoredResource_Responsetime(), this.getResponseTime(), this.getResponseTime_Monitoredresource(), "responsetime", null, 0, 1, MonitoredResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(executionTimeEClass, ExecutionTime.class, "ExecutionTime", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getExecutionTime_Monitoredresource(), this.getMonitoredResource(), this.getMonitoredResource_Executiontime(), "monitoredresource", null, 0, 1, ExecutionTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getExecutionTime_Minimum(), this.getMeasuredValue(), null, "minimum", null, 0, 1, ExecutionTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getExecutionTime_Maximum(), this.getMeasuredValue(), null, "maximum", null, 0, 1, ExecutionTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getExecutionTime_Average(), this.getMeasuredValue(), null, "average", null, 0, 1, ExecutionTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(blockingTimeEClass, BlockingTime.class, "BlockingTime", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getBlockingTime_Monitoredresource(), this.getMonitoredResource(), this.getMonitoredResource_Blockingtime(), "monitoredresource", null, 0, 1, BlockingTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getBlockingTime_Minimum(), this.getMeasuredValue(), null, "minimum", null, 0, 1, BlockingTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getBlockingTime_Maximum(), this.getMeasuredValue(), null, "maximum", null, 0, 1, BlockingTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getBlockingTime_Average(), this.getMeasuredValue(), null, "average", null, 0, 1, BlockingTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(responseTimeEClass, ResponseTime.class, "ResponseTime", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getResponseTime_Monitoredresource(), this.getMonitoredResource(), this.getMonitoredResource_Responsetime(), "monitoredresource", null, 0, 1, ResponseTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getResponseTime_Minimum(), this.getMeasuredValue(), null, "minimum", null, 0, 1, ResponseTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getResponseTime_Maximum(), this.getMeasuredValue(), null, "maximum", null, 0, 1, ResponseTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getResponseTime_Average(), this.getMeasuredValue(), null, "average", null, 0, 1, ResponseTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getResponseTime_Jitter(), this.getMeasuredValue(), null, "jitter", null, 0, 1, ResponseTime.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(analysisContextEClass, AnalysisContext.class, "AnalysisContext", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getAnalysisContext_Name(), ecorePackage.getEString(), "name", null, 0, 1, AnalysisContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(measuredValueEClass, MeasuredValue.class, "MeasuredValue", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getMeasuredValue_Unit(), ecorePackage.getEString(), "unit", null, 0, 1, MeasuredValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getMeasuredValue_Value(), ecorePackage.getEFloatObject(), "value", null, 0, 1, MeasuredValue.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		// Create resource
+		createResource(eNS_URI);
+	}
+
+} //MonitoringxmlPackageImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/PeriodImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/PeriodImpl.java
new file mode 100644
index 0000000..2cfa75a
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/PeriodImpl.java
@@ -0,0 +1,470 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoredResource;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.Period;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Period</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.PeriodImpl#getMonitoredresource <em>Monitoredresource</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.PeriodImpl#getMinimum <em>Minimum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.PeriodImpl#getMaximum <em>Maximum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.PeriodImpl#getAverage <em>Average</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.PeriodImpl#getJitter <em>Jitter</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class PeriodImpl extends MinimalEObjectImpl.Container implements Period {
+	/**
+	 * The cached value of the '{@link #getMinimum() <em>Minimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMinimum()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue minimum;
+
+	/**
+	 * The cached value of the '{@link #getMaximum() <em>Maximum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMaximum()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue maximum;
+
+	/**
+	 * The cached value of the '{@link #getAverage() <em>Average</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAverage()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue average;
+
+	/**
+	 * The cached value of the '{@link #getJitter() <em>Jitter</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getJitter()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue jitter;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected PeriodImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return MonitoringxmlPackage.Literals.PERIOD;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MonitoredResource getMonitoredresource() {
+		if (eContainerFeatureID() != MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE) return null;
+		return (MonitoredResource)eInternalContainer();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMonitoredresource(MonitoredResource newMonitoredresource, NotificationChain msgs) {
+		msgs = eBasicSetContainer((InternalEObject)newMonitoredresource, MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE, msgs);
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMonitoredresource(MonitoredResource newMonitoredresource) {
+		if (newMonitoredresource != eInternalContainer() || (eContainerFeatureID() != MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE && newMonitoredresource != null)) {
+			if (EcoreUtil.isAncestor(this, newMonitoredresource))
+				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
+			NotificationChain msgs = null;
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			if (newMonitoredresource != null)
+				msgs = ((InternalEObject)newMonitoredresource).eInverseAdd(this, MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD, MonitoredResource.class, msgs);
+			msgs = basicSetMonitoredresource(newMonitoredresource, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE, newMonitoredresource, newMonitoredresource));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getMinimum() {
+		return minimum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMinimum(MeasuredValue newMinimum, NotificationChain msgs) {
+		MeasuredValue oldMinimum = minimum;
+		minimum = newMinimum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.PERIOD__MINIMUM, oldMinimum, newMinimum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMinimum(MeasuredValue newMinimum) {
+		if (newMinimum != minimum) {
+			NotificationChain msgs = null;
+			if (minimum != null)
+				msgs = ((InternalEObject)minimum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.PERIOD__MINIMUM, null, msgs);
+			if (newMinimum != null)
+				msgs = ((InternalEObject)newMinimum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.PERIOD__MINIMUM, null, msgs);
+			msgs = basicSetMinimum(newMinimum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.PERIOD__MINIMUM, newMinimum, newMinimum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getMaximum() {
+		return maximum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMaximum(MeasuredValue newMaximum, NotificationChain msgs) {
+		MeasuredValue oldMaximum = maximum;
+		maximum = newMaximum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.PERIOD__MAXIMUM, oldMaximum, newMaximum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMaximum(MeasuredValue newMaximum) {
+		if (newMaximum != maximum) {
+			NotificationChain msgs = null;
+			if (maximum != null)
+				msgs = ((InternalEObject)maximum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.PERIOD__MAXIMUM, null, msgs);
+			if (newMaximum != null)
+				msgs = ((InternalEObject)newMaximum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.PERIOD__MAXIMUM, null, msgs);
+			msgs = basicSetMaximum(newMaximum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.PERIOD__MAXIMUM, newMaximum, newMaximum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getAverage() {
+		return average;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetAverage(MeasuredValue newAverage, NotificationChain msgs) {
+		MeasuredValue oldAverage = average;
+		average = newAverage;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.PERIOD__AVERAGE, oldAverage, newAverage);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAverage(MeasuredValue newAverage) {
+		if (newAverage != average) {
+			NotificationChain msgs = null;
+			if (average != null)
+				msgs = ((InternalEObject)average).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.PERIOD__AVERAGE, null, msgs);
+			if (newAverage != null)
+				msgs = ((InternalEObject)newAverage).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.PERIOD__AVERAGE, null, msgs);
+			msgs = basicSetAverage(newAverage, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.PERIOD__AVERAGE, newAverage, newAverage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getJitter() {
+		return jitter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetJitter(MeasuredValue newJitter, NotificationChain msgs) {
+		MeasuredValue oldJitter = jitter;
+		jitter = newJitter;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.PERIOD__JITTER, oldJitter, newJitter);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setJitter(MeasuredValue newJitter) {
+		if (newJitter != jitter) {
+			NotificationChain msgs = null;
+			if (jitter != null)
+				msgs = ((InternalEObject)jitter).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.PERIOD__JITTER, null, msgs);
+			if (newJitter != null)
+				msgs = ((InternalEObject)newJitter).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.PERIOD__JITTER, null, msgs);
+			msgs = basicSetJitter(newJitter, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.PERIOD__JITTER, newJitter, newJitter));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE:
+				if (eInternalContainer() != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+				return basicSetMonitoredresource((MonitoredResource)otherEnd, msgs);
+		}
+		return super.eInverseAdd(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE:
+				return basicSetMonitoredresource(null, msgs);
+			case MonitoringxmlPackage.PERIOD__MINIMUM:
+				return basicSetMinimum(null, msgs);
+			case MonitoringxmlPackage.PERIOD__MAXIMUM:
+				return basicSetMaximum(null, msgs);
+			case MonitoringxmlPackage.PERIOD__AVERAGE:
+				return basicSetAverage(null, msgs);
+			case MonitoringxmlPackage.PERIOD__JITTER:
+				return basicSetJitter(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+		switch (eContainerFeatureID()) {
+			case MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE:
+				return eInternalContainer().eInverseRemove(this, MonitoringxmlPackage.MONITORED_RESOURCE__PERIOD, MonitoredResource.class, msgs);
+		}
+		return super.eBasicRemoveFromContainerFeature(msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE:
+				return getMonitoredresource();
+			case MonitoringxmlPackage.PERIOD__MINIMUM:
+				return getMinimum();
+			case MonitoringxmlPackage.PERIOD__MAXIMUM:
+				return getMaximum();
+			case MonitoringxmlPackage.PERIOD__AVERAGE:
+				return getAverage();
+			case MonitoringxmlPackage.PERIOD__JITTER:
+				return getJitter();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE:
+				setMonitoredresource((MonitoredResource)newValue);
+				return;
+			case MonitoringxmlPackage.PERIOD__MINIMUM:
+				setMinimum((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.PERIOD__MAXIMUM:
+				setMaximum((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.PERIOD__AVERAGE:
+				setAverage((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.PERIOD__JITTER:
+				setJitter((MeasuredValue)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE:
+				setMonitoredresource((MonitoredResource)null);
+				return;
+			case MonitoringxmlPackage.PERIOD__MINIMUM:
+				setMinimum((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.PERIOD__MAXIMUM:
+				setMaximum((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.PERIOD__AVERAGE:
+				setAverage((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.PERIOD__JITTER:
+				setJitter((MeasuredValue)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.PERIOD__MONITOREDRESOURCE:
+				return getMonitoredresource() != null;
+			case MonitoringxmlPackage.PERIOD__MINIMUM:
+				return minimum != null;
+			case MonitoringxmlPackage.PERIOD__MAXIMUM:
+				return maximum != null;
+			case MonitoringxmlPackage.PERIOD__AVERAGE:
+				return average != null;
+			case MonitoringxmlPackage.PERIOD__JITTER:
+				return jitter != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //PeriodImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ResourceImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ResourceImpl.java
similarity index 85%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ResourceImpl.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ResourceImpl.java
index 204086e..e0ceb54 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ResourceImpl.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ResourceImpl.java
@@ -13,17 +13,18 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml.impl;
-
-import monitoringxml.MonitoringPackage;
-import monitoringxml.Resource;
+package org.polarsys.chess.monitoring.monitoringxml.impl;
 
 import org.eclipse.emf.ecore.EClass;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.Resource;
 
 /**
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Resource</b></em>'.
  * <!-- end-user-doc -->
+ * <p>
+ * </p>
  *
  * @generated
  */
@@ -44,7 +45,7 @@
 	 */
 	@Override
 	protected EClass eStaticClass() {
-		return MonitoringPackage.Literals.RESOURCE;
+		return MonitoringxmlPackage.Literals.RESOURCE;
 	}
 
 } //ResourceImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ResponseTimeImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ResponseTimeImpl.java
new file mode 100644
index 0000000..3d2f0f1
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ResponseTimeImpl.java
@@ -0,0 +1,470 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 University of Padova, ITALY                       --
+--                                                                   --
+-- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+package org.polarsys.chess.monitoring.monitoringxml.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+import org.eclipse.emf.ecore.impl.MinimalEObjectImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoredResource;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.ResponseTime;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Response Time</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.ResponseTimeImpl#getMonitoredresource <em>Monitoredresource</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.ResponseTimeImpl#getMinimum <em>Minimum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.ResponseTimeImpl#getMaximum <em>Maximum</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.ResponseTimeImpl#getAverage <em>Average</em>}</li>
+ *   <li>{@link org.polarsys.chess.monitoring.monitoringxml.impl.ResponseTimeImpl#getJitter <em>Jitter</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class ResponseTimeImpl extends MinimalEObjectImpl.Container implements ResponseTime {
+	/**
+	 * The cached value of the '{@link #getMinimum() <em>Minimum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMinimum()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue minimum;
+
+	/**
+	 * The cached value of the '{@link #getMaximum() <em>Maximum</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getMaximum()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue maximum;
+
+	/**
+	 * The cached value of the '{@link #getAverage() <em>Average</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getAverage()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue average;
+
+	/**
+	 * The cached value of the '{@link #getJitter() <em>Jitter</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getJitter()
+	 * @generated
+	 * @ordered
+	 */
+	protected MeasuredValue jitter;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected ResponseTimeImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return MonitoringxmlPackage.Literals.RESPONSE_TIME;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MonitoredResource getMonitoredresource() {
+		if (eContainerFeatureID() != MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE) return null;
+		return (MonitoredResource)eInternalContainer();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMonitoredresource(MonitoredResource newMonitoredresource, NotificationChain msgs) {
+		msgs = eBasicSetContainer((InternalEObject)newMonitoredresource, MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE, msgs);
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMonitoredresource(MonitoredResource newMonitoredresource) {
+		if (newMonitoredresource != eInternalContainer() || (eContainerFeatureID() != MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE && newMonitoredresource != null)) {
+			if (EcoreUtil.isAncestor(this, newMonitoredresource))
+				throw new IllegalArgumentException("Recursive containment not allowed for " + toString());
+			NotificationChain msgs = null;
+			if (eInternalContainer() != null)
+				msgs = eBasicRemoveFromContainer(msgs);
+			if (newMonitoredresource != null)
+				msgs = ((InternalEObject)newMonitoredresource).eInverseAdd(this, MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME, MonitoredResource.class, msgs);
+			msgs = basicSetMonitoredresource(newMonitoredresource, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE, newMonitoredresource, newMonitoredresource));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getMinimum() {
+		return minimum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMinimum(MeasuredValue newMinimum, NotificationChain msgs) {
+		MeasuredValue oldMinimum = minimum;
+		minimum = newMinimum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.RESPONSE_TIME__MINIMUM, oldMinimum, newMinimum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMinimum(MeasuredValue newMinimum) {
+		if (newMinimum != minimum) {
+			NotificationChain msgs = null;
+			if (minimum != null)
+				msgs = ((InternalEObject)minimum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.RESPONSE_TIME__MINIMUM, null, msgs);
+			if (newMinimum != null)
+				msgs = ((InternalEObject)newMinimum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.RESPONSE_TIME__MINIMUM, null, msgs);
+			msgs = basicSetMinimum(newMinimum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.RESPONSE_TIME__MINIMUM, newMinimum, newMinimum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getMaximum() {
+		return maximum;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetMaximum(MeasuredValue newMaximum, NotificationChain msgs) {
+		MeasuredValue oldMaximum = maximum;
+		maximum = newMaximum;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.RESPONSE_TIME__MAXIMUM, oldMaximum, newMaximum);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setMaximum(MeasuredValue newMaximum) {
+		if (newMaximum != maximum) {
+			NotificationChain msgs = null;
+			if (maximum != null)
+				msgs = ((InternalEObject)maximum).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.RESPONSE_TIME__MAXIMUM, null, msgs);
+			if (newMaximum != null)
+				msgs = ((InternalEObject)newMaximum).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.RESPONSE_TIME__MAXIMUM, null, msgs);
+			msgs = basicSetMaximum(newMaximum, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.RESPONSE_TIME__MAXIMUM, newMaximum, newMaximum));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getAverage() {
+		return average;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetAverage(MeasuredValue newAverage, NotificationChain msgs) {
+		MeasuredValue oldAverage = average;
+		average = newAverage;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.RESPONSE_TIME__AVERAGE, oldAverage, newAverage);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setAverage(MeasuredValue newAverage) {
+		if (newAverage != average) {
+			NotificationChain msgs = null;
+			if (average != null)
+				msgs = ((InternalEObject)average).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.RESPONSE_TIME__AVERAGE, null, msgs);
+			if (newAverage != null)
+				msgs = ((InternalEObject)newAverage).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.RESPONSE_TIME__AVERAGE, null, msgs);
+			msgs = basicSetAverage(newAverage, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.RESPONSE_TIME__AVERAGE, newAverage, newAverage));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MeasuredValue getJitter() {
+		return jitter;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetJitter(MeasuredValue newJitter, NotificationChain msgs) {
+		MeasuredValue oldJitter = jitter;
+		jitter = newJitter;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.RESPONSE_TIME__JITTER, oldJitter, newJitter);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setJitter(MeasuredValue newJitter) {
+		if (newJitter != jitter) {
+			NotificationChain msgs = null;
+			if (jitter != null)
+				msgs = ((InternalEObject)jitter).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.RESPONSE_TIME__JITTER, null, msgs);
+			if (newJitter != null)
+				msgs = ((InternalEObject)newJitter).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MonitoringxmlPackage.RESPONSE_TIME__JITTER, null, msgs);
+			msgs = basicSetJitter(newJitter, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MonitoringxmlPackage.RESPONSE_TIME__JITTER, newJitter, newJitter));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE:
+				if (eInternalContainer() != null)
+					msgs = eBasicRemoveFromContainer(msgs);
+				return basicSetMonitoredresource((MonitoredResource)otherEnd, msgs);
+		}
+		return super.eInverseAdd(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE:
+				return basicSetMonitoredresource(null, msgs);
+			case MonitoringxmlPackage.RESPONSE_TIME__MINIMUM:
+				return basicSetMinimum(null, msgs);
+			case MonitoringxmlPackage.RESPONSE_TIME__MAXIMUM:
+				return basicSetMaximum(null, msgs);
+			case MonitoringxmlPackage.RESPONSE_TIME__AVERAGE:
+				return basicSetAverage(null, msgs);
+			case MonitoringxmlPackage.RESPONSE_TIME__JITTER:
+				return basicSetJitter(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eBasicRemoveFromContainerFeature(NotificationChain msgs) {
+		switch (eContainerFeatureID()) {
+			case MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE:
+				return eInternalContainer().eInverseRemove(this, MonitoringxmlPackage.MONITORED_RESOURCE__RESPONSETIME, MonitoredResource.class, msgs);
+		}
+		return super.eBasicRemoveFromContainerFeature(msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE:
+				return getMonitoredresource();
+			case MonitoringxmlPackage.RESPONSE_TIME__MINIMUM:
+				return getMinimum();
+			case MonitoringxmlPackage.RESPONSE_TIME__MAXIMUM:
+				return getMaximum();
+			case MonitoringxmlPackage.RESPONSE_TIME__AVERAGE:
+				return getAverage();
+			case MonitoringxmlPackage.RESPONSE_TIME__JITTER:
+				return getJitter();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE:
+				setMonitoredresource((MonitoredResource)newValue);
+				return;
+			case MonitoringxmlPackage.RESPONSE_TIME__MINIMUM:
+				setMinimum((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.RESPONSE_TIME__MAXIMUM:
+				setMaximum((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.RESPONSE_TIME__AVERAGE:
+				setAverage((MeasuredValue)newValue);
+				return;
+			case MonitoringxmlPackage.RESPONSE_TIME__JITTER:
+				setJitter((MeasuredValue)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE:
+				setMonitoredresource((MonitoredResource)null);
+				return;
+			case MonitoringxmlPackage.RESPONSE_TIME__MINIMUM:
+				setMinimum((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.RESPONSE_TIME__MAXIMUM:
+				setMaximum((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.RESPONSE_TIME__AVERAGE:
+				setAverage((MeasuredValue)null);
+				return;
+			case MonitoringxmlPackage.RESPONSE_TIME__JITTER:
+				setJitter((MeasuredValue)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case MonitoringxmlPackage.RESPONSE_TIME__MONITOREDRESOURCE:
+				return getMonitoredresource() != null;
+			case MonitoringxmlPackage.RESPONSE_TIME__MINIMUM:
+				return minimum != null;
+			case MonitoringxmlPackage.RESPONSE_TIME__MAXIMUM:
+				return maximum != null;
+			case MonitoringxmlPackage.RESPONSE_TIME__AVERAGE:
+				return average != null;
+			case MonitoringxmlPackage.RESPONSE_TIME__JITTER:
+				return jitter != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //ResponseTimeImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ThreadImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ThreadImpl.java
similarity index 85%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ThreadImpl.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ThreadImpl.java
index 9ab67c4..08c5e07 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/impl/ThreadImpl.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/impl/ThreadImpl.java
@@ -13,20 +13,21 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml.impl;
-
-import monitoringxml.MonitoringPackage;
+package org.polarsys.chess.monitoring.monitoringxml.impl;
 
 import org.eclipse.emf.ecore.EClass;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
 
 /**
  * <!-- begin-user-doc -->
  * An implementation of the model object '<em><b>Thread</b></em>'.
  * <!-- end-user-doc -->
+ * <p>
+ * </p>
  *
  * @generated
  */
-public class ThreadImpl extends MonitoredResourceImpl implements monitoringxml.Thread {
+public class ThreadImpl extends MonitoredResourceImpl implements org.polarsys.chess.monitoring.monitoringxml.Thread {
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -43,7 +44,7 @@
 	 */
 	@Override
 	protected EClass eStaticClass() {
-		return MonitoringPackage.Literals.THREAD;
+		return MonitoringxmlPackage.Literals.THREAD;
 	}
 
 } //ThreadImpl
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/popup/actions/LaunchBackpropagation.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/popup/actions/LaunchBackpropagation.java
new file mode 100644
index 0000000..0af9775
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/popup/actions/LaunchBackpropagation.java
@@ -0,0 +1,363 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 Malardalen University, Sweden                       --
+--                                                                   --                      --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+
+package org.polarsys.chess.monitoring.monitoringxml.popup.actions;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.util.Diagnostic;
+import org.eclipse.emf.common.util.EList;
+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.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.m2m.qvt.oml.BasicModelExtent;
+import org.eclipse.m2m.qvt.oml.ExecutionContextImpl;
+import org.eclipse.m2m.qvt.oml.ExecutionDiagnostic;
+import org.eclipse.m2m.qvt.oml.ModelExtent;
+import org.eclipse.m2m.qvt.oml.TransformationExecutor;
+import org.eclipse.m2m.qvt.oml.util.StringBufferLog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+import org.eclipse.ui.model.BaseWorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.xtext.resource.XtextResource;
+import org.osgi.framework.Bundle;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.popup.actions.LaunchBackpropagation;
+import org.polarsys.chess.monitoring.monitoringxml.util.MonitoringxmlResourceFactoryImpl;
+
+public class LaunchBackpropagation implements IObjectActionDelegate {
+
+	private Shell shell;
+	private IFile xmlFile;
+	private IFile chessFile;
+	private IWorkspaceRoot root;
+//	private IWorkbenchPart part;
+//	private ISelection selection;
+
+	private static String XML_MODEL_PATH;
+	private static Resource XML_MODEL_RESOURCE;
+	private static String UML_MODEL_PATH;
+	private static Resource UML_MODEL_RESOURCE;
+
+	/**
+	 * Constructor for Action1.
+	 */
+	public LaunchBackpropagation() {
+		super();
+	}
+
+	public LaunchBackpropagation(final Shell inShell, final IFile inXMLFile, final IFile inCHESSFile, final IWorkspaceRoot inRoot) {
+		this.shell = inShell;
+		this.xmlFile = inXMLFile;
+		this.chessFile = inCHESSFile;
+		this.root = inRoot;
+	}
+
+	/**
+	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+//		this.part = targetPart;
+		this.shell = targetPart.getSite().getShell();
+		ISelectionService service = targetPart.getSite().getWorkbenchWindow().getSelectionService();
+		this.xmlFile = (IFile)((IStructuredSelection)service.getSelection()).getFirstElement();
+		this.root = ResourcesPlugin.getWorkspace().getRoot();	
+	}
+
+	/**
+	 * @see IActionDelegate#run(IAction)
+	 */
+	public void run(IAction action) {
+
+		if (!xmlFile.getLocation().getFileExtension().equals("xml")) {
+			MessageDialog.openError(shell, "The selected file is not XML file. To perform monitoring Analysis and Backpropagation please select the XML file created during the code generation phase. " ,"Monitoring Analysis and Backpropagation has failed");
+		}
+		
+		try {
+			chessFile = handleBrowseFile("Monitoring backpropagation from XML", "Please choose the target model");
+			this.backpropagateMonitoringMeasures(xmlFile, chessFile);
+			MessageDialog.openInformation(shell,"Monitoring backpropagation","The backpropagation has been successfully executed.");
+		} catch(Exception exMB){
+			if(!exMB.getMessage().isEmpty())
+				MessageDialog.openError(shell,"Monitoring backpropagation", exMB.getMessage());	
+			else MessageDialog.openError(shell,"Monitoring backpropagation", "The backpropagation has not been successfully executed.");
+		};
+	}
+
+	/**
+	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+
+	public void backpropagateMonitoringMeasures(final IFile xmlMonFile, final IFile chessModFile) {
+		
+		try{
+			ProgressMonitorDialog progDialog = new ProgressMonitorDialog(shell);
+			progDialog.run(true, true, new IRunnableWithProgress(){ 
+		    public void run(IProgressMonitor monitor) {
+		 
+		        monitor.beginTask("Backpropagating monitored values to the CHESS model ...", 100); 
+		        // execute the task ... 
+		        if (monitor.isCanceled())
+					throw new OperationCanceledException();
+		        
+		    
+		        IPath chessModelPath = chessModFile.getLocation();
+		
+				//QVTo from MXML to CHESS
+				URI transformationURI0 = URI.createURI("platform:/plugin/org.polarsys.chess.monitoring/transforms/MonitoringXML2Chess.qvto");
+				// create executor for the given transformation
+				TransformationExecutor executor0 = new TransformationExecutor(transformationURI0);
+				// define the transformation input (XML model)
+				XML_MODEL_PATH = xmlMonFile.getLocation().toString();
+				URI xmlURI = URI.createFileURI(XML_MODEL_PATH);
+				ExecutionContextImpl context0 = new ExecutionContextImpl();
+			    Resource inXMLResource = readMonitoringXML(xmlURI);
+				EList<EObject> xmlObj = inXMLResource.getContents();
+				XML_MODEL_RESOURCE = inXMLResource;
+
+				// create the input extent with its initial contents for the XML
+				ResourceSet resourceSet = new ResourceSetImpl();
+				ModelExtent xmlMM = new BasicModelExtent(xmlObj);		
+
+				// define the transformation input/output (Chess model)
+				UML_MODEL_PATH = chessModelPath.toString();
+				URI chessURI = URI.createFileURI(UML_MODEL_PATH);
+				//ExecutionContextImpl context0 = new ExecutionContextImpl();
+				Resource inChessResource = resourceSet.getResource(chessURI, true);		
+				EList<EObject> chessObj = inChessResource.getContents();
+				
+				UML_MODEL_RESOURCE = inChessResource;
+
+				// create the input extent with its initial contents for the Chess model
+				ModelExtent chessMM = new BasicModelExtent(chessObj);		
+
+				// setup the execution environment details -> 
+				// configuration properties, logger, monitor object etc.
+				StringBufferLog log = new StringBufferLog(); 
+				context0.setLog(log);
+				//context0.setConfigProperty("propertyName", true);
+				
+				// run the transformation assigned to the executor with the given 
+				// input and output and execution context -> ChangeTheWorld(in, out)
+				// Remark: variable arguments count is supported
+				ExecutionDiagnostic result0 = executor0.execute(context0, xmlMM, chessMM);
+
+				// check the result for success
+				System.out.println(result0.getSeverity()+" "+result0.getCode()+" "+result0.getMessage());
+				if(result0.getSeverity() == Diagnostic.OK) {
+					System.out.println("OK!!");
+					System.out.println(log.getContents());
+					try{
+						inXMLResource.save(Collections.emptyMap());
+					}catch(Exception ex){ 
+						System.out.println(ex.getMessage());
+					}
+					try{
+						inChessResource.save(Collections.emptyMap());
+					}catch(Exception ex){ 
+						System.out.println(ex.getMessage());
+					}
+				}else{
+					System.out.print("ERROR!!");
+					throw new OperationCanceledException(result0.getMessage());
+				}
+	
+				if(monitor.isCanceled())
+					throw new OperationCanceledException();
+				
+        monitor.worked(100);
+        monitor.done(); 
+        
+        }});
+			chessFile.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
+	}catch(Exception ex){//throw new OperationCanceledException("Operation aborted by the user.");};}
+		throw new OperationCanceledException(ex.getMessage());
+	}
+//
+	}
+
+	protected Resource readMonitoringXML(URI uri) {
+		// Initialize the model
+	    MonitoringxmlPackage.eINSTANCE.eClass();
+	    
+	    // Register the resource factory for the .xml extension
+	    Resource.Factory.Registry reg = Resource.Factory.Registry.INSTANCE;
+	    Map<String, Object> m = reg.getExtensionToFactoryMap();
+	    m.put("xml", new MonitoringxmlResourceFactoryImpl());
+
+	    // Obtain a new resource set
+	    ResourceSet resSet = new ResourceSetImpl();
+
+	    // Get the resource
+	    Resource resource = resSet.getResource(uri, true);
+	    return resource;
+	}
+	
+	public IPath getAbsoluteWorkflowPath(String relPath, String bundlename) {
+		Bundle bundle = Platform.getBundle(bundlename);
+		URL fileLocation = null;
+		try {
+			fileLocation = FileLocator.toFileURL(bundle.getEntry(relPath));
+
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+		IPath p = new Path(new File(fileLocation.getFile()).getAbsolutePath());
+		return p;
+
+	}
+	
+	/**
+	 * Sets the specified resource as modified and saves it.
+	 * @param resource Resource to be marked as dirty and saved.
+	 */
+	public void saveResource(XtextResource resource, URI uri)
+	{	
+		// Set the modified flag.
+		resource.setModified(true);
+		try {
+			// Save the resource.
+			Map<Object, Object> saveOptions = new HashMap<Object, Object>();
+			saveOptions.put(XtextResource.OPTION_RESOLVE_ALL , Boolean.TRUE);
+			resource.setURI(uri);
+			resource.save(null);//saveOptions);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private IFile handleBrowseFile(String title, String message) {
+
+		ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(new Shell(), new WorkbenchLabelProvider(), new BaseWorkbenchContentProvider());
+
+		dialog.setTitle(title);
+		dialog.setMessage(message);
+		dialog.setAllowMultiple(false);
+		dialog.addFilter(new ViewerFilter() {
+			@Override
+			public boolean select(Viewer viewer, Object parentElement,
+					Object element) {
+				boolean ret = false;
+				String[] extensions = null;
+				extensions = new String[] { "uml" };
+				try {
+					ret = isUMLResource((IResource) element, extensions);
+				} catch (CoreException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				return ret;
+			}
+		});
+		dialog.setInput(root);
+		dialog.open();
+
+		if(dialog.getReturnCode() == ElementTreeSelectionDialog.CANCEL){
+			return null;
+		}
+
+		Object results = dialog.getFirstResult();
+
+		if ((results != null) && (results instanceof IFile)) {
+			IFile currentFile = (IFile)results;	
+			return currentFile;
+		}
+		else if ((results != null) && ((results instanceof IFolder) || (results instanceof IProject))) {
+			MessageDialog.openError(shell,"Monitoring backpropagation", "The analysis has not been successfully executed. Please select a valid target model.");
+			return null;
+		}
+
+		return null;
+	}
+	
+	private static boolean isUMLResource(IResource resource, String[] extensions)
+			throws CoreException {
+		if (resource instanceof IContainer) {
+			if (((IContainer) resource).isAccessible()) {
+				IResource[] members = ((IContainer) resource).members();
+				for (IResource member : members) {
+					if (isUMLResource(member, extensions)) {
+						return true;
+					}
+				}
+			}
+		} else if (resource instanceof IFile) {
+			IFile currentFile = (IFile) resource;
+			if (extensions == null) {
+				return true;
+			} else if (currentFile.getFileExtension() != null) {
+				for (int i = 0; i < extensions.length; i++) {
+					String extension = extensions[i];
+					if (currentFile.getFileExtension().toUpperCase().equals(
+							extension.toUpperCase())) {
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+	
+	public static String getXMLPath(){
+		return XML_MODEL_PATH;
+	}
+	
+	public static Resource getXMLResource(){
+		return XML_MODEL_RESOURCE;
+	}
+
+	public static String getModelPath(){
+		return UML_MODEL_PATH;
+	}
+	
+	public static Resource getModelResource(){
+		return UML_MODEL_RESOURCE;
+	}
+}
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/popup/actions/LaunchTraceAnalysis.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/popup/actions/LaunchTraceAnalysis.java
new file mode 100644
index 0000000..2e82ada
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/popup/actions/LaunchTraceAnalysis.java
@@ -0,0 +1,228 @@
+/*
+-----------------------------------------------------------------------
+--                    CHESS monitoring plugin                        --
+--                                                                   --
+--                    Copyright (C) 2015-2016                        --
+--                 Malardalen University, Sweden                       --
+--                                                                   --                      --
+--                                                                   --
+-- All rights reserved. This program and the accompanying materials  --
+-- are made available under the terms of the Eclipse Public License  --
+-- v1.0 which accompanies this distribution, and is available at     --
+-- http://www.eclipse.org/legal/epl-v10.html                         --
+-----------------------------------------------------------------------
+  */ 
+
+package org.polarsys.chess.monitoring.monitoringxml.popup.actions;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+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.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.dialogs.ElementTreeSelectionDialog;
+import org.eclipse.ui.model.BaseWorkbenchContentProvider;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.xtext.resource.XtextResource;
+import org.polarsys.chess.monitoring.traceanalyser.TraceAnalyser;
+
+public class LaunchTraceAnalysis implements IObjectActionDelegate {
+
+	private Shell shell;
+	private IFile traceFile;
+	private IFile inXMLFile;
+	private String outXMLFileName;
+	private IWorkspaceRoot root;
+//	private IWorkbenchPart part;
+//	private ISelection selection;
+
+	private static String XML_MODEL_PATH;
+	private static Resource XML_MODEL_RESOURCE;
+	private static String UML_MODEL_PATH;
+	private static Resource UML_MODEL_RESOURCE;
+
+	/**
+	 * Constructor for Action1.
+	 */
+	public LaunchTraceAnalysis() {
+		super();
+	}
+
+	public LaunchTraceAnalysis(final Shell inShell, final IFile inTraceFile, final IWorkspaceRoot inRoot) {
+		this.shell = inShell;
+		this.traceFile = inTraceFile;
+		this.root = inRoot;
+	}
+
+	/**
+	 * @see IObjectActionDelegate#setActivePart(IAction, IWorkbenchPart)
+	 */
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+//		this.part = targetPart;
+		this.shell = targetPart.getSite().getShell();
+		ISelectionService service = targetPart.getSite().getWorkbenchWindow().getSelectionService();
+		this.traceFile = (IFile)((IStructuredSelection)service.getSelection()).getFirstElement();
+		this.root = ResourcesPlugin.getWorkspace().getRoot();	
+	}
+
+	/**
+	 * @see IActionDelegate#run(IAction)
+	 */
+	public void run(IAction action) {
+//		IPath path = xmlFile.getLocation();
+
+//		ResourceSet resourceSet = new ResourceSetImpl();
+//		URI xmlURI = URI.createFileURI(path.toString());
+//		Resource inXMLResource = resourceSet.getResource(xmlURI, true);		
+
+		if (!traceFile.getLocation().getFileExtension().equals("txt")) {
+			MessageDialog.openError(shell, "The selected file is not a TXT file. To perform monitoring Analysis please select the TXT file containing execution traces. " ,"Monitoring Analysis has failed");
+		}
+		
+		//final LaunchTraceAnalysis mab = new LaunchTraceAnalysis(shell, traceFile, root);
+		try {
+			this.inXMLFile = handleBrowseFile("Monitoring trace analysis", "Please choose the input XML list of threads");
+			this.outXMLFileName = inXMLFile.getName();
+			TraceAnalyser ta = new TraceAnalyser(shell, inXMLFile, outXMLFileName, traceFile);
+			ta.doTraceAnalysis();
+			MessageDialog.openInformation(shell,"Monitoring trace analysis","The analysis has been successfully executed.");
+		} catch(Exception exMA){
+			System.out.println(exMA.getMessage());
+			if(!exMA.getMessage().isEmpty())
+				MessageDialog.openError(shell,"Monitoring analysis", exMA.getMessage());	
+			else MessageDialog.openError(shell,"Monitoring analysis", "The analysis has not been successfully executed.");
+		};
+	}
+
+	/**
+	 * @see IActionDelegate#selectionChanged(IAction, ISelection)
+	 */
+	public void selectionChanged(IAction action, ISelection selection) {
+	}
+
+	/**
+	 * Sets the specified resource as modified and saves it.
+	 * @param resource Resource to be marked as dirty and saved.
+	 */
+	public void saveResource(XtextResource resource, URI uri)
+	{	
+		// Set the modified flag.
+		resource.setModified(true);
+		try {
+			// Save the resource.
+			Map<Object, Object> saveOptions = new HashMap<Object, Object>();
+			saveOptions.put(XtextResource.OPTION_RESOLVE_ALL , Boolean.TRUE);
+			resource.setURI(uri);
+			resource.save(null);//saveOptions);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+	
+	private IFile handleBrowseFile(String title, String message) {
+
+		ElementTreeSelectionDialog dialog = new ElementTreeSelectionDialog(new Shell(), new WorkbenchLabelProvider(), new BaseWorkbenchContentProvider());
+
+		dialog.setTitle(title);
+		dialog.setMessage(message);
+		dialog.setAllowMultiple(false);
+		dialog.addFilter(new ViewerFilter() {
+			@Override
+			public boolean select(Viewer viewer, Object parentElement,
+					Object element) {
+				boolean ret = false;
+				String[] extensions = null;
+				extensions = new String[] { "xml" };
+				try {
+					ret = isXMLResource((IResource) element, extensions);
+				} catch (CoreException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				return ret;
+			}
+		});
+		dialog.setInput(root);
+		dialog.open();
+
+		if(dialog.getReturnCode() == ElementTreeSelectionDialog.CANCEL){
+			return null;
+		}
+
+		Object results = dialog.getFirstResult();
+
+		if ((results != null) && (results instanceof IFile)) {
+			IFile currentFile = (IFile)results;	
+			return currentFile;
+		}
+		else if ((results != null) && ((results instanceof IFolder) || (results instanceof IProject))) {
+			MessageDialog.openError(shell,"Monitoring backpropagation", "The analysis has not been successfully executed. Please select a valid source XML.");
+			return null;
+		}
+
+		return null;
+	}
+	
+	private static boolean isXMLResource(IResource resource, String[] extensions)
+			throws CoreException {
+		if (resource instanceof IContainer) {
+			if (((IContainer) resource).isAccessible()) {
+				IResource[] members = ((IContainer) resource).members();
+				for (IResource member : members) {
+					if (isXMLResource(member, extensions)) {
+						return true;
+					}
+				}
+			}
+		} else if (resource instanceof IFile) {
+			IFile currentFile = (IFile) resource;
+			if (extensions == null) {
+				return true;
+			} else if (currentFile.getFileExtension() != null) {
+				for (int i = 0; i < extensions.length; i++) {
+					String extension = extensions[i];
+					if (currentFile.getFileExtension().toUpperCase().equals(
+							extension.toUpperCase())) {
+						return true;
+					}
+				}
+			}
+		}
+		return false;
+	}
+	
+	public static String getXMLPath(){
+		return XML_MODEL_PATH;
+	}
+	
+	public static Resource getXMLResource(){
+		return XML_MODEL_RESOURCE;
+	}
+
+	public static String getModelPath(){
+		return UML_MODEL_PATH;
+	}
+	
+	public static Resource getModelResource(){
+		return UML_MODEL_RESOURCE;
+	}
+}
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/util/MonitoringAdapterFactory.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlAdapterFactory.java
similarity index 64%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/util/MonitoringAdapterFactory.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlAdapterFactory.java
index d7b3312..0d715b4 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/util/MonitoringAdapterFactory.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlAdapterFactory.java
@@ -3,9 +3,8 @@
 --                    CHESS monitoring plugin                        --
 --                                                                   --
 --                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
+--                 Malardalen University, Sweden                       --
+--                                                                   --                      --
 --                                                                   --
 -- All rights reserved. This program and the accompanying materials  --
 -- are made available under the terms of the Eclipse Public License  --
@@ -13,41 +12,39 @@
 -- http://www.eclipse.org/legal/epl-v10.html                         --
 -----------------------------------------------------------------------
   */ 
-package monitoringxml.util;
-
-import monitoringxml.AnalysisContext;
-import monitoringxml.BlockingTime;
-import monitoringxml.ExecutionTime;
-import monitoringxml.MonitoredResource;
-import monitoringxml.Monitoring;
-import monitoringxml.MonitoringPackage;
-import monitoringxml.Period;
-import monitoringxml.Resource;
-import monitoringxml.ResponseTime;
+package org.polarsys.chess.monitoring.monitoringxml.util;
 
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notifier;
-
 import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-
 import org.eclipse.emf.ecore.EObject;
+import org.polarsys.chess.monitoring.monitoringxml.AnalysisContext;
+import org.polarsys.chess.monitoring.monitoringxml.BlockingTime;
+import org.polarsys.chess.monitoring.monitoringxml.ExecutionTime;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoredResource;
+import org.polarsys.chess.monitoring.monitoringxml.Monitoring;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.Period;
+import org.polarsys.chess.monitoring.monitoringxml.Resource;
+import org.polarsys.chess.monitoring.monitoringxml.ResponseTime;
 
 /**
  * <!-- begin-user-doc -->
  * The <b>Adapter Factory</b> for the model.
  * It provides an adapter <code>createXXX</code> method for each class of the model.
  * <!-- end-user-doc -->
- * @see monitoringxml.MonitoringPackage
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage
  * @generated
  */
-public class MonitoringAdapterFactory extends AdapterFactoryImpl {
+public class MonitoringxmlAdapterFactory extends AdapterFactoryImpl {
 	/**
 	 * The cached model package.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	protected static MonitoringPackage modelPackage;
+	protected static MonitoringxmlPackage modelPackage;
 
 	/**
 	 * Creates an instance of the adapter factory.
@@ -55,9 +52,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public MonitoringAdapterFactory() {
+	public MonitoringxmlAdapterFactory() {
 		if (modelPackage == null) {
-			modelPackage = MonitoringPackage.eINSTANCE;
+			modelPackage = MonitoringxmlPackage.eINSTANCE;
 		}
 	}
 
@@ -86,14 +83,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	protected MonitoringSwitch<Adapter> modelSwitch =
-		new MonitoringSwitch<Adapter>() {
+	protected MonitoringxmlSwitch<Adapter> modelSwitch =
+		new MonitoringxmlSwitch<Adapter>() {
 			@Override
 			public Adapter caseMonitoring(Monitoring object) {
 				return createMonitoringAdapter();
 			}
 			@Override
-			public Adapter caseThread(monitoringxml.Thread object) {
+			public Adapter caseThread(org.polarsys.chess.monitoring.monitoringxml.Thread object) {
 				return createThreadAdapter();
 			}
 			@Override
@@ -125,6 +122,10 @@
 				return createAnalysisContextAdapter();
 			}
 			@Override
+			public Adapter caseMeasuredValue(MeasuredValue object) {
+				return createMeasuredValueAdapter();
+			}
+			@Override
 			public Adapter defaultCase(EObject object) {
 				return createEObjectAdapter();
 			}
@@ -145,13 +146,13 @@
 
 
 	/**
-	 * Creates a new adapter for an object of class '{@link monitoringxml.Monitoring <em>Monitoring</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.Monitoring <em>Monitoring</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see monitoringxml.Monitoring
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Monitoring
 	 * @generated
 	 */
 	public Adapter createMonitoringAdapter() {
@@ -159,13 +160,13 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link monitoringxml.Thread <em>Thread</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.Thread <em>Thread</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see monitoringxml.Thread
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Thread
 	 * @generated
 	 */
 	public Adapter createThreadAdapter() {
@@ -173,13 +174,13 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link monitoringxml.Resource <em>Resource</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.Resource <em>Resource</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see monitoringxml.Resource
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Resource
 	 * @generated
 	 */
 	public Adapter createResourceAdapter() {
@@ -187,13 +188,13 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link monitoringxml.Period <em>Period</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.Period <em>Period</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see monitoringxml.Period
+	 * @see org.polarsys.chess.monitoring.monitoringxml.Period
 	 * @generated
 	 */
 	public Adapter createPeriodAdapter() {
@@ -201,13 +202,13 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link monitoringxml.MonitoredResource <em>Monitored Resource</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.MonitoredResource <em>Monitored Resource</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see monitoringxml.MonitoredResource
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MonitoredResource
 	 * @generated
 	 */
 	public Adapter createMonitoredResourceAdapter() {
@@ -215,13 +216,13 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link monitoringxml.ExecutionTime <em>Execution Time</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.ExecutionTime <em>Execution Time</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see monitoringxml.ExecutionTime
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ExecutionTime
 	 * @generated
 	 */
 	public Adapter createExecutionTimeAdapter() {
@@ -229,13 +230,13 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link monitoringxml.BlockingTime <em>Blocking Time</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.BlockingTime <em>Blocking Time</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see monitoringxml.BlockingTime
+	 * @see org.polarsys.chess.monitoring.monitoringxml.BlockingTime
 	 * @generated
 	 */
 	public Adapter createBlockingTimeAdapter() {
@@ -243,13 +244,13 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link monitoringxml.ResponseTime <em>Response Time</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.ResponseTime <em>Response Time</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see monitoringxml.ResponseTime
+	 * @see org.polarsys.chess.monitoring.monitoringxml.ResponseTime
 	 * @generated
 	 */
 	public Adapter createResponseTimeAdapter() {
@@ -257,13 +258,13 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link monitoringxml.AnalysisContext <em>Analysis Context</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.AnalysisContext <em>Analysis Context</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see monitoringxml.AnalysisContext
+	 * @see org.polarsys.chess.monitoring.monitoringxml.AnalysisContext
 	 * @generated
 	 */
 	public Adapter createAnalysisContextAdapter() {
@@ -271,6 +272,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.polarsys.chess.monitoring.monitoringxml.MeasuredValue <em>Measured Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.polarsys.chess.monitoring.monitoringxml.MeasuredValue
+	 * @generated
+	 */
+	public Adapter createMeasuredValueAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for the default case.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null.
@@ -282,4 +297,4 @@
 		return null;
 	}
 
-} //MonitoringAdapterFactory
+} //MonitoringxmlAdapterFactory
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlResourceFactoryImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlResourceFactoryImpl.java
new file mode 100644
index 0000000..b8256ca
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlResourceFactoryImpl.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ *                  CHESS monitoring plugin
+ *
+ *               Copyright (C) 2015-2016
+ *            Malardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+/**
+ */
+package org.polarsys.chess.monitoring.monitoringxml.util;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
+import org.eclipse.emf.ecore.xmi.XMIResource;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Resource Factory</b> associated with the package.
+ * <!-- end-user-doc -->
+ * @see org.polarsys.chess.monitoring.monitoringxml.util.MonitoringxmlResourceImpl
+ * @generated
+ */
+public class MonitoringxmlResourceFactoryImpl extends ResourceFactoryImpl {
+	
+		/**
+		 * Creates an instance of the resource factory.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		public MonitoringxmlResourceFactoryImpl() {
+			super();
+		}
+
+		/**
+		 * Creates an instance of the resource.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		@Override
+		public Resource createResource(URI uri) {
+			XMIResource result = new MonitoringxmlResourceImpl(uri);
+			result.getDefaultSaveOptions().put(XMIResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
+			result.getDefaultLoadOptions().put(XMIResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE);
+
+			result.getDefaultSaveOptions().put(XMIResource.OPTION_SCHEMA_LOCATION, Boolean.TRUE);
+
+			result.getDefaultLoadOptions().put(XMIResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
+			result.getDefaultSaveOptions().put(XMIResource.OPTION_USE_ENCODED_ATTRIBUTE_STYLE, Boolean.TRUE);
+
+			result.getDefaultLoadOptions().put(XMIResource.OPTION_USE_LEXICAL_HANDLER, Boolean.TRUE);
+			return result;
+		}
+
+}
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlResourceImpl.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlResourceImpl.java
new file mode 100644
index 0000000..5602b47
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlResourceImpl.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ *                  CHESS monitoring plugin
+ *
+ *               Copyright (C) 2015-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.polarsys.chess.monitoring.monitoringxml.util;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
+
+/**
+ * <!-- begin-user-doc -->
+ * The <b>Resource </b> associated with the package.
+ * <!-- end-user-doc -->
+ * @see org.polarsys.chess.monitoring.monitoringxml.util.MonitoringxmlResourceFactoryImpl
+ * @generated
+ */
+public class MonitoringxmlResourceImpl extends XMIResourceImpl {
+
+	/**
+	 * Creates an instance of the resource.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param uri the URI of the new resource.
+	 * @generated
+	 */
+	public MonitoringxmlResourceImpl(URI uri) {
+		super(uri);
+	}
+
+}
diff --git a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/util/MonitoringSwitch.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlSwitch.java
similarity index 73%
rename from plugins/org.polarsys.chess.monitoring/src/monitoringxml/util/MonitoringSwitch.java
rename to plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlSwitch.java
index 4ddd963..f825c0c 100644
--- a/plugins/org.polarsys.chess.monitoring/src/monitoringxml/util/MonitoringSwitch.java
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/monitoringxml/util/MonitoringxmlSwitch.java
@@ -1,34 +1,30 @@
-/*
------------------------------------------------------------------------
---                    CHESS monitoring plugin                        --
---                                                                   --
---                    Copyright (C) 2015-2016                        --
---                 University of Padova, ITALY                       --
---                                                                   --
--- Author: Alessandro Zovi azovi@math.unipd.it                       --
---                                                                   --
--- All rights reserved. This program and the accompanying materials  --
--- are made available under the terms of the Eclipse Public License  --
--- v1.0 which accompanies this distribution, and is available at     --
--- http://www.eclipse.org/legal/epl-v10.html                         --
------------------------------------------------------------------------
-  */ 
-package monitoringxml.util;
-
-import monitoringxml.AnalysisContext;
-import monitoringxml.BlockingTime;
-import monitoringxml.ExecutionTime;
-import monitoringxml.MonitoredResource;
-import monitoringxml.Monitoring;
-import monitoringxml.MonitoringPackage;
-import monitoringxml.Period;
-import monitoringxml.Resource;
-import monitoringxml.ResponseTime;
+/*******************************************************************************
+ *                  CHESS monitoring plugin
+ *
+ *               Copyright (C) 2015-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.polarsys.chess.monitoring.monitoringxml.util;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
-
 import org.eclipse.emf.ecore.util.Switch;
+import org.polarsys.chess.monitoring.monitoringxml.AnalysisContext;
+import org.polarsys.chess.monitoring.monitoringxml.BlockingTime;
+import org.polarsys.chess.monitoring.monitoringxml.ExecutionTime;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoredResource;
+import org.polarsys.chess.monitoring.monitoringxml.Monitoring;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage;
+import org.polarsys.chess.monitoring.monitoringxml.Period;
+import org.polarsys.chess.monitoring.monitoringxml.Resource;
+import org.polarsys.chess.monitoring.monitoringxml.ResponseTime;
 
 /**
  * <!-- begin-user-doc -->
@@ -40,17 +36,17 @@
  * until a non-null result is returned,
  * which is the result of the switch.
  * <!-- end-user-doc -->
- * @see monitoringxml.MonitoringPackage
+ * @see org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlPackage
  * @generated
  */
-public class MonitoringSwitch<T> extends Switch<T> {
+public class MonitoringxmlSwitch<T> extends Switch<T> {
 	/**
 	 * The cached model package
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	protected static MonitoringPackage modelPackage;
+	protected static MonitoringxmlPackage modelPackage;
 
 	/**
 	 * Creates an instance of the switch.
@@ -58,9 +54,9 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public MonitoringSwitch() {
+	public MonitoringxmlSwitch() {
 		if (modelPackage == null) {
-			modelPackage = MonitoringPackage.eINSTANCE;
+			modelPackage = MonitoringxmlPackage.eINSTANCE;
 		}
 	}
 
@@ -68,7 +64,7 @@
 	 * Checks whether this is a switch for the given package.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param ePackage the package in question.
+	 * @parameter ePackage the package in question.
 	 * @return whether this is a switch for the given package.
 	 * @generated
 	 */
@@ -87,62 +83,68 @@
 	@Override
 	protected T doSwitch(int classifierID, EObject theEObject) {
 		switch (classifierID) {
-			case MonitoringPackage.MONITORING: {
+			case MonitoringxmlPackage.MONITORING: {
 				Monitoring monitoring = (Monitoring)theEObject;
 				T result = caseMonitoring(monitoring);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case MonitoringPackage.THREAD: {
-				monitoringxml.Thread thread = (monitoringxml.Thread)theEObject;
+			case MonitoringxmlPackage.THREAD: {
+				org.polarsys.chess.monitoring.monitoringxml.Thread thread = (org.polarsys.chess.monitoring.monitoringxml.Thread)theEObject;
 				T result = caseThread(thread);
 				if (result == null) result = caseMonitoredResource(thread);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case MonitoringPackage.RESOURCE: {
+			case MonitoringxmlPackage.RESOURCE: {
 				Resource resource = (Resource)theEObject;
 				T result = caseResource(resource);
 				if (result == null) result = caseMonitoredResource(resource);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case MonitoringPackage.PERIOD: {
+			case MonitoringxmlPackage.PERIOD: {
 				Period period = (Period)theEObject;
 				T result = casePeriod(period);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case MonitoringPackage.MONITORED_RESOURCE: {
+			case MonitoringxmlPackage.MONITORED_RESOURCE: {
 				MonitoredResource monitoredResource = (MonitoredResource)theEObject;
 				T result = caseMonitoredResource(monitoredResource);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case MonitoringPackage.EXECUTION_TIME: {
+			case MonitoringxmlPackage.EXECUTION_TIME: {
 				ExecutionTime executionTime = (ExecutionTime)theEObject;
 				T result = caseExecutionTime(executionTime);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case MonitoringPackage.BLOCKING_TIME: {
+			case MonitoringxmlPackage.BLOCKING_TIME: {
 				BlockingTime blockingTime = (BlockingTime)theEObject;
 				T result = caseBlockingTime(blockingTime);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case MonitoringPackage.RESPONSE_TIME: {
+			case MonitoringxmlPackage.RESPONSE_TIME: {
 				ResponseTime responseTime = (ResponseTime)theEObject;
 				T result = caseResponseTime(responseTime);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case MonitoringPackage.ANALYSIS_CONTEXT: {
+			case MonitoringxmlPackage.ANALYSIS_CONTEXT: {
 				AnalysisContext analysisContext = (AnalysisContext)theEObject;
 				T result = caseAnalysisContext(analysisContext);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case MonitoringxmlPackage.MEASURED_VALUE: {
+				MeasuredValue measuredValue = (MeasuredValue)theEObject;
+				T result = caseMeasuredValue(measuredValue);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			default: return defaultCase(theEObject);
 		}
 	}
@@ -173,7 +175,7 @@
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public T caseThread(monitoringxml.Thread object) {
+	public T caseThread(org.polarsys.chess.monitoring.monitoringxml.Thread object) {
 		return null;
 	}
 
@@ -283,6 +285,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Measured Value</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Measured Value</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseMeasuredValue(MeasuredValue object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
@@ -298,4 +315,4 @@
 		return null;
 	}
 
-} //MonitoringSwitch
+} //MonitoringxmlSwitch
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/Event.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/Event.java
new file mode 100644
index 0000000..ed5a8c4
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/Event.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ *                  CHESS monitoring plugin
+ *
+ *               Copyright (C) 2015-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.polarsys.chess.monitoring.traceanalyser;
+
+public class Event
+{
+	private long timeStamp; 
+	private int eventID;
+	private String threadID; 
+
+	public Event(long inTimeStamp, int inEventId, String inThreadID ) 
+	{
+		this.timeStamp = inTimeStamp; 
+		this.eventID = inEventId; 
+		this.threadID = inThreadID; 
+	}
+	
+	public long GetTimeStamp()
+	{
+		return timeStamp; 
+	}
+	
+	public int GetEventID()
+	{
+		return eventID; 
+	}
+	
+	public String GetThreadID()
+	{
+		return threadID; 
+	}	
+	
+	public void PrintEvent()
+	{
+		System.out.println("TimeStamp:"+timeStamp+"\tEventID:"+eventID+"\t ThreadID:"+threadID);
+	}
+	
+}
+
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/EventType.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/EventType.java
new file mode 100644
index 0000000..6e8df22
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/EventType.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ *                  CHESS monitoring plugin
+ *
+ *               Copyright (C) 2015-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.polarsys.chess.monitoring.traceanalyser;
+
+public final class EventType {
+	public static final int runningEventID = 0; 
+	public static final int readyEventID   = 1; 
+	public static final int blockedEventID = 2; 
+	public static final int sleepEventID   = 3; 
+	public static final int wakeupEventID  = 4; 
+}
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/Parameters.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/Parameters.java
new file mode 100644
index 0000000..61e3eaa
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/Parameters.java
@@ -0,0 +1,470 @@
+/*******************************************************************************
+ *                  CHESS monitoring plugin
+ *
+ *               Copyright (C) 2015-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.polarsys.chess.monitoring.traceanalyser;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.polarsys.chess.monitoring.traceanalyser.Event;
+import org.polarsys.chess.monitoring.traceanalyser.EventType;
+import org.polarsys.chess.monitoring.traceanalyser.ThreadEvents;
+import org.polarsys.chess.monitoring.traceanalyser.TraceReader;
+
+public class Parameters
+{ 
+	private TraceReader trace; 
+	private ArrayList<String> threadIDs; 
+	private ArrayList<ArrayList<Event>> threadSpecificEvents ; 
+
+	private ArrayList<Long> wcetOfAllThreads; 
+	private ArrayList<Long> bcetOfAllThreads; 
+	private ArrayList<Double> acetOfAllThreads; 
+
+	private ArrayList<Long> minimumInterArrivalTimeOfAllThreads; 
+	private ArrayList<Long> maximumInterArrivalTimeOfAllThreads; 
+	private ArrayList<Double> averageInterArrivalTimeOfAllThreads; 
+	private ArrayList<Long> releaseJitterOfAllThreads; 
+
+	private ArrayList<Long> minimumBlockingOfAllThreads; 
+	private ArrayList<Long> maximumBlockingOfAllThreads; 
+	private ArrayList<Double> averageBlockingOfAllThreads; 
+
+	private ArrayList<Long> worstCaseResponseTimetOfAllThreads; 
+	private ArrayList<Long> bestCaseResponseTimetOfAllThreads; 
+	private ArrayList<Long> jitterInResponseTimetOfAllThreads; 
+	private ArrayList<Double> averageCaseResponseTimetOfAllThreads; 
+
+	private ArrayList<Double> varianceInExecutionTimeOfAllThreads;
+	private ArrayList<Double> varianceInArrivalTimeOfAllThreads;
+	private ArrayList<Double> varianceInBlockingOfAllThreads;
+	private ArrayList<Double> varianceInResponseTimeOfAllThreads;
+	
+	private double clockRate; 	
+	private IFolder traceExtractionPath; // This path is used to output files that contains all the values of execution time, inter-arrival time and response time
+	private int noOfThreads; 
+
+	public Parameters(TraceReader inTrace, IFolder inTraceExtractionPath) 
+	{
+		this.trace = inTrace; 
+		threadSpecificEvents = trace.GetThreadSpecificEvents();
+		threadIDs = trace.GetThreadIDs(); 
+		noOfThreads = threadIDs.size();
+		clockRate = trace.GetClockRate(); 
+
+		this.traceExtractionPath = inTraceExtractionPath; 
+
+		/* Execution related parameters */
+		wcetOfAllThreads = new ArrayList<Long>(noOfThreads);
+		bcetOfAllThreads = new ArrayList<Long>(noOfThreads);
+		acetOfAllThreads = new ArrayList<Double>(noOfThreads);
+
+		/* Arrival time related parameters */
+		minimumInterArrivalTimeOfAllThreads = new ArrayList<Long>(noOfThreads);
+		maximumInterArrivalTimeOfAllThreads = new ArrayList<Long>(noOfThreads);
+		averageInterArrivalTimeOfAllThreads = new ArrayList<Double>(noOfThreads); 
+		releaseJitterOfAllThreads = new ArrayList<Long>(noOfThreads);
+
+		/* Block related parameters */
+		minimumBlockingOfAllThreads  = new ArrayList<Long>(noOfThreads); 
+		maximumBlockingOfAllThreads  = new ArrayList<Long>(noOfThreads); 
+		averageBlockingOfAllThreads  = new ArrayList<Double>(noOfThreads); 
+
+		/* Response time related parameters */
+		worstCaseResponseTimetOfAllThreads = new ArrayList<Long>(noOfThreads); 
+		bestCaseResponseTimetOfAllThreads = new ArrayList<Long>(noOfThreads);
+		jitterInResponseTimetOfAllThreads = new ArrayList<Long>(noOfThreads);
+		averageCaseResponseTimetOfAllThreads = new ArrayList<Double>(noOfThreads);
+
+		/* Variance related parameters */
+		varianceInExecutionTimeOfAllThreads = new ArrayList<Double>(noOfThreads); 
+		varianceInArrivalTimeOfAllThreads = new ArrayList<Double>(noOfThreads); 
+		varianceInBlockingOfAllThreads = new ArrayList<Double>(noOfThreads); 
+		varianceInResponseTimeOfAllThreads = new ArrayList<Double>(noOfThreads); 
+	}
+
+	public void ComputeParameters()
+	{
+		ComputeArrivalTimeRelatedParameters();
+		ComputeExecutionTimeRelatedParameters();
+	}
+	
+	private void ComputeArrivalTimeRelatedParameters() 
+	{
+		ArrayList<Long> arrivalTimeOfThread = new ArrayList<Long>(); 
+		ArrayList<Long> responseTimeOfThread = new ArrayList<Long>(); 
+
+		long previousWakeupTime = -1, currentWakeupTime = -1, lastSleepTime = -1 ;
+		String threadID = null; 
+
+		for(ArrayList<Event> threadEvents : threadSpecificEvents) // check each task 
+		{
+			threadID = threadIDs.get(threadSpecificEvents.indexOf(threadEvents));  
+			ThreadEvents events = new ThreadEvents(threadID,threadEvents);
+
+			for(Event event : events.GetWakeupEvents()) // check blocked events of a task 
+			{
+				currentWakeupTime = event.GetTimeStamp();  
+
+				if(previousWakeupTime != (long)-1)
+				{
+					arrivalTimeOfThread.add(currentWakeupTime - previousWakeupTime); 
+
+					lastSleepTime = events.GetLastSleepEventInGivenInterval(previousWakeupTime, currentWakeupTime);
+
+					if(lastSleepTime !=-1)
+					{
+						responseTimeOfThread.add(lastSleepTime - previousWakeupTime);
+
+						if(events.GetWakeupEvents().indexOf(event) == events.GetWakeupEvents().size()-1) // if there exists any sleep event after the last wakeup event 
+						{
+							lastSleepTime = events.FindLastSleepIfAnyAvailable(currentWakeupTime); 
+							if(lastSleepTime != -1)
+							{
+								responseTimeOfThread.add(lastSleepTime - currentWakeupTime);
+							}
+						}
+					}
+					else 
+						System.out.println("Warning: No Ready event and/or sleep event exists between two wakeup events \t "+ previousWakeupTime + "\t"+ currentWakeupTime);
+				}
+				previousWakeupTime = currentWakeupTime; 
+			}
+
+			// Writing all values in the file
+			try 
+			{
+				WriteAllValuesInFile(arrivalTimeOfThread, traceExtractionPath, "InterArrivalTime_"+ threadID +".txt");
+				WriteAllValuesInFile(responseTimeOfThread, traceExtractionPath, "ResponseTime_"+ threadID +".txt");
+			} 
+			catch (IOException e) 
+			{
+				e.printStackTrace();
+			}
+
+			if(arrivalTimeOfThread.isEmpty())
+			{
+				minimumInterArrivalTimeOfAllThreads.add((long) 0.0);
+				maximumInterArrivalTimeOfAllThreads.add((long) 0.0);
+				averageInterArrivalTimeOfAllThreads.add(0.0);
+				releaseJitterOfAllThreads.add((long) 0.0); 
+				varianceInArrivalTimeOfAllThreads.add(0.0); 
+			}
+			else
+			{
+				minimumInterArrivalTimeOfAllThreads.add(Collections.min(arrivalTimeOfThread));
+				maximumInterArrivalTimeOfAllThreads.add(Collections.max(arrivalTimeOfThread));
+				averageInterArrivalTimeOfAllThreads.add( (double)Sum(arrivalTimeOfThread)/(double)arrivalTimeOfThread.size() );
+				releaseJitterOfAllThreads.add(Collections.max(arrivalTimeOfThread)-Collections.min(arrivalTimeOfThread)); 
+				varianceInArrivalTimeOfAllThreads.add(ComputeVariance(arrivalTimeOfThread)); 
+			}
+
+			if(responseTimeOfThread.isEmpty())
+			{
+				worstCaseResponseTimetOfAllThreads.add((long) 0.0); 
+				bestCaseResponseTimetOfAllThreads.add((long) 0.0); 
+				averageCaseResponseTimetOfAllThreads.add(0.0); 
+				jitterInResponseTimetOfAllThreads.add((long)0.0);
+				varianceInResponseTimeOfAllThreads.add(0.0); 
+			}
+			else 
+			{
+				worstCaseResponseTimetOfAllThreads.add(Collections.max(responseTimeOfThread)); 
+				bestCaseResponseTimetOfAllThreads.add(Collections.min(responseTimeOfThread)); 
+				averageCaseResponseTimetOfAllThreads.add(((double)Sum(responseTimeOfThread)/(double)responseTimeOfThread.size())); 
+				jitterInResponseTimetOfAllThreads.add(Collections.max(responseTimeOfThread)-Collections.min(responseTimeOfThread)); 
+				varianceInResponseTimeOfAllThreads.add(ComputeVariance(responseTimeOfThread)); 
+			}
+			previousWakeupTime = -1;
+			currentWakeupTime = -1; 
+			arrivalTimeOfThread.clear();
+			responseTimeOfThread.clear();
+		}
+	}
+
+	private void ComputeExecutionTimeRelatedParameters()
+	{
+		boolean flag = false; 
+		long blockedTime = 0, executionTime = 0; 
+
+		Event currentEvent = null, previousEvent = null; 
+
+		ArrayList<Long> executionTimeOfThread = new ArrayList<Long>();
+		ArrayList<Long> blockingTimeOfThread = new ArrayList<Long>();
+
+		for(ArrayList<Event> threadEvents : threadSpecificEvents) // check each task 
+		{
+			for(Event event: threadEvents)
+			{ 
+				currentEvent = event; 
+
+				if(currentEvent.GetEventID() == EventType.wakeupEventID || (currentEvent.GetEventID() == EventType.readyEventID && flag == false))
+				{
+					flag = true;
+					blockedTime = 0; 
+					executionTime = 0; 
+				}
+				else if(currentEvent.GetEventID() == EventType.runningEventID && flag == true)
+				{
+					if(previousEvent.GetEventID() == EventType.readyEventID || previousEvent.GetEventID() == EventType.blockedEventID || previousEvent.GetEventID() == EventType.wakeupEventID)
+					{
+						blockedTime+= (currentEvent.GetTimeStamp() - previousEvent.GetTimeStamp()); 
+					}
+					else if(previousEvent.GetEventID() == EventType.runningEventID)
+					{
+						executionTime += (currentEvent.GetTimeStamp() -previousEvent.GetTimeStamp()); 
+					}
+					else if(blockedTime!=0 )
+					{
+						System.out.print("Warning: Strange previous event: \t");
+						previousEvent.PrintEvent();
+						System.out.print("before current event: \t");
+						currentEvent.PrintEvent();
+					}
+				}
+				else if((currentEvent.GetEventID() == EventType.readyEventID || currentEvent.GetEventID() == EventType.blockedEventID) && flag == true)
+				{
+					if(previousEvent.GetEventID() == EventType.runningEventID)
+					{
+						executionTime+= (currentEvent.GetTimeStamp() -previousEvent.GetTimeStamp()); 
+					}
+					else if( (previousEvent.GetEventID() == EventType.readyEventID || previousEvent.GetEventID() == EventType.blockedEventID || previousEvent.GetEventID() == EventType.wakeupEventID))
+					{
+						blockedTime+= (currentEvent.GetTimeStamp() -previousEvent.GetTimeStamp()); 
+					}
+					else
+					{
+						System.out.print("Warning: Strange previous event:");
+						previousEvent.PrintEvent();
+						System.out.print("before current event:");
+						currentEvent.PrintEvent();
+					}
+				}
+				else if(currentEvent.GetEventID() == EventType.sleepEventID && flag == true)
+				{
+					if(previousEvent.GetEventID() == EventType.runningEventID)
+					{
+						executionTime += (currentEvent.GetTimeStamp() -previousEvent.GetTimeStamp()); 
+					}
+					else if((executionTime!=0) && (previousEvent.GetEventID() == EventType.readyEventID || previousEvent.GetEventID() == EventType.blockedEventID))
+					{
+						//blockedTime+= (currentEvent.GetTimeStamp() -previousEvent.GetTimeStamp()); // rescheduling followed by completion of job is not included in blocking
+					}
+					else
+					{
+						System.out.print("Warning: Strange previous event:");
+						previousEvent.PrintEvent();
+						System.out.print("before current event:");
+						currentEvent.PrintEvent();
+					} 
+					executionTimeOfThread.add(executionTime); 
+					blockingTimeOfThread.add(blockedTime); 
+
+					blockedTime = 0; 
+					executionTime = 0; 
+					flag = false; 
+				}
+				previousEvent = currentEvent; 
+			}
+
+			// Writing all values in the file
+			try 
+			{
+				WriteAllValuesInFile(blockingTimeOfThread,  traceExtractionPath, "BlockingTime_"+threadIDs.get(threadSpecificEvents.indexOf(threadEvents))+".txt");
+				WriteAllValuesInFile(executionTimeOfThread, traceExtractionPath, "Executiontime_"+threadIDs.get(threadSpecificEvents.indexOf(threadEvents))+".txt");
+			} 
+			catch (IOException e) 
+			{
+				e.printStackTrace();
+			}
+
+			if(executionTimeOfThread.isEmpty())
+			{
+				wcetOfAllThreads.add((long) 0.0);
+				bcetOfAllThreads.add((long) 0.0);
+				acetOfAllThreads.add(0.0);
+				varianceInExecutionTimeOfAllThreads.add(0.0); 
+			}
+			else 
+			{
+				wcetOfAllThreads.add(Collections.max(executionTimeOfThread));
+				bcetOfAllThreads.add(Collections.min(executionTimeOfThread));
+				acetOfAllThreads.add(((double)Sum(executionTimeOfThread)/(double)executionTimeOfThread.size()));
+				varianceInExecutionTimeOfAllThreads.add(ComputeVariance(executionTimeOfThread)); 
+			}
+
+			if(blockingTimeOfThread.isEmpty())
+			{
+				maximumBlockingOfAllThreads.add((long) 0.0); 
+				minimumBlockingOfAllThreads.add((long) 0.0); 
+				averageBlockingOfAllThreads.add(0.0);
+				varianceInBlockingOfAllThreads.add(0.0);
+			}
+			else 
+			{
+				maximumBlockingOfAllThreads.add(Collections.max(blockingTimeOfThread)); 
+				minimumBlockingOfAllThreads.add(Collections.min(blockingTimeOfThread)); 
+				averageBlockingOfAllThreads.add(((double)Sum(blockingTimeOfThread)/(double)blockingTimeOfThread.size()));
+				varianceInBlockingOfAllThreads.add(ComputeVariance(blockingTimeOfThread)); 
+			}
+
+			//	Initializing all variables 
+			executionTimeOfThread.clear();
+			blockingTimeOfThread.clear();
+			blockedTime = -1; 
+			executionTime = -1; 
+			currentEvent = null; 
+			previousEvent = null;
+			flag = false; 
+		}
+	}
+
+	private double ComputeVariance(ArrayList<Long> listOfValues) 
+	{
+		double variance = 0;
+		double sumOfSquaredValues = 0, sumValues = 0;
+		double size = (double) listOfValues.size(); 
+		for(double x: listOfValues)
+		{
+			sumOfSquaredValues += Math.pow(x,2); 
+			sumValues += x; 
+		}
+		variance = ((1/size)*sumOfSquaredValues) - (Math.pow(((1/size)*sumValues),2)); 
+		return variance ;
+	}
+
+	private long Sum(ArrayList<Long> values) 
+	{
+		long total = 0; 
+		for(long v : values)
+		{
+			total += v;
+		}
+		return total;
+	}
+	
+	public void WriteAllValuesInFile(ArrayList<Long> parameter, IFolder path, String fileName) throws IOException
+	{
+//		File dir = new File(path);
+//		dir.mkdirs();
+
+		IFile outputFile = path.getProject().getFile(path.getProjectRelativePath()+ File.separator +fileName);
+		FileWriter fstream = new FileWriter(outputFile.getLocation().toOSString());
+		BufferedWriter out = new BufferedWriter(fstream);
+
+		for(long element : parameter)
+		{ 
+			out.write((double)element/clockRate+"\n"); 
+		}
+		out.close();	
+	}
+	
+	/*****************
+	 *  Getters
+	 ****************/
+
+	public ArrayList<Long> GetMinimumInterArrivalTimeOfAllThreads()
+	{
+		return minimumInterArrivalTimeOfAllThreads; 
+	}
+
+	public ArrayList<Long> GetMaximumInterArrivalTimeOfAllThreads()
+	{
+		return maximumInterArrivalTimeOfAllThreads; 
+	}
+
+	public ArrayList<Long> GetReleaseJitterOfAllThreads()
+	{
+		return releaseJitterOfAllThreads; 
+	}
+
+	public ArrayList<Long> GetWCETOfAllThreads()
+	{
+		return wcetOfAllThreads; 
+	}
+
+	public ArrayList<Long> GetBCETOfAllThreads()
+	{
+		return bcetOfAllThreads; 
+	}
+
+	public ArrayList<Double> GetACETOfAllThreads()
+	{
+		return acetOfAllThreads; 
+	}
+
+	public ArrayList<Long> GetWorstCaseResponseTimeOfAllThreads()
+	{
+		return worstCaseResponseTimetOfAllThreads;  
+	}
+
+	public ArrayList<Long> GetBestCaseResponseTimeOfAllThreads()
+	{
+		return bestCaseResponseTimetOfAllThreads;  
+	}
+
+	public ArrayList<Double> GetAverageCaseResponseTimeOfAllThreads()
+	{
+		return averageCaseResponseTimetOfAllThreads;  
+	}
+
+	public ArrayList<Long> GetMaximumBlockingTimeOfAllThreads()
+	{
+		return maximumBlockingOfAllThreads;   
+	}
+
+	public ArrayList<Long> GetMinimumBlockingTimeOfAllThreads()
+	{
+		return minimumBlockingOfAllThreads;  
+	}
+
+	public ArrayList<Double> GetAverageBlockingTimeOfAllThreads()
+	{
+		return averageBlockingOfAllThreads;  
+	}
+
+	public ArrayList<Double> GetVarianceInBlockingTimeOfAllThreads()
+	{
+		return varianceInBlockingOfAllThreads;  
+	}
+
+	public ArrayList<Double> GetVarianceInExecutionTimeOfAllThreads()
+	{
+		return varianceInExecutionTimeOfAllThreads;  
+	}
+
+	public ArrayList<Double> GetVarianceInArrivalTimeOfAllThreads()
+	{
+		return varianceInArrivalTimeOfAllThreads;  
+	}
+
+	public ArrayList<Double> GetVarianceInResponseTimeOfAllThreads()
+	{
+		return varianceInResponseTimeOfAllThreads;  
+	}
+
+	public ArrayList<Long> GetJitterInResponseTimetOfAllThreads()
+	{
+		return jitterInResponseTimetOfAllThreads; 
+	}
+
+	public ArrayList<Double> GetAverageInterArrivalTimeOfAllThreads() {
+		return averageInterArrivalTimeOfAllThreads;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/ThreadEvents.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/ThreadEvents.java
new file mode 100644
index 0000000..0dc7be3
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/ThreadEvents.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ *                  CHESS monitoring plugin
+ *
+ *               Copyright (C) 2015-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.polarsys.chess.monitoring.traceanalyser;
+
+import java.util.ArrayList;
+
+import org.polarsys.chess.monitoring.traceanalyser.Event;
+import org.polarsys.chess.monitoring.traceanalyser.EventType;
+
+public class ThreadEvents
+{		
+	private String threadID; 
+	private ArrayList<Event> runningEvents; 
+	private ArrayList<Event> readyEvents;
+	private ArrayList<Event> blockedEvents;
+	private ArrayList<Event> sleepEvents;
+	private ArrayList<Event> wakeupEvents;
+
+	public ThreadEvents(String inThreadID, final ArrayList<Event> inThreadEvents) 
+	{	
+		this.threadID = inThreadID; 		
+		runningEvents = new ArrayList<Event>(); 
+		readyEvents   = new ArrayList<Event>();
+		blockedEvents = new ArrayList<Event>(); 
+		sleepEvents   = new ArrayList<Event>(); 
+		wakeupEvents  = new ArrayList<Event>(); 
+		
+		for(Event event : inThreadEvents)
+		{
+			if(event.GetEventID() == EventType.runningEventID)
+				runningEvents.add(event); 
+			else if(event.GetEventID() == EventType.readyEventID)
+				readyEvents.add(event);
+			else if(event.GetEventID() == EventType.blockedEventID)
+				blockedEvents.add(event);
+			else if(event.GetEventID() == EventType.sleepEventID)
+				sleepEvents.add(event);
+			else if(event.GetEventID() == EventType.wakeupEventID)
+				wakeupEvents.add(event);
+			else 
+				System.out.println("Invalid event ID in " + event); 	
+		} 
+	}
+	
+	public ArrayList<Event> GetRunningEvents()
+	{
+		return runningEvents; 
+	}
+	public ArrayList<Event> GetReadyEvents()
+	{
+		return readyEvents; 
+	}
+	public ArrayList<Event> GetBlockedEvents()
+	{
+		return blockedEvents; 
+	}
+	public ArrayList<Event> GetSleepEvents()
+	{
+		return sleepEvents; 
+	}
+	public ArrayList<Event> GetWakeupEvents()
+	{
+		return wakeupEvents; 
+	}
+	public String GetThreadID()
+	{
+		return threadID; 
+	}
+	
+	public long GetFirstReadyEventInGivenInterval(long timeStart, long timeEnd)
+	{ 
+		for(Event event: readyEvents)
+		{
+			if(event.GetTimeStamp() >= timeStart && event.GetTimeStamp() <= timeEnd)
+			{
+				return event.GetTimeStamp();  
+			}
+			else if(event.GetTimeStamp() > timeEnd)
+			{
+				return -1; 
+			}
+		}		
+		return -1; 
+	}
+	
+	public long GetFirstRunningEventInGivenInterval(long timeStart, long timeEnd)
+	{ 
+		for(Event event: runningEvents)
+		{
+			if(event.GetTimeStamp()>=timeStart && event.GetTimeStamp()<=timeEnd)
+			{
+				return event.GetTimeStamp();  
+			}
+			else if(event.GetTimeStamp()>timeEnd)
+			{
+				return -1; 
+			}		
+		}
+		return -1; 
+	}
+	
+	
+	public long GetLastSleepEventInGivenInterval(long timeStart, long timeEnd)
+	{ 
+		long prev = -1; 
+		
+		for(Event event: sleepEvents)
+		{
+			if(event.GetTimeStamp()>=timeStart && event.GetTimeStamp()<=timeEnd)
+			{
+				prev = event.GetTimeStamp();  
+			}
+			else if(event.GetTimeStamp()>timeEnd)
+			{
+				break; 
+			}		
+		}		
+		return prev; 
+	}
+
+	public long FindLastSleepIfAnyAvailable(long currentWakeupTime) 
+	{
+		for(Event event: sleepEvents)
+		{
+			if(event.GetTimeStamp()>=currentWakeupTime)
+				return event.GetTimeStamp();  
+		}	
+		return -1; 
+	}
+}
+
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/TraceAnalyser.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/TraceAnalyser.java
new file mode 100644
index 0000000..c509340
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/TraceAnalyser.java
@@ -0,0 +1,357 @@
+/*******************************************************************************
+ *                  CHESS monitoring plugin
+ *
+ *               Copyright (C) 2015-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.polarsys.chess.monitoring.traceanalyser;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.emf.common.util.URI;
+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.jface.dialogs.ProgressMonitorDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.swt.widgets.Shell;
+import org.polarsys.chess.core.util.CHESSProjectSupport;
+import org.polarsys.chess.monitoring.monitoringxml.AnalysisContext;
+import org.polarsys.chess.monitoring.monitoringxml.BlockingTime;
+import org.polarsys.chess.monitoring.monitoringxml.ExecutionTime;
+import org.polarsys.chess.monitoring.monitoringxml.MeasuredValue;
+import org.polarsys.chess.monitoring.monitoringxml.Monitoring;
+import org.polarsys.chess.monitoring.monitoringxml.MonitoringxmlFactory;
+import org.polarsys.chess.monitoring.monitoringxml.Period;
+import org.polarsys.chess.monitoring.monitoringxml.ResponseTime;
+import org.polarsys.chess.monitoring.monitoringxml.Thread;
+import org.polarsys.chess.monitoring.traceanalyser.Parameters;
+import org.polarsys.chess.monitoring.traceanalyser.TraceReader;
+
+public class TraceAnalyser 
+{
+	private IFile inputFile;
+	private IFile inTraceFile;
+	private IFolder traceExtractionPath;
+	private String delimiter;
+	private Shell shell;
+	private String unitName = "ms";
+	private double unitFactor = 0.001;
+	
+	public TraceAnalyser(Shell shell, IFile inXMLFile, String outXMLFileName, IFile traceFile)  
+	{
+		this.delimiter = " "; 
+		this.shell = shell;
+		this.inputFile = inXMLFile;
+		this.inTraceFile = traceFile;
+		this.traceExtractionPath = traceFile.getProject().getFolder(traceFile.getParent().getName()+ File.separator +"traces");
+		try {
+			CHESSProjectSupport.createFolder(traceExtractionPath);
+		} catch (CoreException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
+	}
+	
+	public void doTraceAnalysis()
+	{
+		try{
+			ProgressMonitorDialog progDialog = new ProgressMonitorDialog(shell);
+			progDialog.run(true, true, new IRunnableWithProgress(){ 
+		    public void run(IProgressMonitor monitor) {
+		 
+		        monitor.beginTask("Analyzing measured values ...", 100); 
+		        // execute the task ... 
+		        if (monitor.isCanceled())
+					throw new OperationCanceledException();
+
+		        // Read trace file and get thread specific data
+		        TraceReader trace;
+		        trace = new TraceReader(inTraceFile, inputFile, delimiter);
+		        monitor.worked(45);
+
+		        // Extract the required parameters
+		        Parameters parameters = new Parameters(trace, traceExtractionPath); 
+		        parameters.ComputeParameters();
+		        monitor.worked(45);
+
+		        String[] actxName = trace.GetAnalysisContext().split("::");
+		        String outputName = actxName[actxName.length-1]+"_monitoring.xml";
+		        // Write output data in a file
+		        //WriteoutputFile(outputFileName, trace.GetAnalysisContext(), trace.GetThreadIDs(), parameters, unitFactor, unitName,trace.GetClockRate());
+		        try {
+		        	CreateMonitoringXMLOutput(inputFile, outputName, trace.GetAnalysisContext(), trace.GetThreadIDs(), parameters, unitFactor, unitName,trace.GetClockRate());
+		        } catch (Exception e) {
+		        	// TODO Auto-generated catch block
+		        	e.printStackTrace();
+		        }
+		        monitor.worked(10);
+		        monitor.done();
+		   }
+		   });
+		} catch(Exception ex){//throw new OperationCanceledException("Operation aborted by the user.");};}
+			throw new OperationCanceledException(ex.getMessage());
+		}
+	}
+
+/*	private static void addXMLelement(Document doc, Element parent, String name, String unit, String value)
+	{
+		Element elem = doc.createElement(name);
+		Attr unitAttr = doc.createAttribute("unit");
+		unitAttr.setValue(unit);
+		elem.setAttributeNode(unitAttr);
+		Attr valueAttr = doc.createAttribute("value");
+		valueAttr.setValue(value);
+		elem.setAttributeNode(valueAttr);
+		parent.appendChild(elem);
+	}
+	
+	private static void WriteoutputFile(final String fileName, final String analysisContext, final ArrayList<String> threadNames, final Parameters parameters, final double unitFactor, final String unitName, final double clockRate) 
+	{
+		double totalUtilization = 0.0; 
+		try {
+			DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
+
+			// Root elements
+			Document doc = docBuilder.newDocument();
+			Element rootElement = doc.createElement("monitoringxml:Monitoring");
+			doc.appendChild(rootElement);
+
+			Element cr = doc.createElement("ClockRate");
+			cr.appendChild(doc.createTextNode(String.valueOf(clockRate)));
+			rootElement.appendChild(cr);
+			Attr unitcr = doc.createAttribute("unit");
+			unitcr.setValue("MHz");
+			cr.setAttributeNode(unitcr);
+
+			// Extracted thread parameters
+			for(int i=0; i < threadNames.size(); i++)
+			{
+				Element thread = doc.createElement("ThreadNames");
+				Attr name = doc.createAttribute("name");
+				name.setValue(threadNames.get(i));
+				thread.setAttributeNode(name);
+				rootElement.appendChild(thread);
+
+				long exec = parameters.GetWCETOfAllThreads().get(i);
+
+				double util = 0.0;
+				if(exec > 0)
+					util = (double)exec / (double)parameters.GetMinimumInterArrivalTimeOfAllThreads().get(i); 
+				Element utilization = doc.createElement("utilization");
+				utilization.appendChild(doc.createTextNode(String.valueOf(util)));
+				thread.appendChild(utilization);
+
+				totalUtilization +=  util; 
+
+				Element executionTime = doc.createElement("executiontime");
+				thread.appendChild(executionTime);
+
+				addXMLelement(doc, executionTime, "maximum", unitName, 
+						String.valueOf(((double)parameters.GetWCETOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, executionTime, "average", unitName, 
+						String.valueOf(((double)parameters.GetACETOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, executionTime, "minimum", unitName, 
+						String.valueOf(((double)parameters.GetBCETOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, executionTime, "stdDeviation", unitName, 
+						String.valueOf((Math.sqrt((double)parameters.GetVarianceInExecutionTimeOfAllThreads().get(i))*unitFactor)/clockRate));
+
+				Element period = doc.createElement("period");
+				thread.appendChild(period);
+				
+				addXMLelement(doc, period, "maximum", unitName, 
+						String.valueOf(((double)parameters.GetMaximumInterArrivalTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, period, "average", unitName, 
+						String.valueOf(((double)parameters.GetAverageInterArrivalTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, period, "minimum", unitName, 
+						String.valueOf(((double)parameters.GetMinimumInterArrivalTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, period, "jitter", unitName, 
+						String.valueOf(((double)parameters.GetReleaseJitterOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, period, "stdDeviation", unitName, 
+						String.valueOf((Math.sqrt((double)parameters.GetVarianceInArrivalTimeOfAllThreads().get(i))*unitFactor)/clockRate));
+
+				Element blockingTime = doc.createElement("blockingtime");
+				thread.appendChild(blockingTime);
+				
+				addXMLelement(doc, blockingTime, "maximum", unitName, 
+						String.valueOf(((double)parameters.GetMaximumBlockingTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, blockingTime, "average", unitName, 
+						String.valueOf(((double)parameters.GetAverageBlockingTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, blockingTime, "minimum", unitName, 
+						String.valueOf(((double)parameters.GetMinimumBlockingTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, blockingTime, "stdDeviation", unitName, 
+						String.valueOf((Math.sqrt((double)parameters.GetVarianceInBlockingTimeOfAllThreads().get(i))*unitFactor)/clockRate));
+
+				Element responseTime = doc.createElement("responsetime");
+				thread.appendChild(responseTime);
+
+				addXMLelement(doc, responseTime, "maximum", unitName, 
+						String.valueOf(((double)parameters.GetWorstCaseResponseTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, responseTime, "average", unitName, 
+						String.valueOf(((double)parameters.GetAverageCaseResponseTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, responseTime, "minimum", unitName, 
+						String.valueOf(((double)parameters.GetBestCaseResponseTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+				addXMLelement(doc, responseTime, "stdDeviation", unitName, 
+						String.valueOf((Math.sqrt((double)parameters.GetVarianceInResponseTimeOfAllThreads().get(i))*unitFactor)/clockRate));
+				addXMLelement(doc, responseTime, "jitter", unitName, 
+						String.valueOf(((double)parameters.GetJitterInResponseTimetOfAllThreads().get(i)*unitFactor)/clockRate));
+			}
+
+			Element tu = doc.createElement("totalutilization");
+			tu.appendChild(doc.createTextNode(String.valueOf(totalUtilization)));
+			rootElement.appendChild(tu);
+			
+			Element context = doc.createElement("analysisContext");
+			Attr contextname = doc.createAttribute("name");
+			contextname.setValue(analysisContext);
+			context.setAttributeNode(contextname);
+			rootElement.appendChild(context);
+
+			// write the content into xml file
+			TransformerFactory transformerFactory = TransformerFactory.newInstance();
+			Transformer transformer = transformerFactory.newTransformer();
+			transformer.setOutputProperty(OutputKeys.INDENT, "yes");
+			transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "5");
+			DOMSource source = new DOMSource(doc);
+			StreamResult result = new StreamResult(new File(fileName));
+
+			transformer.transform(source, result);
+		} 
+		catch (ParserConfigurationException pce) 
+		{
+			pce.printStackTrace();
+		} 
+		catch (TransformerException te) 
+		{
+			te.printStackTrace();
+		}
+	}*/
+
+	public static void CreateMonitoringXMLOutput(IFile inputFile, String outXMLFileName, String saAnalysisName, final ArrayList<String> threadNames, final Parameters parameters, final double unitFactor, final String unitName, final double clockRate) throws Exception {
+		
+		// Retrieve the default factory singleton
+		MonitoringxmlFactory factory = MonitoringxmlFactory.eINSTANCE;
+		Monitoring mon = factory.createMonitoring();
+		AnalysisContext analysisContext = factory.createAnalysisContext();
+		analysisContext.setName(saAnalysisName);
+		mon.setAnalysisContext(analysisContext);
+		
+		// Extracted thread parameters
+		for(int i=0; i < threadNames.size(); i++)
+		{
+			Thread thread = factory.createThread();
+			thread.setName(threadNames.get(i));
+
+			ExecutionTime executionTime = factory.createExecutionTime();
+			MeasuredValue maximumET = factory.createMeasuredValue();
+			maximumET.setUnit(unitName);
+			maximumET.setValue((float)((parameters.GetWCETOfAllThreads().get(i)*unitFactor)/clockRate));
+			executionTime.setMaximum(maximumET);	
+			MeasuredValue averageET = factory.createMeasuredValue();
+			averageET.setUnit(unitName);
+			averageET.setValue((float)((parameters.GetACETOfAllThreads().get(i)*unitFactor)/clockRate));
+			executionTime.setAverage(averageET);	
+			MeasuredValue minimumET = factory.createMeasuredValue();
+			minimumET.setUnit(unitName);
+			minimumET.setValue((float)((parameters.GetBCETOfAllThreads().get(i)*unitFactor)/clockRate));
+			executionTime.setMinimum(minimumET);
+			thread.setExecutiontime(executionTime);
+
+			Period period = factory.createPeriod();
+			MeasuredValue maximumP = factory.createMeasuredValue();
+			maximumP.setUnit(unitName);
+			maximumP.setValue((float)((parameters.GetMaximumInterArrivalTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			period.setMaximum(maximumP);	
+			MeasuredValue averageP = factory.createMeasuredValue();
+			averageP.setUnit(unitName);
+			averageP.setValue((float)((parameters.GetAverageInterArrivalTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			period.setAverage(averageP);	
+			MeasuredValue minimumP = factory.createMeasuredValue();
+			minimumP.setUnit(unitName);
+			minimumP.setValue((float)((parameters.GetMinimumInterArrivalTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			period.setMinimum(minimumP);
+			MeasuredValue jitterP = factory.createMeasuredValue();
+			jitterP.setUnit(unitName);
+			jitterP.setValue((float)((parameters.GetMinimumInterArrivalTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			period.setJitter(jitterP);
+			thread.setPeriod(period);
+			
+			BlockingTime blockingTime = factory.createBlockingTime();
+			MeasuredValue maximumBT = factory.createMeasuredValue();
+			maximumBT.setUnit(unitName);
+			maximumBT.setValue((float)((parameters.GetMaximumBlockingTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			blockingTime.setMaximum(maximumBT);	
+			MeasuredValue averageBT = factory.createMeasuredValue();
+			averageBT.setUnit(unitName);
+			averageBT.setValue((float)((parameters.GetAverageBlockingTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			blockingTime.setAverage(averageBT);	
+			MeasuredValue minimumBT = factory.createMeasuredValue();
+			minimumBT.setUnit(unitName);
+			minimumBT.setValue((float)((parameters.GetMinimumBlockingTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			blockingTime.setMinimum(minimumBT);
+			thread.setBlockingtime(blockingTime);
+
+			ResponseTime responseTime = factory.createResponseTime();
+			MeasuredValue maximumRT = factory.createMeasuredValue();
+			maximumRT.setUnit(unitName);
+			maximumRT.setValue((float)((parameters.GetWorstCaseResponseTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			responseTime.setMaximum(maximumRT);	
+			MeasuredValue averageRT = factory.createMeasuredValue();
+			averageRT.setUnit(unitName);
+			averageRT.setValue((float)((parameters.GetAverageCaseResponseTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			responseTime.setAverage(averageRT);	
+			MeasuredValue minimumRT = factory.createMeasuredValue();
+			minimumRT.setUnit(unitName);
+			minimumRT.setValue((float)((parameters.GetBestCaseResponseTimeOfAllThreads().get(i)*unitFactor)/clockRate));
+			responseTime.setMinimum(minimumRT);
+			MeasuredValue jitterRT = factory.createMeasuredValue();
+			jitterRT.setUnit(unitName);
+			jitterRT.setValue((float)((parameters.GetJitterInResponseTimetOfAllThreads().get(i)*unitFactor)/clockRate));
+			responseTime.setJitter(jitterRT);
+			thread.setResponsetime(responseTime);
+
+			mon.getThreadNames().add(thread);
+		}
+		    
+		ResourceSet resourceSet = new ResourceSetImpl();
+		/*
+		* Register XML Factory implementation using DEFAULT_EXTENSION
+		*/
+		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(
+		    "*", new  XMIResourceFactoryImpl());
+
+		Resource resource = resourceSet.createResource(URI.createURI(inputFile.getParent().getLocationURI()+ File.separator +outXMLFileName));
+
+		/*
+		* Add bookStoreObject to contents list of the resource 
+		*/
+		resource.getContents().add(mon);
+
+		try{
+		    /*
+		    * Save the resource
+		    */
+		    resource.save(null);
+		    inputFile.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
+		   }catch (IOException e) {
+		      e.printStackTrace();
+		   }
+	}
+}
diff --git a/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/TraceReader.java b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/TraceReader.java
new file mode 100644
index 0000000..a8102c3
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/src/org/polarsys/chess/monitoring/traceanalyser/TraceReader.java
@@ -0,0 +1,269 @@
+/*******************************************************************************
+ *                  CHESS monitoring plugin
+ *
+ *               Copyright (C) 2015-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+package org.polarsys.chess.monitoring.traceanalyser;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.util.ArrayList;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.DocumentBuilder;
+
+import org.eclipse.core.resources.IFile;
+import org.polarsys.chess.monitoring.traceanalyser.Event;
+import org.w3c.dom.Document;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Node;
+import org.w3c.dom.Element;
+
+
+public class TraceReader
+{ 
+	private int time_Stamp_Column = 0;
+	private int event_ID_Column   = 1; 	
+	private int thread_ID_Column  = 2; 
+
+	private double clockrate = 1;
+	private String traceFileName; 
+	private ArrayList<ArrayList<Event>> threadSpecificEvents; 
+	private ArrayList<String> threadIDs; 
+	
+	private String analysisContext;
+
+	public TraceReader(IFile traceFile, IFile threadIDsFile, String delimiter) 
+	{
+		traceFileName = traceFile.getLocation().toOSString(); 
+		analysisContext = GetAnalysisContext(threadIDsFile.getLocation().toOSString());
+		threadIDs = new ArrayList<String>();
+		threadIDs = GetThreadIDs(threadIDsFile.getLocation().toOSString()); // the order in which threadIDs are provide will be used to maintain the events related that threadid in threadSpecificEvents 
+		
+		if(threadIDs.size() == 0)
+		{
+			System.out.println("Error: No thread ID to analyze.");
+			System.exit(0); 
+		}
+		
+		threadSpecificEvents = new ArrayList<ArrayList<Event>>(); 
+
+		for(int i=0; i<threadIDs.size(); i++)
+		{
+			threadSpecificEvents.add(new ArrayList<Event>());   
+		}
+		ReadTraceFile(delimiter); 
+	}
+	
+	private String GetAnalysisContext(String fileName)
+	{
+		String analContext = null;
+		try
+		{
+			File fXmlFile = new File(fileName);
+			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+			Document doc = dBuilder.parse(fXmlFile);
+
+			doc.getDocumentElement().normalize();
+			
+			NodeList contexts = doc.getElementsByTagName("analysisContext");			
+			Node context = contexts.item(0);
+			if(context.getNodeType() == Node.ELEMENT_NODE)
+			{
+				Element elem = (Element)context;
+				analContext = elem.getAttribute("name");
+			}
+		} 
+		catch (Exception e) 
+		{
+			e.printStackTrace();
+		}
+		return analContext;
+	}
+	
+	private ArrayList<String> GetThreadIDs(String fileName) 
+	{
+		ArrayList<String> threadNames = new ArrayList<String>();
+		try
+		{
+			File fXmlFile = new File(fileName);
+			DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
+			DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
+			Document doc = dBuilder.parse(fXmlFile);
+
+			doc.getDocumentElement().normalize();
+			
+			NodeList contexts = doc.getElementsByTagName("analysisContext");			
+			Node context = contexts.item(0);
+			if(context.getNodeType() == Node.ELEMENT_NODE)
+			{
+				Element elem = (Element)context;
+				this.analysisContext = elem.getAttribute("name");
+			}
+			
+			NodeList allthreads = doc.getElementsByTagName("ThreadNames");
+
+			for (int i = 0; i < allthreads.getLength(); i++) 
+			{
+				Node thread = allthreads.item(i);
+				if (thread.getNodeType() == Node.ELEMENT_NODE) 
+				{
+					Element eElement = (Element) thread;
+					threadNames.add(eElement.getAttribute("name"));//.getElementsByTagName("name").item(0).getTextContent()); 
+				}
+			}
+		} 
+		catch (Exception e) 
+		{
+			e.printStackTrace();
+		}
+		return threadNames;
+	}
+
+
+	private void ReadTraceFile(String delimiter) 
+	{
+		try 
+		{
+			FileReader file = new FileReader(traceFileName);
+			BufferedReader br = new BufferedReader(file); 
+			String strLine; 
+			Event event ;  
+			
+			strLine = br.readLine();
+			if(strLine != null)
+			{
+				strLine = strLine.trim();
+				String[] strEvent = strLine.split(delimiter);
+				
+				if(strEvent.length == 2 && strEvent[0].equals("clockrate"))
+				{
+					clockrate=Double.parseDouble(strEvent[1]);
+				}
+				else
+				{
+					System.out.println("Error: clockrate is not specified in the trace file.");
+					br.close();
+					return;
+				}
+			}
+
+			while ((strLine = br.readLine()) != null) 
+			{
+				strLine = strLine.trim();
+				String[] strEvent = strLine.split(delimiter); 
+				
+				if(strEvent.length ==3)
+				{	
+					event = new Event(Long.parseLong(strEvent[time_Stamp_Column]), Integer.parseInt(strEvent[event_ID_Column]), strEvent[thread_ID_Column]); 
+
+					if(threadIDs.contains(event.GetThreadID()))
+						threadSpecificEvents.get(threadIDs.indexOf(event.GetThreadID())).add(event);
+				}
+				else
+				{
+					System.out.println("Error: Some events do not follow the expected trace format.");
+					br.close();
+					return;
+				}
+			}
+			br.close();
+		} 
+		catch (IOException e) 
+		{
+			e.printStackTrace();
+		} 
+	}
+
+	public void PrintThreadSpecificEvents(String tid)
+	{
+		int indexOfThread = threadIDs.indexOf(tid); 
+
+		System.out.println("Time Stamp \t EventID \t ThreadID");
+		for(Event event : threadSpecificEvents.get(indexOfThread))
+			System.out.println(event.GetTimeStamp()+"\t"+event.GetEventID() +"\t"+ event.GetThreadID());		
+	}
+
+	public void WriteThreadSpecificEventsIntoFile(String tid)
+	{
+		int indexOfThread = threadIDs.indexOf(tid); 
+
+		FileWriter filewrite;
+		try {
+			filewrite = new FileWriter(tid.concat(".txt"), false);
+			BufferedWriter out = new BufferedWriter(filewrite); 
+
+			for(Event event : threadSpecificEvents.get(indexOfThread))
+				out.write(event.GetTimeStamp()+"\t"+event.GetEventID() +"\t"+ event.GetThreadID()+"\n");		
+
+			out.close();
+		} 
+		catch (IOException e) 
+		{
+			e.printStackTrace();
+		}  
+	}
+
+	/*************
+	 *  Getters
+	 * ***********/
+	public ArrayList<String> GetThreadIDs()
+	{
+		return threadIDs; 
+	}
+	
+	public String GetAnalysisContext()
+	{
+		return this.analysisContext;
+	}
+
+	public ArrayList<ArrayList<Event>> GetThreadSpecificEvents()
+	{
+		return threadSpecificEvents; 
+	}
+
+	public String GetThreadIdOfGivenEvents(ArrayList<ArrayList<Integer>> eventsList)
+	{
+		if(threadSpecificEvents.contains(eventsList))
+			return threadIDs.get(threadSpecificEvents.indexOf(eventsList));
+		else 
+			return null; 
+	}
+
+	public int GetThreadIDColumn()
+	{
+		return thread_ID_Column; 
+	}
+
+	public int GetEventIDColumn()
+	{
+		return event_ID_Column; 
+	}
+
+	public int GetTimeStampColumn()
+	{
+		return time_Stamp_Column; 
+	}
+	public double GetClockRate()
+	{
+		return clockrate; 
+	}
+}
+
+
+
+
+
diff --git a/plugins/org.polarsys.chess.monitoring/transforms/CommonUtilities.qvto b/plugins/org.polarsys.chess.monitoring/transforms/CommonUtilities.qvto
new file mode 100644
index 0000000..ce1d74d
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/transforms/CommonUtilities.qvto
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ *                  CHESS core plugin
+ *
+ *               Copyright (C) 2011-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+modeltype chess uses 'http://CHESS';
+modeltype uml uses 'http://www.eclipse.org/uml2/5.0.0/UML';
+
+
+library CommonUtilities;
+
+query Model::getView(viewName : String) : Package {
+	var seq := self.packagedElement[Package]-> union(self.packagedElement[Package].packagedElement[Package]);
+	return seq -> selectOne(isStereotyped("CHESS::Core::CHESSViews::" + viewName));
+}
+
+query Element::isStereotyped(stereoName : String) : Boolean {
+	return self.getAppliedStereotype(stereoName) <> null;
+}
+
+query Model::findElementByQualifiedName(in qName : String) : NamedElement {
+	var pathParts = qName.tokenize("::")->asOrderedSet();
+	if (pathParts->size() = 1) {
+		return self;
+	};
+	var i : Integer = 2;
+	var p : Package := self;
+	while (i < pathParts->size()) {
+		var packageName = pathParts->at(i); 
+		p := p.ownedElement[Package]->selectOne(name = pathParts->at(i));
+		i := i + 1;
+	};
+	return p.ownedMember[NamedElement]->selectOne(name = pathParts->last());
+}
\ No newline at end of file
diff --git a/plugins/org.polarsys.chess.monitoring/transforms/MonitoringXML2Chess.qvto b/plugins/org.polarsys.chess.monitoring/transforms/MonitoringXML2Chess.qvto
new file mode 100644
index 0000000..fe13ebb
--- /dev/null
+++ b/plugins/org.polarsys.chess.monitoring/transforms/MonitoringXML2Chess.qvto
@@ -0,0 +1,122 @@
+/*******************************************************************************
+ *
+ *               Copyright (C) 2011-2016
+ *            Mälardalen University, Sweden
+ *
+ *
+ *  All rights reserved. This program and the accompanying materials
+ *  are made available under the terms of the Eclipse Public License
+ *  v1.0 which accompanies this distribution, and is available at
+ *  http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+
+import CommonUtilities;
+
+modeltype Chess uses 'http://CHESS';
+
+modeltype MXML uses 'http://www.mdh.se/concerto/monitoring/xml/monitoringxml';
+
+modeltype UML uses 'http://www.eclipse.org/uml2/5.0.0/UML';
+modeltype GQAM uses "http://www.eclipse.org/papyrus/GQAM/1";
+modeltype SAM uses "http://www.eclipse.org/papyrus/SAM/1";
+
+modeltype ECORE uses "http://www.eclipse.org/emf/2002/Ecore";
+
+transformation MonitoringXML2Chess(in source : MXML, inout target : Chess);
+
+property selectedAnalysisContext : Class;
+property model : Model;
+property chessRootPSM : Package;
+property mxmlRoot : MXML::Monitoring;
+
+main() {
+	this.mxmlRoot := source.rootObjects()![MXML::Monitoring];
+	var rtAnalysisContext : String := mxmlRoot.analysisContext.name;
+	this.model := target.rootObjects()![Model];
+	this.selectedAnalysisContext := model.findElementByQualifiedName(rtAnalysisContext).oclAsType(Class);
+
+	var psmView : Package = model.getView("PSMView").oclAsType(Package);
+	this.chessRootPSM := psmView.getCodeGenerationSA(selectedAnalysisContext.name);
+	
+	log("Backpropagating monitored values to " + chessRootPSM.name);
+	mxmlRoot.ThreadNames.propagateMonitoredThread2Chess();
+	mxmlRoot.SharedResources.propagateMonitoredResources2Chess();
+	log("Backpropagation completed.");
+}
+
+query MXML::Thread::propagateMonitoredThread2Chess() {
+	var schedRes : Class := self.getSchedulableResource(chessRootPSM);
+	var e2eFlow : UML::Activity := chessRootPSM.getSaEndtoEndFlow(schedRes);
+	log("Backpropagating "+self.name+" task data...");
+	self.period.propagatePeriod2ArrivalPattern(e2eFlow);
+	self.executiontime.propagateExecutionTime2ExecTime(e2eFlow);
+	self.responsetime.propagateResponseTime2Latency(e2eFlow);
+	self.blockingtime.propagateBlockingTime2BlockT(e2eFlow);
+}
+
+query MXML::Resource::propagateMonitoredResources2Chess() {
+	// TO BE IMPLEMENTED ACCORDINGLY
+}
+
+//NOTE: The ArrivalPattern is written into the model as a plain string
+query MXML::Period::propagatePeriod2ArrivalPattern(e2eFlow : UML::Activity) {
+	var iNode := e2eFlow.ownedElement -> selectOne(initial | initial.oclIsTypeOf(InitialNode));
+	var gaWorkload := iNode.getStereotypeApplications() -> selectByType(GQAM::GaWorkloadEvent) -> asOrderedSet() -> first().oclAsType(GQAM::GaWorkloadEvent);
+	gaWorkload.pattern := "SporadicPattern(minInterarrival=(value="+self.minimum.value.toString()+", unit="+self.minimum.unit+"), "+ 
+						  "maxInterarrival=(value="+self.maximum.value.toString()+", unit="+self.maximum.unit+"), "+ 
+						  "avgInterarrival=(value="+self.average.value.toString()+", unit="+self.average.unit+"), "+
+						  "jitter=(value="+self.jitter.value.toString()+", unit="+self.jitter.unit+"))";
+}
+
+//NOTE: The ExecutionTime is written into the model as a plain string
+query MXML::ExecutionTime::propagateExecutionTime2ExecTime(e2eFlow : UML::Activity) {
+	var sStep := e2eFlow.ownedElement -> selectOne(saStepNode | saStepNode.oclIsTypeOf(UML::OpaqueAction) and saStepNode.isStereotyped("MARTE::MARTE_AnalysisModel::SAM::SaStep"));
+	var saStep := sStep.getStereotypeApplications() -> selectByType(SAM::SaStep) -> asOrderedSet() -> first().oclAsType(SAM::SaStep);
+	saStep.execTime := "(best="+self.minimum.value.toString()+", unit="+self.minimum.unit+", "+
+					   "worst="+self.maximum.value.toString()+", unit="+self.maximum.unit+", "+
+					   "average="+self.average.value.toString()+", unit="+self.average.unit+")";
+}
+
+//NOTE: The ResponseTime is written into the model as a plain string
+query MXML::ResponseTime::propagateResponseTime2Latency(e2eFlow : UML::Activity) {
+	var latEl := e2eFlow.ownedElement -> selectOne(gaL | gaL.isStereotyped("MARTE::MARTE_AnalysisModel::GQAM::GaLatencyObs"));
+	var latencyEl := latEl.getStereotypeApplications() -> selectByType(GQAM::GaLatencyObs) -> asOrderedSet() -> first().oclAsType(GQAM::GaLatencyObs);
+	
+	log("propagateResponseTime2Latency  max="+self.maximum.value.toString());
+	
+	latencyEl.latency := "(best="+self.minimum.value.toString()+", unit="+self.minimum.unit+", "+
+						 "worst="+self.maximum.value.toString()+", unit="+self.maximum.unit+", "+
+						 "average="+self.average.value.toString()+", unit="+self.average.unit+")";  
+	latencyEl.maxJitter := "(value="+self.jitter.value.toString()+", unit="+self.jitter.unit+")";
+}
+
+//NOTE: The BlockingTime is written into the model as a plain string
+query MXML::BlockingTime::propagateBlockingTime2BlockT(e2eFlow : UML::Activity) {
+	var sStep := e2eFlow.ownedElement -> selectOne(saStepNode | saStepNode.oclIsTypeOf(UML::OpaqueAction) and saStepNode.isStereotyped("MARTE::MARTE_AnalysisModel::SAM::SaStep"));
+	var saStep := sStep.getStereotypeApplications() -> selectByType(SAM::SaStep) -> asOrderedSet() -> first().oclAsType(SAM::SaStep);
+	saStep.blockT := "(best="+self.minimum.value.toString()+",  unit="+self.minimum.unit+", "+
+					 "worst="+self.maximum.value.toString()+",  unit="+self.maximum.unit+", "+
+					 "average="+self.average.value.toString()+",  unit="+self.average.unit+")";  
+}
+
+query Package::getCodeGenerationSA(saContextName : String) : Package {
+	var seq := self.packagedElement[Package]-> union(self.packagedElement[Package].packagedElement[Package]);
+	return seq -> selectOne(p | p.isStereotyped("CHESS::Core::PSMPackage") and p.name = saContextName + "_PSM");
+}
+
+//NOTE: Search for a match in the collection of Schedulable Resources in the Task subpackage and return the classifier
+query MXML::Thread::getSchedulableResource(acPSM : Package) : UML::Class {
+	var ac := acPSM.packagedElement[Class]-> union(acPSM.packagedElement[Package].packagedElement[Class]);
+	return ac -> selectOne(sr | sr.name = self.name+"_task").oclAsType(Class);
+}
+
+query Package::getSaEndtoEndFlow(schedRes : Class) : UML::Activity {
+	var ac := self.packagedElement[Package]-> union(self.packagedElement[Package].packagedElement[Package]);
+	var actx := ac -> selectOne(p | p.name = "AnalysisContext").oclAsType(Package);
+	var saClass : Class := actx.packagedElement[Class] -> selectOne(saCl | saCl.isStereotyped("MARTE::MARTE_AnalysisModel::SAM::SaAnalysisContext")).oclAsType(Class);
+	saClass.ownedElement[OpaqueAction]-> union(saClass.ownedElement[Activity].ownedElement[OpaqueAction]) -> forEach(a | a.isStereotyped("MARTE::MARTE_AnalysisModel::SAM::SaStep")) {
+		var saStep := a.getStereotypeApplications() -> selectByType(SAM::SaStep) -> asOrderedSet() -> first().oclAsType(SAM::SaStep);
+		if saStep.concurRes.base_Classifier = schedRes then return a.owner.oclAsType(UML::Activity) endif;
+	};
+	return null;
+}
\ No newline at end of file
