Bug 567842 - [IoTML] SensiNact code generator integration

Change-Id: I934c59325207d4c057e624d0119237ccae55738b
Signed-off-by: Shuai Li <shuai.li@cea.fr>
diff --git a/addons/pom.xml b/addons/pom.xml
index 837f7ba..beb46fa 100644
--- a/addons/pom.xml
+++ b/addons/pom.xml
@@ -13,6 +13,7 @@
 	<modules>
 		<!--<module>simulation</module>-->
 		<module>wot</module>
+		<!--<module>sna</module>-->
 	</modules>
 	
 </project>
\ No newline at end of file
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.classpath b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.classpath
new file mode 100644
index 0000000..428337e
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="xtend-gen"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.gitignore b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.gitignore
new file mode 100644
index 0000000..ae3c172
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.gitignore
@@ -0,0 +1 @@
+/bin/
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.project b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.project
new file mode 100644
index 0000000..38ba269
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.iotml.sna.codegen</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
+	</natures>
+</projectDescription>
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.settings/org.eclipse.jdt.core.prefs b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0c68a61
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/META-INF/MANIFEST.MF b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..3721877
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/META-INF/MANIFEST.MF
@@ -0,0 +1,21 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.papyrus.iotml.sna.codegen
+Bundle-SymbolicName: org.eclipse.papyrus.iotml.sna.codegen;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Automatic-Module-Name: org.eclipse.papyrus.iotml.sna.codegen
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Require-Bundle: org.eclipse.uml2.uml;bundle-version="5.5.0",
+ org.eclipse.papyrus.designer.languages.common.base;bundle-version="1.1.0",
+ org.eclipse.core.resources;bundle-version="3.0.0",
+ org.eclipse.papyrus.infra.tools;bundle-version="3.0.0",
+ org.eclipse.papyrus.uml.diagram.common;bundle-version="3.0.0",
+ org.eclipse.e4.core.commands;bundle-version="0.12.500",
+ com.google.guava,
+ org.eclipse.xtext.xbase.lib,
+ org.eclipse.xtend.lib,
+ org.eclipse.xtend.lib.macro,
+ org.eclipse.papyrus.designer.transformation.library;bundle-version="0.8.0",
+ org.eclipse.papyrus.iotml.profile;bundle-version="1.0.0",
+ org.eclipse.sensinact.studio.model.resource;bundle-version="1.0.0"
+Export-Package: org.eclipse.papyrus.iotml.sna.codegen
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/build.properties b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/plugin.xml b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/plugin.xml
new file mode 100644
index 0000000..42dde6c
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/plugin.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+	<extension point="org.eclipse.ui.menus">
+		<menuContribution
+				allPopups="false"
+				locationURI="popup:org.eclipse.papyrus.designer.popup?after=codegen">
+			<command
+					commandId="org.eclipse.papyrus.iotml.sna.codegen.commands.SensiNactTransformation"
+					label="Create SensiNact DSL from model"
+					style="push"
+					tooltip="Create SensiNact DSL from model">
+			<visibleWhen checkEnabled="true">
+				<with variable="selection">
+					<iterate>
+						<adapt type="org.eclipse.emf.ecore.EObject">
+						<instanceof value="org.eclipse.uml2.uml.Package"/>
+						</adapt>
+					</iterate>
+				</with>
+			</visibleWhen>
+			</command>
+		</menuContribution>
+	</extension>
+	<extension point="org.eclipse.ui.commands">
+		<command
+        categoryId="org.eclipse.papyrus.editor.category"
+        description="Create SensiNact DSL from model"
+        id="org.eclipse.papyrus.iotml.sna.codegen.commands.SensiNactTransformation"
+        name="Create SensiNact DSL from model">
+		</command>
+	</extension>
+	<extension point="org.eclipse.ui.handlers">
+		<handler
+				class="org.eclipse.papyrus.iotml.sna.codegen.handlers.SensiNactTransformation"
+				commandId="org.eclipse.papyrus.iotml.sna.codegen.commands.SensiNactTransformation">
+		</handler>
+	</extension>
+</plugin>
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/pom.xml b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/pom.xml
new file mode 100644
index 0000000..5160573
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/pom.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>org.eclipse.papyrus.iotml.addons.sna</artifactId>
+		<groupId>org.eclipse.papyrus.iotml</groupId>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.papyrus.iotml.sna.codegen</artifactId>
+	<packaging>eclipse-feature</packaging>
+	<name>org.eclipse.papyrus.iotml.sna.codegen</name>
+	<description>Papyrus IoT-ML sNa code generation</description>
+</project>
\ No newline at end of file
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/CreateSNA.xtend b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/CreateSNA.xtend
new file mode 100644
index 0000000..39dac19
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/CreateSNA.xtend
@@ -0,0 +1,67 @@
+package org.eclipse.papyrus.iotml.sna.codegen
+
+import org.eclipse.papyrus.infra.tools.file.ProjectBasedFileAccess
+import org.eclipse.papyrus.iotml.sensinact.Gateway
+import org.eclipse.uml2.uml.Class
+import org.eclipse.uml2.uml.Package
+import org.eclipse.uml2.uml.State
+import org.eclipse.uml2.uml.StateMachine
+import org.eclipse.uml2.uml.util.UMLUtil
+
+import static extension org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils.effectStr
+import static extension org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils.getOrchestratorSM
+import static extension org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils.getSubscribers
+import static extension org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils.guardStr
+import static extension org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils.ORCHESTRATOR
+import static extension org.eclipse.papyrus.designer.transformation.library.xtend.StateMachineUtil.states
+
+class CreateSNA {
+
+	static def void createSNA(ProjectBasedFileAccess pba, Package model) {
+		for (pe : model.packagedElements) {
+			if (pe instanceof Class) {
+				val gw = UMLUtil.getStereotypeApplication(pe, Gateway) 
+				if (gw !== null) {
+					// found gw, get orchestrator SM
+					val orchestratorSM = (pe as Class).orchestratorSM
+					createSNA(pba, pe as Class, orchestratorSM)	
+				}
+			}
+			else if (pe instanceof Package) {
+				createSNA(pba, pe as Package)
+			}
+		}
+	}
+
+	static def createSNA(ProjectBasedFileAccess pba, Class gw, StateMachine orchestratorSM) {
+		for (state : orchestratorSM.states) {
+			if (state.name != "WaitingForEvents") {
+				pba.generateFile('''«state.name».sna''', createSNA(gw, state))
+			}
+		}
+	}
+	
+	static def String createSNA(Class gw, State state) '''
+		«FOR part : gw.ownedAttributes»
+			«IF part.name != ORCHESTRATOR && part.type instanceof Class»
+				«val component = part.type as Class»
+				«FOR port : component.ownedPorts»
+					resource «port.name»=[«gw.name»/«component.name»/control/«port.name»]
+				«ENDFOR»
+				
+			«ENDIF»
+		«ENDFOR»
+
+		on «FOR subscriber : state.subscribers SEPARATOR ", "»«subscriber».subscribe()«ENDFOR»
+
+		«val outgoings = state.outgoings»
+		«FOR transition : outgoings»
+««« add an "else", except for first transition
+			«IF transition != outgoings.get(0)»else «ENDIF»if «transition.guardStr» do
+				«transition.effectStr»
+		«ENDFOR»
+		«IF outgoings.size > 0»
+			end if
+		«ENDIF»
+	'''
+}
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/CreateXML.xtend b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/CreateXML.xtend
new file mode 100644
index 0000000..b51adec
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/CreateXML.xtend
@@ -0,0 +1,160 @@
+package org.eclipse.papyrus.iotml.sna.codegen
+
+import org.eclipse.papyrus.iotml.sensinact.ServiceProvider
+import org.eclipse.uml2.uml.Class
+import org.eclipse.uml2.uml.Package
+import org.eclipse.uml2.uml.util.UMLUtil
+
+import org.eclipse.papyrus.infra.tools.file.ProjectBasedFileAccess
+import org.eclipse.uml2.uml.Type
+import org.eclipse.uml2.uml.Enumeration
+import org.eclipse.uml2.uml.Property
+import org.eclipse.uml2.uml.InstanceValue
+import org.eclipse.uml2.uml.EnumerationLiteral
+import static extension org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils.getSensorData
+import static extension org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils.getActions
+import static extension org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils.getStateVars
+import static extension org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils.getNonPortAttr
+import org.eclipse.papyrus.iotml.sensinact.Action
+import org.eclipse.papyrus.iotml.sensinact.StateVariable
+import org.eclipse.papyrus.iotml.sensinact.SensorData
+
+class CreateXML {
+
+	static def void createXML(ProjectBasedFileAccess pba, Package model) {
+		for (pe : model.packagedElements) {
+			if (pe instanceof Class) {
+				val sp = UMLUtil.getStereotypeApplication(pe, ServiceProvider) 
+				if (sp !== null) {
+					pba.generateFile('''«pe.name»-resource.xml''', createXML(pe as Class))
+				}
+			}
+			else if (pe instanceof Package) {
+				createXML(pba, pe as Package)
+			}
+		}
+	}
+
+	static def String createXML(Class serviceProvider) {
+		createXMLResources(serviceProvider, serviceProvider.nearestPackage.getPackagedElement("Resources") as Package)
+	}
+	
+	static def String createXMLResources(Class serviceProvider, Package resourcePkg) '''
+		<!--
+		  ~ Copyright (c) 2020 CEA.
+		  ~ 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
+		  ~
+		  ~ Contributors:
+		  ~    CEA - initial API and implementation
+		  -->
+		
+		<resourceInfos xmlns="http://org.eclipse.sensinact/resource"
+			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+			xsi:schemaLocation="http://org.eclipse.sensinact/resource ../../../../../platform/sensinact-generic/src/main/resources/sensinact-resource.xsd">
+			«FOR action : resourcePkg.sensorData»
+			  	«action.createSensorData»
+			«ENDFOR»
+			«FOR action : resourcePkg.stateVars»
+			  	«action.createStateVars»
+			«ENDFOR»
+			«FOR action : resourcePkg.actions»
+			  	«action.createAction»
+			«ENDFOR»
+			
+			<devices>
+				<device identifier="«serviceProvider.name»">
+					<service name="Control"/>
+				</device>
+			</devices>
+		</resourceInfos>
+	'''
+
+	static def String createSensorData(Class sensorData) '''
+		«val sensorDataSt = UMLUtil.getStereotypeApplication(sensorData, SensorData)»
+		<resourceInfo xsi:type="resourceInfoSensor" name="«sensorDataSt.friendlyName»" target="control">
+			<identifier xsi:type="stringContent">«sensorData.qualifiedName»</identifier>
+			«IF sensorData.nonPortAttr.size > 0»
+				<attributes>
+					«FOR attribute : sensorData.nonPortAttr»
+						<attribute name="«attribute.name»" type="string" modifiable="UPDATABLE">
+							<value>«attribute.defaultVal»</value>
+							«attribute.type.enumConstraints»
+						</attribute>
+	   				«ENDFOR»
+				</attributes>
+			«ENDIF»
+		</resourceInfo>
+	'''
+
+	static def String createStateVars(Class stateVar) '''
+		«val stateVarSt = UMLUtil.getStereotypeApplication(stateVar, StateVariable)»
+		<resourceInfo xsi:type="resourceInfoSensor" name="«stateVarSt.friendlyName»" target="control">
+			<identifier xsi:type="stringContent">«stateVar.qualifiedName»</identifier>
+			«IF stateVar.nonPortAttr.size > 0»
+				<attributes>
+					«FOR attribute : stateVar.nonPortAttr»
+						<attribute name="«attribute.name»" type="string" modifiable="UPDATABLE">
+							<value>«attribute.defaultVal»</value>
+							«attribute.type.enumConstraints»
+						</attribute>
+	   				«ENDFOR»
+				</attributes>
+			«ENDIF»
+		</resourceInfo>
+	'''
+
+	/**
+	 * Create XML code for an action
+	 */
+	static def String createAction(Class action) '''
+		«val actionSt = UMLUtil.getStereotypeApplication(action, Action)»
+		<resourceInfo xsi:type="resourceInfoSensor" name="«actionSt.friendlyName»" target="control">
+			<identifier xsi:type="stringContent">«action.qualifiedName»</identifier>
+			«IF action.nonPortAttr.size > 0»
+				<attributes>
+					«FOR attribute : action.nonPortAttr»
+						<attribute name="«attribute.name»" type="string" modifiable="UPDATABLE">
+							<value>«attribute.defaultVal»</value>
+							«attribute.type.enumConstraints»
+						</attribute>
+	   				«ENDFOR»
+				</attributes>
+			«ENDIF»
+			«IF action.operations.size > 0»
+				<methods>
+					«FOR method : action.operations»
+						<method name="«method.name»" type="string" type="ACT">
+							«FOR parameter : method.ownedParameters»
+								<parameter name="«parameter.name»" type="«parameter.type.name»"/>
+							«ENDFOR»
+						</mehod>
+	   				«ENDFOR»
+				</methods>
+			«ENDIF»
+		</resourceInfo>
+	'''
+
+	static def String defaultVal(Property attribute) {
+		val defaultValue = attribute.defaultValue
+		if (defaultValue instanceof InstanceValue) {
+			val instance = (defaultValue as InstanceValue).instance
+			if (instance instanceof EnumerationLiteral) {
+				return (instance as EnumerationLiteral).label
+			}
+		}
+		if (defaultValue !== null) {
+			return defaultValue.stringValue
+		}
+	}
+
+	static def enumConstraints(Type type) '''
+		«IF type instanceof Enumeration»
+			<constraints>
+				<pattern value="(«FOR lit : (type as Enumeration).ownedLiterals SEPARATOR '|'»(«lit.name»)«ENDFOR»)"/>
+			</constraints>
+		«ENDIF»	
+	'''
+}
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/CreateXMLecore.java b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/CreateXMLecore.java
new file mode 100644
index 0000000..470d07b
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/CreateXMLecore.java
@@ -0,0 +1,49 @@
+package org.eclipse.papyrus.iotml.sna.codegen;
+
+import java.io.IOException;
+import java.util.Collections;
+
+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.ResourceFactoryRegistryImpl;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.BasicExtendedMetaData;
+import org.eclipse.emf.ecore.util.ExtendedMetaData;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.papyrus.iotml.sensinact.SensinactFactory;
+import org.eclipse.papyrus.iotml.software.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.util.SesamxmlResourceFactoryImpl;
+
+public class CreateXMLecore {
+	public static void createXML(String projectName) {
+		URI uri = URI.createPlatformResourceURI("/" + projectName + "/test.xml", true);
+		
+		ResourceSet resourceSet = new ResourceSetImpl();
+		final ExtendedMetaData extendedMetaData =
+		new BasicExtendedMetaData(resourceSet.getPackageRegistry());
+		resourceSet.getLoadOptions().put
+			(XMLResource.OPTION_EXTENDED_META_DATA, extendedMetaData);
+		
+		ResourceFactoryRegistryImpl.INSTANCE.getExtensionToFactoryMap()
+			.put("xml", new SesamxmlResourceFactoryImpl());
+		
+		Resource r = resourceSet.createResource(uri, "http://org.eclipse.sensinact/resource");
+		// SensinactFactory.eINSTANCE.createResource();
+		org.eclipse.sensinact.studio.resource.Resource res = ResourceFactory.eINSTANCE.createResource();
+		Device d = ResourceFactory.eINSTANCE.createDevice();
+		r.getContents().add(res);
+		res.setName("ServiceRobotics::Door::Resources::DoorOpenAction");
+		res.setFriendlyName("Hi");
+		d.setName("sdf");
+		r.getContents().add(d);
+		try {
+			r.save(Collections.emptyMap());
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/SensiNact.xtend b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/SensiNact.xtend
new file mode 100644
index 0000000..2324e1c
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/SensiNact.xtend
@@ -0,0 +1,120 @@
+package org.eclipse.papyrus.iotml.sna.codegen
+
+import org.eclipse.uml2.uml.Package
+import org.eclipse.uml2.uml.Class
+import org.eclipse.uml2.uml.StateMachine
+import static extension org.eclipse.papyrus.designer.transformation.library.xtend.StateMachineUtil.*
+import org.eclipse.uml2.uml.CallEvent
+import org.eclipse.uml2.uml.Transition
+import org.eclipse.uml2.uml.ValueSpecification
+import org.eclipse.uml2.uml.OpaqueBehavior
+import org.eclipse.uml2.uml.OpaqueExpression
+import org.eclipse.uml2.uml.util.UMLUtil
+import org.eclipse.papyrus.iotml.sensinact.Resource
+import org.eclipse.uml2.uml.Namespace
+import org.eclipse.papyrus.iotml.sensinact.Action
+import org.eclipse.uml2.uml.Pseudostate
+
+class SensiNact {
+	static def String sensinact(Package pkg) '''
+		// resources
+		«pkg.resources»
+
+		«pkg.statemachines»
+	'''
+	
+	static def String resources(Package pkg) {
+		var out = ""
+		for (pe : pkg.packagedElements) {
+			// resource «resource.name»
+			if (pe instanceof Package) {
+				out += resources(pe as Package)
+			}
+			else if (pe instanceof Class) {
+				val clazz = pe as Class
+				val resource = UMLUtil.getStereotypeApplication(clazz, Resource)
+				val behavior = clazz.classifierBehavior
+				if (resource !== null || behavior instanceof StateMachine) {
+					out += '''
+						resource «clazz.name»=/«clazz.qualifiedName.replace(Namespace.SEPARATOR, "/")»
+					'''
+				}
+			}
+		}
+		return out;
+	}
+
+	static def String statemachines(Package pkg) {
+		var out = ""
+		for (pe : pkg.packagedElements) {
+			// resource «resource.name»
+			if (pe instanceof Package) {
+				out += statemachines(pe as Package)
+			}
+			else if (pe instanceof Class) {
+				val clazz = pe as Class
+				val behavior = clazz.classifierBehavior
+				if (behavior instanceof StateMachine) {
+					out += createSM(behavior as StateMachine)
+				}
+			}
+		}
+		return out;
+	}
+	
+	static def createSM(StateMachine sm) '''
+		// ------- for state-machine «sm.name» --------
+		«FOR state : sm.region.states»
+		«ENDFOR»
+		
+		«FOR transition : sm.region.transitions SEPARATOR ""»
+			«IF !(transition.source instanceof Pseudostate)»
+				// from <«transition.source.name»> to <«transition.target.name»>
+				«IF transition.triggers.size > 0»
+					«val trigger = transition.triggers.get(0)»
+					«IF trigger !== null && trigger.event instanceof CallEvent»
+						«val ce = trigger.event as CallEvent»
+						on «ce.name» do
+					«ELSE»
+						no-call-event
+					«ENDIF»
+				«ELSE»
+					on default
+				«ENDIF»
+					«transition.conditionAction»
+
+			«ENDIF»
+		«ENDFOR»
+
+	'''
+
+	static def conditionAction(Transition transition) '''
+		«IF transition.guard !== null»
+			if «transition.guard.specification.guardStr» do
+				«transition.effectStr»
+			end if;
+		«ELSE»
+			«transition.effectStr»
+		«ENDIF»
+	'''
+
+	static def guardStr(ValueSpecification vs) '''
+		«IF vs instanceof OpaqueExpression»
+			«val oe = vs as OpaqueExpression»
+			«oe.bodies.get(0)
+		»«ENDIF»'''
+		
+	static def effectStr(Transition transition) '''
+		«IF transition.effect instanceof OpaqueBehavior»
+			«val ob = transition.effect as OpaqueBehavior»
+			«val action = UMLUtil.getStereotypeApplication(ob, Action)»
+			«IF action !== null»
+«««				«action.state.base_Class.name».act();
+			«ELSE»
+				«ob.bodies.get(0)»
+			«ENDIF»
+		«ELSE»
+			default-body
+		«ENDIF»
+	'''
+}
\ No newline at end of file
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/handlers/SensiNactTransformation.java b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/handlers/SensiNactTransformation.java
new file mode 100644
index 0000000..6366756
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/handlers/SensiNactTransformation.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright CEA LIST 2019
+ * The content is the property of CEA LIST.
+ * 
+ * Initial API and implementation:
+ * Ansgar Radermacher
+ */
+package org.eclipse.papyrus.iotml.sna.codegen.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.papyrus.iotml.sna.codegen.CreateSNA;
+import org.eclipse.papyrus.iotml.sna.codegen.CreateXML;
+import org.eclipse.papyrus.iotml.sna.codegen.SensiNact;
+import org.eclipse.papyrus.infra.tools.file.ProjectBasedFileAccess;
+import org.eclipse.papyrus.iotml.sna.codegen.CreateXMLecore;
+import org.eclipse.papyrus.uml.diagram.common.handlers.CmdHandler;
+import org.eclipse.uml2.uml.Package;
+
+public class SensiNactTransformation extends CmdHandler {
+
+	private static final String PROJ_PREFIX = "org.sensinact.gen."; //$NON-NLS-1$
+
+	protected Package selected;
+
+	@Override
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		updateSelectedEObject();
+		Package model = (Package) selectedEObject;
+
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+
+		String projectName = PROJ_PREFIX + model.getName();
+		IProject project = root.getProject(projectName);
+
+		if (project == null || !project.exists()) {
+			try {
+				project.create(null);
+				project.open(null);
+			} catch (CoreException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+		// CreateXMLecore.createXML(projectName);
+		ProjectBasedFileAccess pba = new ProjectBasedFileAccess(project);
+		CreateXML.createXML(pba, model);
+		CreateSNA.createSNA(pba, model);
+		pba.generateFile("test.sensinact", SensiNact.sensinact(model));
+
+		return null;
+	}
+}
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/utils/IoTGenUtils.xtend b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/utils/IoTGenUtils.xtend
new file mode 100644
index 0000000..5cd3813
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/src/org/eclipse/papyrus/iotml/sna/codegen/utils/IoTGenUtils.xtend
@@ -0,0 +1,140 @@
+package org.eclipse.papyrus.iotml.sna.codegen.utils
+
+import java.util.ArrayList
+import java.util.List
+import org.eclipse.papyrus.iotml.sensinact.Action
+import org.eclipse.papyrus.iotml.sensinact.SensorData
+import org.eclipse.papyrus.iotml.sensinact.StateVariable
+import org.eclipse.papyrus.uml.tools.utils.StereotypeUtil
+import org.eclipse.uml2.uml.Class
+import org.eclipse.uml2.uml.OpaqueBehavior
+import org.eclipse.uml2.uml.OpaqueExpression
+import org.eclipse.uml2.uml.Package
+import org.eclipse.uml2.uml.Port
+import org.eclipse.uml2.uml.Property
+import org.eclipse.uml2.uml.State
+import org.eclipse.uml2.uml.StateMachine
+import org.eclipse.uml2.uml.Transition
+
+class IoTGenUtils {
+	public static String ORCHESTRATOR = "orchestrator"
+
+	def static getActions(Package resourcePkg) {
+		val actionList = new ArrayList<Class>()
+		for (pe : resourcePkg.packagedElements) {
+			if (pe instanceof Class) {
+				if (StereotypeUtil.isApplied(pe, Action)) {
+					actionList.add(pe as Class)
+				}
+			}
+		}
+		return actionList
+	}
+	
+	def static getSensorData(Package resourcePkg) {
+		val sensorData = new ArrayList<Class>()
+		for (pe : resourcePkg.packagedElements) {
+			if (pe instanceof Class) {
+				if (StereotypeUtil.isApplied(pe, SensorData)) {
+					sensorData.add(pe as Class)
+				}
+			}
+		}
+		return sensorData
+	}
+
+	def static getStateVars(Package resourcePkg) {
+		val stateVars = new ArrayList<Class>()
+		for (pe : resourcePkg.packagedElements) {
+			if (pe instanceof Class) {
+				if (StereotypeUtil.isApplied(pe, StateVariable)) {
+					stateVars.add(pe as Class)
+				}
+			}
+		}
+		return stateVars
+	}
+	
+	static def getNonPortAttr(Class clazz) {
+		val attributes = new ArrayList<Property>()
+		for (attribute : clazz.attributes) {
+			if (!(attribute instanceof Port)) {
+				attributes.add(attribute)
+			}
+		}
+		return attributes
+	}
+
+	/**
+	 * return all subscribers accessible in the transitions from a state
+	 */
+	static def getSubscribers(State state) {
+		val subscribers = new ArrayList<String>
+		for (transition : state.outgoings) {
+			getSubscribers(transition, subscribers)
+		}
+		return subscribers
+	}
+
+	/**
+	 * Analyze the constraint (of a transition). ADd all objects that are queried
+	 * via get as potential subscribers
+	 */
+	static def void getSubscribers(Transition transition, List<String> subscribers) {
+		val guardStr = transition.guardStr
+		var first = true
+		if (guardStr !== null) {
+			val tokens = guardStr.split(".get\\(\\)")
+			for (var i = 0; i<tokens.size-1; i++) {
+				val token = tokens.get(i)
+				val lastSpace = token.lastIndexOf(" ")
+				var String subscriber = null
+				if (lastSpace > 0 && lastSpace<token.length-1) {
+					subscriber = token.substring(lastSpace + 1)
+				}
+				else if (first) {
+					subscriber = token
+					first = false
+				}
+				if (subscriber !== null && !subscribers.contains(subscriber)) {
+					subscribers.add(subscriber)
+				}
+			}
+		}
+	}
+
+	static def guardStr(Transition transition) {
+		if (transition.guard !== null) {
+			val spec = transition.guard.specification
+			if (spec instanceof OpaqueExpression) {
+				return spec.bodies.get(0)
+			}
+		}
+		return null
+	}
+
+	static def effectStr(Transition c) {
+		if (c.effect instanceof OpaqueBehavior) {
+			val ob = c.effect as OpaqueBehavior
+			return ob.bodies.get(0)
+		}
+		return null
+	}
+	
+	/**
+	 * 
+	 */
+	static def getOrchestratorSM(Class gw) {
+		val orchProp = gw.getOwnedAttribute(ORCHESTRATOR, null);
+		if (orchProp !== null && orchProp.type instanceof Class) {
+			val orchestrator = orchProp.type as Class
+			if (orchestrator.classifierBehavior instanceof StateMachine) {
+				return orchestrator.classifierBehavior as StateMachine
+			}
+			else if (orchestrator.ownedBehaviors.size > 0) {
+				return orchestrator.ownedBehaviors.get(0) as StateMachine
+			}
+		}
+		return null
+	}
+}
\ No newline at end of file
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/brainiot/.gitignore b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/brainiot/.gitignore
new file mode 100644
index 0000000..4394ee1
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/brainiot/.gitignore
@@ -0,0 +1,6 @@
+/.CreateSNA.java._trace
+/.CreateXML.java._trace
+/.SensiNact.java._trace
+/CreateSNA.java
+/CreateXML.java
+/SensiNact.java
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/brainiot/utils/.gitignore b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/brainiot/utils/.gitignore
new file mode 100644
index 0000000..793120d
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/brainiot/utils/.gitignore
@@ -0,0 +1,2 @@
+/.IoTGenUtils.java._trace
+/IoTGenUtils.java
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/CreateSNA.java b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/CreateSNA.java
new file mode 100644
index 0000000..576a9a1
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/CreateSNA.java
@@ -0,0 +1,137 @@
+package org.eclipse.papyrus.iotml.sna.codegen;
+
+import com.google.common.base.Objects;
+import java.util.ArrayList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.papyrus.designer.transformation.library.xtend.StateMachineUtil;
+import org.eclipse.papyrus.infra.tools.file.ProjectBasedFileAccess;
+import org.eclipse.papyrus.iotml.sensinact.Gateway;
+import org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils;
+import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.State;
+import org.eclipse.uml2.uml.StateMachine;
+import org.eclipse.uml2.uml.Transition;
+import org.eclipse.uml2.uml.Type;
+import org.eclipse.uml2.uml.util.UMLUtil;
+import org.eclipse.xtend2.lib.StringConcatenation;
+
+@SuppressWarnings("all")
+public class CreateSNA {
+  public static void createSNA(final ProjectBasedFileAccess pba, final org.eclipse.uml2.uml.Package model) {
+    EList<PackageableElement> _packagedElements = model.getPackagedElements();
+    for (final PackageableElement pe : _packagedElements) {
+      if ((pe instanceof org.eclipse.uml2.uml.Class)) {
+        final Gateway gw = UMLUtil.<Gateway>getStereotypeApplication(pe, Gateway.class);
+        if ((gw != null)) {
+          final StateMachine orchestratorSM = IoTGenUtils.getOrchestratorSM(((org.eclipse.uml2.uml.Class) pe));
+          CreateSNA.createSNA(pba, ((org.eclipse.uml2.uml.Class) pe), orchestratorSM);
+        }
+      } else {
+        if ((pe instanceof org.eclipse.uml2.uml.Package)) {
+          CreateSNA.createSNA(pba, ((org.eclipse.uml2.uml.Package) pe));
+        }
+      }
+    }
+  }
+  
+  public static void createSNA(final ProjectBasedFileAccess pba, final org.eclipse.uml2.uml.Class gw, final StateMachine orchestratorSM) {
+    EList<State> _states = StateMachineUtil.states(orchestratorSM);
+    for (final State state : _states) {
+      String _name = state.getName();
+      boolean _notEquals = (!Objects.equal(_name, "WaitingForEvents"));
+      if (_notEquals) {
+        StringConcatenation _builder = new StringConcatenation();
+        String _name_1 = state.getName();
+        _builder.append(_name_1);
+        _builder.append(".sna");
+        pba.generateFile(_builder.toString(), CreateSNA.createSNA(gw, state));
+      }
+    }
+  }
+  
+  public static String createSNA(final org.eclipse.uml2.uml.Class gw, final State state) {
+    StringConcatenation _builder = new StringConcatenation();
+    {
+      EList<Property> _ownedAttributes = gw.getOwnedAttributes();
+      for(final Property part : _ownedAttributes) {
+        {
+          if (((!Objects.equal(part.getName(), IoTGenUtils.ORCHESTRATOR)) && (part.getType() instanceof org.eclipse.uml2.uml.Class))) {
+            Type _type = part.getType();
+            final org.eclipse.uml2.uml.Class component = ((org.eclipse.uml2.uml.Class) _type);
+            _builder.newLineIfNotEmpty();
+            {
+              EList<Port> _ownedPorts = component.getOwnedPorts();
+              for(final Port port : _ownedPorts) {
+                _builder.append("resource ");
+                String _name = port.getName();
+                _builder.append(_name);
+                _builder.append("=[");
+                String _name_1 = gw.getName();
+                _builder.append(_name_1);
+                _builder.append("/");
+                String _name_2 = component.getName();
+                _builder.append(_name_2);
+                _builder.append("/control/");
+                String _name_3 = port.getName();
+                _builder.append(_name_3);
+                _builder.append("]");
+                _builder.newLineIfNotEmpty();
+              }
+            }
+            _builder.newLine();
+          }
+        }
+      }
+    }
+    _builder.newLine();
+    _builder.append("on ");
+    {
+      ArrayList<String> _subscribers = IoTGenUtils.getSubscribers(state);
+      boolean _hasElements = false;
+      for(final String subscriber : _subscribers) {
+        if (!_hasElements) {
+          _hasElements = true;
+        } else {
+          _builder.appendImmediate(", ", "");
+        }
+        _builder.append(subscriber);
+        _builder.append(".subscribe()");
+      }
+    }
+    _builder.newLineIfNotEmpty();
+    _builder.newLine();
+    final EList<Transition> outgoings = state.getOutgoings();
+    _builder.newLineIfNotEmpty();
+    {
+      for(final Transition transition : outgoings) {
+        {
+          Transition _get = outgoings.get(0);
+          boolean _notEquals = (!Objects.equal(transition, _get));
+          if (_notEquals) {
+            _builder.append("else ");
+          }
+        }
+        _builder.append("if ");
+        String _guardStr = IoTGenUtils.guardStr(transition);
+        _builder.append(_guardStr);
+        _builder.append(" do");
+        _builder.newLineIfNotEmpty();
+        _builder.append("\t");
+        String _effectStr = IoTGenUtils.effectStr(transition);
+        _builder.append(_effectStr, "\t");
+        _builder.newLineIfNotEmpty();
+      }
+    }
+    {
+      int _size = outgoings.size();
+      boolean _greaterThan = (_size > 0);
+      if (_greaterThan) {
+        _builder.append("end if");
+        _builder.newLine();
+      }
+    }
+    return _builder.toString();
+  }
+}
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/CreateXML.java b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/CreateXML.java
new file mode 100644
index 0000000..141da0e
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/CreateXML.java
@@ -0,0 +1,421 @@
+package org.eclipse.papyrus.iotml.sna.codegen;
+
+import java.util.ArrayList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.papyrus.infra.tools.file.ProjectBasedFileAccess;
+import org.eclipse.papyrus.iotml.sensinact.Action;
+import org.eclipse.papyrus.iotml.sensinact.SensorData;
+import org.eclipse.papyrus.iotml.sensinact.ServiceProvider;
+import org.eclipse.papyrus.iotml.sensinact.StateVariable;
+import org.eclipse.papyrus.iotml.sna.codegen.utils.IoTGenUtils;
+import org.eclipse.uml2.uml.Enumeration;
+import org.eclipse.uml2.uml.EnumerationLiteral;
+import org.eclipse.uml2.uml.InstanceSpecification;
+import org.eclipse.uml2.uml.InstanceValue;
+import org.eclipse.uml2.uml.Operation;
+import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.Parameter;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.Type;
+import org.eclipse.uml2.uml.ValueSpecification;
+import org.eclipse.uml2.uml.util.UMLUtil;
+import org.eclipse.xtend2.lib.StringConcatenation;
+
+@SuppressWarnings("all")
+public class CreateXML {
+  public static void createXML(final ProjectBasedFileAccess pba, final org.eclipse.uml2.uml.Package model) {
+    EList<PackageableElement> _packagedElements = model.getPackagedElements();
+    for (final PackageableElement pe : _packagedElements) {
+      if ((pe instanceof org.eclipse.uml2.uml.Class)) {
+        final ServiceProvider sp = UMLUtil.<ServiceProvider>getStereotypeApplication(pe, ServiceProvider.class);
+        if ((sp != null)) {
+          StringConcatenation _builder = new StringConcatenation();
+          String _name = ((org.eclipse.uml2.uml.Class)pe).getName();
+          _builder.append(_name);
+          _builder.append("-resource.xml");
+          pba.generateFile(_builder.toString(), CreateXML.createXML(((org.eclipse.uml2.uml.Class) pe)));
+        }
+      } else {
+        if ((pe instanceof org.eclipse.uml2.uml.Package)) {
+          CreateXML.createXML(pba, ((org.eclipse.uml2.uml.Package) pe));
+        }
+      }
+    }
+  }
+  
+  public static String createXML(final org.eclipse.uml2.uml.Class serviceProvider) {
+    PackageableElement _packagedElement = serviceProvider.getNearestPackage().getPackagedElement("Resources");
+    return CreateXML.createXMLResources(serviceProvider, ((org.eclipse.uml2.uml.Package) _packagedElement));
+  }
+  
+  public static String createXMLResources(final org.eclipse.uml2.uml.Class serviceProvider, final org.eclipse.uml2.uml.Package resourcePkg) {
+    StringConcatenation _builder = new StringConcatenation();
+    _builder.append("<!--");
+    _builder.newLine();
+    _builder.append("  ");
+    _builder.append("~ Copyright (c) 2020 CEA.");
+    _builder.newLine();
+    _builder.append("  ");
+    _builder.append("~ All rights reserved. This program and the accompanying materials");
+    _builder.newLine();
+    _builder.append("  ");
+    _builder.append("~ are made available under the terms of the Eclipse Public License v1.0");
+    _builder.newLine();
+    _builder.append("  ");
+    _builder.append("~ which accompanies this distribution, and is available at");
+    _builder.newLine();
+    _builder.append("  ");
+    _builder.append("~ http://www.eclipse.org/legal/epl-v10.html");
+    _builder.newLine();
+    _builder.append("  ");
+    _builder.append("~");
+    _builder.newLine();
+    _builder.append("  ");
+    _builder.append("~ Contributors:");
+    _builder.newLine();
+    _builder.append("  ");
+    _builder.append("~    CEA - initial API and implementation");
+    _builder.newLine();
+    _builder.append("  ");
+    _builder.append("-->");
+    _builder.newLine();
+    _builder.newLine();
+    _builder.append("<resourceInfos xmlns=\"http://org.eclipse.sensinact/resource\"");
+    _builder.newLine();
+    _builder.append("\t");
+    _builder.append("xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
+    _builder.newLine();
+    _builder.append("\t");
+    _builder.append("xsi:schemaLocation=\"http://org.eclipse.sensinact/resource ../../../../../platform/sensinact-generic/src/main/resources/sensinact-resource.xsd\">");
+    _builder.newLine();
+    {
+      ArrayList<org.eclipse.uml2.uml.Class> _sensorData = IoTGenUtils.getSensorData(resourcePkg);
+      for(final org.eclipse.uml2.uml.Class action : _sensorData) {
+        _builder.append("\t");
+        String _createSensorData = CreateXML.createSensorData(action);
+        _builder.append(_createSensorData, "\t");
+        _builder.newLineIfNotEmpty();
+      }
+    }
+    {
+      ArrayList<org.eclipse.uml2.uml.Class> _stateVars = IoTGenUtils.getStateVars(resourcePkg);
+      for(final org.eclipse.uml2.uml.Class action_1 : _stateVars) {
+        _builder.append("\t");
+        String _createStateVars = CreateXML.createStateVars(action_1);
+        _builder.append(_createStateVars, "\t");
+        _builder.newLineIfNotEmpty();
+      }
+    }
+    {
+      ArrayList<org.eclipse.uml2.uml.Class> _actions = IoTGenUtils.getActions(resourcePkg);
+      for(final org.eclipse.uml2.uml.Class action_2 : _actions) {
+        _builder.append("\t");
+        String _createAction = CreateXML.createAction(action_2);
+        _builder.append(_createAction, "\t");
+        _builder.newLineIfNotEmpty();
+      }
+    }
+    _builder.append("\t");
+    _builder.newLine();
+    _builder.append("\t");
+    _builder.append("<devices>");
+    _builder.newLine();
+    _builder.append("\t\t");
+    _builder.append("<device identifier=\"");
+    String _name = serviceProvider.getName();
+    _builder.append(_name, "\t\t");
+    _builder.append("\">");
+    _builder.newLineIfNotEmpty();
+    _builder.append("\t\t\t");
+    _builder.append("<service name=\"Control\"/>");
+    _builder.newLine();
+    _builder.append("\t\t");
+    _builder.append("</device>");
+    _builder.newLine();
+    _builder.append("\t");
+    _builder.append("</devices>");
+    _builder.newLine();
+    _builder.append("</resourceInfos>");
+    _builder.newLine();
+    return _builder.toString();
+  }
+  
+  public static String createSensorData(final org.eclipse.uml2.uml.Class sensorData) {
+    StringConcatenation _builder = new StringConcatenation();
+    final SensorData sensorDataSt = UMLUtil.<SensorData>getStereotypeApplication(sensorData, SensorData.class);
+    _builder.newLineIfNotEmpty();
+    _builder.append("<resourceInfo xsi:type=\"resourceInfoSensor\" name=\"");
+    String _friendlyName = sensorDataSt.getFriendlyName();
+    _builder.append(_friendlyName);
+    _builder.append("\" target=\"control\">");
+    _builder.newLineIfNotEmpty();
+    _builder.append("\t");
+    _builder.append("<identifier xsi:type=\"stringContent\">");
+    String _qualifiedName = sensorData.getQualifiedName();
+    _builder.append(_qualifiedName, "\t");
+    _builder.append("</identifier>");
+    _builder.newLineIfNotEmpty();
+    {
+      int _size = IoTGenUtils.getNonPortAttr(sensorData).size();
+      boolean _greaterThan = (_size > 0);
+      if (_greaterThan) {
+        _builder.append("\t");
+        _builder.append("<attributes>");
+        _builder.newLine();
+        {
+          ArrayList<Property> _nonPortAttr = IoTGenUtils.getNonPortAttr(sensorData);
+          for(final Property attribute : _nonPortAttr) {
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("<attribute name=\"");
+            String _name = attribute.getName();
+            _builder.append(_name, "\t\t");
+            _builder.append("\" type=\"string\" modifiable=\"UPDATABLE\">");
+            _builder.newLineIfNotEmpty();
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("<value>");
+            String _defaultVal = CreateXML.defaultVal(attribute);
+            _builder.append(_defaultVal, "\t\t\t");
+            _builder.append("</value>");
+            _builder.newLineIfNotEmpty();
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("\t");
+            CharSequence _enumConstraints = CreateXML.enumConstraints(attribute.getType());
+            _builder.append(_enumConstraints, "\t\t\t");
+            _builder.newLineIfNotEmpty();
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("</attribute>");
+            _builder.newLine();
+          }
+        }
+        _builder.append("\t");
+        _builder.append("</attributes>");
+        _builder.newLine();
+      }
+    }
+    _builder.append("</resourceInfo>");
+    _builder.newLine();
+    return _builder.toString();
+  }
+  
+  public static String createStateVars(final org.eclipse.uml2.uml.Class stateVar) {
+    StringConcatenation _builder = new StringConcatenation();
+    final StateVariable stateVarSt = UMLUtil.<StateVariable>getStereotypeApplication(stateVar, StateVariable.class);
+    _builder.newLineIfNotEmpty();
+    _builder.append("<resourceInfo xsi:type=\"resourceInfoSensor\" name=\"");
+    String _friendlyName = stateVarSt.getFriendlyName();
+    _builder.append(_friendlyName);
+    _builder.append("\" target=\"control\">");
+    _builder.newLineIfNotEmpty();
+    _builder.append("\t");
+    _builder.append("<identifier xsi:type=\"stringContent\">");
+    String _qualifiedName = stateVar.getQualifiedName();
+    _builder.append(_qualifiedName, "\t");
+    _builder.append("</identifier>");
+    _builder.newLineIfNotEmpty();
+    {
+      int _size = IoTGenUtils.getNonPortAttr(stateVar).size();
+      boolean _greaterThan = (_size > 0);
+      if (_greaterThan) {
+        _builder.append("\t");
+        _builder.append("<attributes>");
+        _builder.newLine();
+        {
+          ArrayList<Property> _nonPortAttr = IoTGenUtils.getNonPortAttr(stateVar);
+          for(final Property attribute : _nonPortAttr) {
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("<attribute name=\"");
+            String _name = attribute.getName();
+            _builder.append(_name, "\t\t");
+            _builder.append("\" type=\"string\" modifiable=\"UPDATABLE\">");
+            _builder.newLineIfNotEmpty();
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("<value>");
+            String _defaultVal = CreateXML.defaultVal(attribute);
+            _builder.append(_defaultVal, "\t\t\t");
+            _builder.append("</value>");
+            _builder.newLineIfNotEmpty();
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("\t");
+            CharSequence _enumConstraints = CreateXML.enumConstraints(attribute.getType());
+            _builder.append(_enumConstraints, "\t\t\t");
+            _builder.newLineIfNotEmpty();
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("</attribute>");
+            _builder.newLine();
+          }
+        }
+        _builder.append("\t");
+        _builder.append("</attributes>");
+        _builder.newLine();
+      }
+    }
+    _builder.append("</resourceInfo>");
+    _builder.newLine();
+    return _builder.toString();
+  }
+  
+  /**
+   * Create XML code for an action
+   */
+  public static String createAction(final org.eclipse.uml2.uml.Class action) {
+    StringConcatenation _builder = new StringConcatenation();
+    final Action actionSt = UMLUtil.<Action>getStereotypeApplication(action, Action.class);
+    _builder.newLineIfNotEmpty();
+    _builder.append("<resourceInfo xsi:type=\"resourceInfoSensor\" name=\"");
+    String _friendlyName = actionSt.getFriendlyName();
+    _builder.append(_friendlyName);
+    _builder.append("\" target=\"control\">");
+    _builder.newLineIfNotEmpty();
+    _builder.append("\t");
+    _builder.append("<identifier xsi:type=\"stringContent\">");
+    String _qualifiedName = action.getQualifiedName();
+    _builder.append(_qualifiedName, "\t");
+    _builder.append("</identifier>");
+    _builder.newLineIfNotEmpty();
+    {
+      int _size = IoTGenUtils.getNonPortAttr(action).size();
+      boolean _greaterThan = (_size > 0);
+      if (_greaterThan) {
+        _builder.append("\t");
+        _builder.append("<attributes>");
+        _builder.newLine();
+        {
+          ArrayList<Property> _nonPortAttr = IoTGenUtils.getNonPortAttr(action);
+          for(final Property attribute : _nonPortAttr) {
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("<attribute name=\"");
+            String _name = attribute.getName();
+            _builder.append(_name, "\t\t");
+            _builder.append("\" type=\"string\" modifiable=\"UPDATABLE\">");
+            _builder.newLineIfNotEmpty();
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("<value>");
+            String _defaultVal = CreateXML.defaultVal(attribute);
+            _builder.append(_defaultVal, "\t\t\t");
+            _builder.append("</value>");
+            _builder.newLineIfNotEmpty();
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("\t");
+            CharSequence _enumConstraints = CreateXML.enumConstraints(attribute.getType());
+            _builder.append(_enumConstraints, "\t\t\t");
+            _builder.newLineIfNotEmpty();
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("</attribute>");
+            _builder.newLine();
+          }
+        }
+        _builder.append("\t");
+        _builder.append("</attributes>");
+        _builder.newLine();
+      }
+    }
+    {
+      int _size_1 = action.getOperations().size();
+      boolean _greaterThan_1 = (_size_1 > 0);
+      if (_greaterThan_1) {
+        _builder.append("\t");
+        _builder.append("<methods>");
+        _builder.newLine();
+        {
+          EList<Operation> _operations = action.getOperations();
+          for(final Operation method : _operations) {
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("<method name=\"");
+            String _name_1 = method.getName();
+            _builder.append(_name_1, "\t\t");
+            _builder.append("\" type=\"string\" type=\"ACT\">");
+            _builder.newLineIfNotEmpty();
+            {
+              EList<Parameter> _ownedParameters = method.getOwnedParameters();
+              for(final Parameter parameter : _ownedParameters) {
+                _builder.append("\t");
+                _builder.append("\t");
+                _builder.append("\t");
+                _builder.append("<parameter name=\"");
+                String _name_2 = parameter.getName();
+                _builder.append(_name_2, "\t\t\t");
+                _builder.append("\" type=\"");
+                String _name_3 = parameter.getType().getName();
+                _builder.append(_name_3, "\t\t\t");
+                _builder.append("\"/>");
+                _builder.newLineIfNotEmpty();
+              }
+            }
+            _builder.append("\t");
+            _builder.append("\t");
+            _builder.append("</mehod>");
+            _builder.newLine();
+          }
+        }
+        _builder.append("\t");
+        _builder.append("</methods>");
+        _builder.newLine();
+      }
+    }
+    _builder.append("</resourceInfo>");
+    _builder.newLine();
+    return _builder.toString();
+  }
+  
+  public static String defaultVal(final Property attribute) {
+    final ValueSpecification defaultValue = attribute.getDefaultValue();
+    if ((defaultValue instanceof InstanceValue)) {
+      final InstanceSpecification instance = ((InstanceValue) defaultValue).getInstance();
+      if ((instance instanceof EnumerationLiteral)) {
+        return ((EnumerationLiteral) instance).getLabel();
+      }
+    }
+    if ((defaultValue != null)) {
+      return defaultValue.stringValue();
+    }
+    return null;
+  }
+  
+  public static CharSequence enumConstraints(final Type type) {
+    StringConcatenation _builder = new StringConcatenation();
+    {
+      if ((type instanceof Enumeration)) {
+        _builder.append("<constraints>");
+        _builder.newLine();
+        _builder.append("\t");
+        _builder.append("<pattern value=\"(");
+        {
+          EList<EnumerationLiteral> _ownedLiterals = ((Enumeration) type).getOwnedLiterals();
+          boolean _hasElements = false;
+          for(final EnumerationLiteral lit : _ownedLiterals) {
+            if (!_hasElements) {
+              _hasElements = true;
+            } else {
+              _builder.appendImmediate("|", "\t");
+            }
+            _builder.append("(");
+            String _name = lit.getName();
+            _builder.append(_name, "\t");
+            _builder.append(")");
+          }
+        }
+        _builder.append(")\"/>");
+        _builder.newLineIfNotEmpty();
+        _builder.append("</constraints>");
+        _builder.newLine();
+      }
+    }
+    return _builder;
+  }
+}
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/SensiNact.java b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/SensiNact.java
new file mode 100644
index 0000000..b61be51
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/SensiNact.java
@@ -0,0 +1,232 @@
+package org.eclipse.papyrus.iotml.sna.codegen;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.papyrus.designer.transformation.library.xtend.StateMachineUtil;
+import org.eclipse.papyrus.iotml.sensinact.Action;
+import org.eclipse.papyrus.iotml.sensinact.Resource;
+import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.CallEvent;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.Event;
+import org.eclipse.uml2.uml.Namespace;
+import org.eclipse.uml2.uml.OpaqueBehavior;
+import org.eclipse.uml2.uml.OpaqueExpression;
+import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.Pseudostate;
+import org.eclipse.uml2.uml.State;
+import org.eclipse.uml2.uml.StateMachine;
+import org.eclipse.uml2.uml.Transition;
+import org.eclipse.uml2.uml.Trigger;
+import org.eclipse.uml2.uml.ValueSpecification;
+import org.eclipse.uml2.uml.Vertex;
+import org.eclipse.uml2.uml.util.UMLUtil;
+import org.eclipse.xtend2.lib.StringConcatenation;
+
+@SuppressWarnings("all")
+public class SensiNact {
+  public static String sensinact(final org.eclipse.uml2.uml.Package pkg) {
+    StringConcatenation _builder = new StringConcatenation();
+    _builder.append("// resources");
+    _builder.newLine();
+    String _resources = SensiNact.resources(pkg);
+    _builder.append(_resources);
+    _builder.newLineIfNotEmpty();
+    _builder.newLine();
+    String _statemachines = SensiNact.statemachines(pkg);
+    _builder.append(_statemachines);
+    _builder.newLineIfNotEmpty();
+    return _builder.toString();
+  }
+  
+  public static String resources(final org.eclipse.uml2.uml.Package pkg) {
+    String out = "";
+    EList<PackageableElement> _packagedElements = pkg.getPackagedElements();
+    for (final PackageableElement pe : _packagedElements) {
+      if ((pe instanceof org.eclipse.uml2.uml.Package)) {
+        String _out = out;
+        String _resources = SensiNact.resources(((org.eclipse.uml2.uml.Package) pe));
+        out = (_out + _resources);
+      } else {
+        if ((pe instanceof org.eclipse.uml2.uml.Class)) {
+          final org.eclipse.uml2.uml.Class clazz = ((org.eclipse.uml2.uml.Class) pe);
+          final Resource resource = UMLUtil.<Resource>getStereotypeApplication(clazz, Resource.class);
+          final Behavior behavior = clazz.getClassifierBehavior();
+          if (((resource != null) || (behavior instanceof StateMachine))) {
+            String _out_1 = out;
+            StringConcatenation _builder = new StringConcatenation();
+            _builder.append("resource ");
+            String _name = clazz.getName();
+            _builder.append(_name);
+            _builder.append("=/");
+            String _replace = clazz.getQualifiedName().replace(Namespace.SEPARATOR, "/");
+            _builder.append(_replace);
+            _builder.newLineIfNotEmpty();
+            out = (_out_1 + _builder);
+          }
+        }
+      }
+    }
+    return out;
+  }
+  
+  public static String statemachines(final org.eclipse.uml2.uml.Package pkg) {
+    String out = "";
+    EList<PackageableElement> _packagedElements = pkg.getPackagedElements();
+    for (final PackageableElement pe : _packagedElements) {
+      if ((pe instanceof org.eclipse.uml2.uml.Package)) {
+        String _out = out;
+        String _statemachines = SensiNact.statemachines(((org.eclipse.uml2.uml.Package) pe));
+        out = (_out + _statemachines);
+      } else {
+        if ((pe instanceof org.eclipse.uml2.uml.Class)) {
+          final org.eclipse.uml2.uml.Class clazz = ((org.eclipse.uml2.uml.Class) pe);
+          final Behavior behavior = clazz.getClassifierBehavior();
+          if ((behavior instanceof StateMachine)) {
+            String _out_1 = out;
+            CharSequence _createSM = SensiNact.createSM(((StateMachine) behavior));
+            out = (_out_1 + _createSM);
+          }
+        }
+      }
+    }
+    return out;
+  }
+  
+  public static CharSequence createSM(final StateMachine sm) {
+    StringConcatenation _builder = new StringConcatenation();
+    _builder.append("// ------- for state-machine ");
+    String _name = sm.getName();
+    _builder.append(_name);
+    _builder.append(" --------");
+    _builder.newLineIfNotEmpty();
+    {
+      EList<State> _states = StateMachineUtil.states(StateMachineUtil.region(sm));
+      for(final State state : _states) {
+      }
+    }
+    _builder.newLine();
+    {
+      EList<Transition> _transitions = StateMachineUtil.region(sm).getTransitions();
+      boolean _hasElements = false;
+      for(final Transition transition : _transitions) {
+        if (!_hasElements) {
+          _hasElements = true;
+        } else {
+          _builder.appendImmediate("", "");
+        }
+        {
+          Vertex _source = transition.getSource();
+          boolean _not = (!(_source instanceof Pseudostate));
+          if (_not) {
+            _builder.append("// from <");
+            String _name_1 = transition.getSource().getName();
+            _builder.append(_name_1);
+            _builder.append("> to <");
+            String _name_2 = transition.getTarget().getName();
+            _builder.append(_name_2);
+            _builder.append(">");
+            _builder.newLineIfNotEmpty();
+            {
+              int _size = transition.getTriggers().size();
+              boolean _greaterThan = (_size > 0);
+              if (_greaterThan) {
+                final Trigger trigger = transition.getTriggers().get(0);
+                _builder.newLineIfNotEmpty();
+                {
+                  if (((trigger != null) && (trigger.getEvent() instanceof CallEvent))) {
+                    Event _event = trigger.getEvent();
+                    final CallEvent ce = ((CallEvent) _event);
+                    _builder.newLineIfNotEmpty();
+                    _builder.append("on ");
+                    String _name_3 = ce.getName();
+                    _builder.append(_name_3);
+                    _builder.append(" do");
+                    _builder.newLineIfNotEmpty();
+                  } else {
+                    _builder.append("no-call-event");
+                    _builder.newLine();
+                  }
+                }
+              } else {
+                _builder.append("on default");
+                _builder.newLine();
+              }
+            }
+            _builder.append("\t");
+            CharSequence _conditionAction = SensiNact.conditionAction(transition);
+            _builder.append(_conditionAction, "\t");
+            _builder.newLineIfNotEmpty();
+            _builder.newLine();
+          }
+        }
+      }
+    }
+    _builder.newLine();
+    return _builder;
+  }
+  
+  public static CharSequence conditionAction(final Transition transition) {
+    StringConcatenation _builder = new StringConcatenation();
+    {
+      Constraint _guard = transition.getGuard();
+      boolean _tripleNotEquals = (_guard != null);
+      if (_tripleNotEquals) {
+        _builder.append("if ");
+        CharSequence _guardStr = SensiNact.guardStr(transition.getGuard().getSpecification());
+        _builder.append(_guardStr);
+        _builder.append(" do");
+        _builder.newLineIfNotEmpty();
+        _builder.append("\t");
+        CharSequence _effectStr = SensiNact.effectStr(transition);
+        _builder.append(_effectStr, "\t");
+        _builder.newLineIfNotEmpty();
+        _builder.append("end if;");
+        _builder.newLine();
+      } else {
+        CharSequence _effectStr_1 = SensiNact.effectStr(transition);
+        _builder.append(_effectStr_1);
+        _builder.newLineIfNotEmpty();
+      }
+    }
+    return _builder;
+  }
+  
+  public static CharSequence guardStr(final ValueSpecification vs) {
+    StringConcatenation _builder = new StringConcatenation();
+    {
+      if ((vs instanceof OpaqueExpression)) {
+        final OpaqueExpression oe = ((OpaqueExpression) vs);
+        _builder.newLineIfNotEmpty();
+        String _get = oe.getBodies().get(0);
+        _builder.append(_get);
+      }
+    }
+    return _builder;
+  }
+  
+  public static CharSequence effectStr(final Transition transition) {
+    StringConcatenation _builder = new StringConcatenation();
+    {
+      Behavior _effect = transition.getEffect();
+      if ((_effect instanceof OpaqueBehavior)) {
+        Behavior _effect_1 = transition.getEffect();
+        final OpaqueBehavior ob = ((OpaqueBehavior) _effect_1);
+        _builder.newLineIfNotEmpty();
+        final Action action = UMLUtil.<Action>getStereotypeApplication(ob, Action.class);
+        _builder.newLineIfNotEmpty();
+        {
+          if ((action != null)) {
+          } else {
+            String _get = ob.getBodies().get(0);
+            _builder.append(_get);
+            _builder.newLineIfNotEmpty();
+          }
+        }
+      } else {
+        _builder.append("default-body");
+        _builder.newLine();
+      }
+    }
+    return _builder;
+  }
+}
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/utils/IoTGenUtils.java b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/utils/IoTGenUtils.java
new file mode 100644
index 0000000..81d077f
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.codegen/xtend-gen/org/eclipse/papyrus/iotml/sna/codegen/utils/IoTGenUtils.java
@@ -0,0 +1,165 @@
+package org.eclipse.papyrus.iotml.sna.codegen.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.papyrus.iotml.sensinact.Action;
+import org.eclipse.papyrus.iotml.sensinact.SensorData;
+import org.eclipse.papyrus.iotml.sensinact.StateVariable;
+import org.eclipse.papyrus.uml.tools.utils.StereotypeUtil;
+import org.eclipse.uml2.uml.Behavior;
+import org.eclipse.uml2.uml.Constraint;
+import org.eclipse.uml2.uml.OpaqueBehavior;
+import org.eclipse.uml2.uml.OpaqueExpression;
+import org.eclipse.uml2.uml.PackageableElement;
+import org.eclipse.uml2.uml.Port;
+import org.eclipse.uml2.uml.Property;
+import org.eclipse.uml2.uml.State;
+import org.eclipse.uml2.uml.StateMachine;
+import org.eclipse.uml2.uml.Transition;
+import org.eclipse.uml2.uml.Type;
+import org.eclipse.uml2.uml.ValueSpecification;
+import org.eclipse.xtext.xbase.lib.Conversions;
+
+@SuppressWarnings("all")
+public class IoTGenUtils {
+  public static String ORCHESTRATOR = "orchestrator";
+  
+  public static ArrayList<org.eclipse.uml2.uml.Class> getActions(final org.eclipse.uml2.uml.Package resourcePkg) {
+    final ArrayList<org.eclipse.uml2.uml.Class> actionList = new ArrayList<org.eclipse.uml2.uml.Class>();
+    EList<PackageableElement> _packagedElements = resourcePkg.getPackagedElements();
+    for (final PackageableElement pe : _packagedElements) {
+      if ((pe instanceof org.eclipse.uml2.uml.Class)) {
+        boolean _isApplied = StereotypeUtil.isApplied(pe, Action.class);
+        if (_isApplied) {
+          actionList.add(((org.eclipse.uml2.uml.Class) pe));
+        }
+      }
+    }
+    return actionList;
+  }
+  
+  public static ArrayList<org.eclipse.uml2.uml.Class> getSensorData(final org.eclipse.uml2.uml.Package resourcePkg) {
+    final ArrayList<org.eclipse.uml2.uml.Class> sensorData = new ArrayList<org.eclipse.uml2.uml.Class>();
+    EList<PackageableElement> _packagedElements = resourcePkg.getPackagedElements();
+    for (final PackageableElement pe : _packagedElements) {
+      if ((pe instanceof org.eclipse.uml2.uml.Class)) {
+        boolean _isApplied = StereotypeUtil.isApplied(pe, SensorData.class);
+        if (_isApplied) {
+          sensorData.add(((org.eclipse.uml2.uml.Class) pe));
+        }
+      }
+    }
+    return sensorData;
+  }
+  
+  public static ArrayList<org.eclipse.uml2.uml.Class> getStateVars(final org.eclipse.uml2.uml.Package resourcePkg) {
+    final ArrayList<org.eclipse.uml2.uml.Class> stateVars = new ArrayList<org.eclipse.uml2.uml.Class>();
+    EList<PackageableElement> _packagedElements = resourcePkg.getPackagedElements();
+    for (final PackageableElement pe : _packagedElements) {
+      if ((pe instanceof org.eclipse.uml2.uml.Class)) {
+        boolean _isApplied = StereotypeUtil.isApplied(pe, StateVariable.class);
+        if (_isApplied) {
+          stateVars.add(((org.eclipse.uml2.uml.Class) pe));
+        }
+      }
+    }
+    return stateVars;
+  }
+  
+  public static ArrayList<Property> getNonPortAttr(final org.eclipse.uml2.uml.Class clazz) {
+    final ArrayList<Property> attributes = new ArrayList<Property>();
+    EList<Property> _attributes = clazz.getAttributes();
+    for (final Property attribute : _attributes) {
+      if ((!(attribute instanceof Port))) {
+        attributes.add(attribute);
+      }
+    }
+    return attributes;
+  }
+  
+  /**
+   * return all subscribers accessible in the transitions from a state
+   */
+  public static ArrayList<String> getSubscribers(final State state) {
+    final ArrayList<String> subscribers = new ArrayList<String>();
+    EList<Transition> _outgoings = state.getOutgoings();
+    for (final Transition transition : _outgoings) {
+      IoTGenUtils.getSubscribers(transition, subscribers);
+    }
+    return subscribers;
+  }
+  
+  /**
+   * Analyze the constraint (of a transition). ADd all objects that are queried
+   * via get as potential subscribers
+   */
+  public static void getSubscribers(final Transition transition, final List<String> subscribers) {
+    final String guardStr = IoTGenUtils.guardStr(transition);
+    boolean first = true;
+    if ((guardStr != null)) {
+      final String[] tokens = guardStr.split(".get\\(\\)");
+      for (int i = 0; (i < (((List<String>)Conversions.doWrapArray(tokens)).size() - 1)); i++) {
+        {
+          final String token = tokens[i];
+          final int lastSpace = token.lastIndexOf(" ");
+          String subscriber = null;
+          if (((lastSpace > 0) && (lastSpace < (token.length() - 1)))) {
+            subscriber = token.substring((lastSpace + 1));
+          } else {
+            if (first) {
+              subscriber = token;
+              first = false;
+            }
+          }
+          if (((subscriber != null) && (!subscribers.contains(subscriber)))) {
+            subscribers.add(subscriber);
+          }
+        }
+      }
+    }
+  }
+  
+  public static String guardStr(final Transition transition) {
+    Constraint _guard = transition.getGuard();
+    boolean _tripleNotEquals = (_guard != null);
+    if (_tripleNotEquals) {
+      final ValueSpecification spec = transition.getGuard().getSpecification();
+      if ((spec instanceof OpaqueExpression)) {
+        return ((OpaqueExpression)spec).getBodies().get(0);
+      }
+    }
+    return null;
+  }
+  
+  public static String effectStr(final Transition c) {
+    Behavior _effect = c.getEffect();
+    if ((_effect instanceof OpaqueBehavior)) {
+      Behavior _effect_1 = c.getEffect();
+      final OpaqueBehavior ob = ((OpaqueBehavior) _effect_1);
+      return ob.getBodies().get(0);
+    }
+    return null;
+  }
+  
+  public static StateMachine getOrchestratorSM(final org.eclipse.uml2.uml.Class gw) {
+    final Property orchProp = gw.getOwnedAttribute(IoTGenUtils.ORCHESTRATOR, null);
+    if (((orchProp != null) && (orchProp.getType() instanceof org.eclipse.uml2.uml.Class))) {
+      Type _type = orchProp.getType();
+      final org.eclipse.uml2.uml.Class orchestrator = ((org.eclipse.uml2.uml.Class) _type);
+      Behavior _classifierBehavior = orchestrator.getClassifierBehavior();
+      if ((_classifierBehavior instanceof StateMachine)) {
+        Behavior _classifierBehavior_1 = orchestrator.getClassifierBehavior();
+        return ((StateMachine) _classifierBehavior_1);
+      } else {
+        int _size = orchestrator.getOwnedBehaviors().size();
+        boolean _greaterThan = (_size > 0);
+        if (_greaterThan) {
+          Behavior _get = orchestrator.getOwnedBehaviors().get(0);
+          return ((StateMachine) _get);
+        }
+      }
+    }
+    return null;
+  }
+}
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.classpath b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.classpath
new file mode 100644
index 0000000..ebde520
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.classpath
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java">
+		<attributes>
+			<attribute name="optional" value="true"/>
+			<attribute name="maven.pomderived" value="true"/>
+			<attribute name="test" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.project b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.project
new file mode 100644
index 0000000..ddea1ab
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.project
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.papyrus.iotml.sna.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.settings/org.eclipse.core.resources.prefs b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.settings/org.eclipse.jdt.core.prefs b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..71ac301
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,6 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.settings/org.eclipse.m2e.core.prefs b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/build.properties b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/build.properties
new file mode 100644
index 0000000..fa4bd48
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/build.properties
@@ -0,0 +1,6 @@
+bin.includes = feature.xml,\
+               feature.properties,\
+               license.html,\
+               epl-v10.html
+src.includes = epl-v10.html,\
+               license.html
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/epl-v10.html b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/epl-v10.html
new file mode 100644
index 0000000..cb1073a
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/epl-v10.html
@@ -0,0 +1,304 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
+<html xmlns:o="urn:schemas-microsoft-com:office:office"
+xmlns:w="urn:schemas-microsoft-com:office:word"
+xmlns="http://www.w3.org/TR/REC-html40">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<link rel=File-List
+href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
+<title>Eclipse Public License - Version 1.0</title>
+<style>
+<!--
+ /* Font Definitions */
+@font-face
+	{
+	panose-1:2 11 6 4 3 5 4 4 2 4;
+	mso-font-charset:0;
+	mso-font-pitch:variable;
+	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
+ /* Style Definitions */
+p.MsoNormal, li.MsoNormal, div.MsoNormal
+	{mso-style-parent:"";
+	margin:0in;
+	margin-bottom:.0001pt;
+	mso-pagination:widow-orphan;
+	font-size:12.0pt;
+	}
+p
+	{margin-right:0in;
+	mso-margin-top-alt:auto;
+	mso-margin-bottom-alt:auto;
+	margin-left:0in;
+	mso-pagination:widow-orphan;
+	font-size:12.0pt;
+	}
+p.BalloonText, li.BalloonText, div.BalloonText
+	{mso-style-name:"Balloon Text";
+	margin:0in;
+	margin-bottom:.0001pt;
+	mso-pagination:widow-orphan;
+	font-size:8.0pt;
+	
+	}
+@page Section1
+	{size:8.5in 11.0in;
+	margin:1.0in 1.25in 1.0in 1.25in;
+	mso-header-margin:.5in;
+	mso-footer-margin:.5in;
+	mso-paper-source:0;}
+div.Section1
+	{page:Section1;}
+-->
+</style>
+</head>
+
+<body lang="EN-US" style='tab-interval:.5in'>
+
+<div class=Section1>
+
+<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
+</p>
+
+<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
+THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
+REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
+OF THIS AGREEMENT.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+in the case of the initial Contributor, the initial code and documentation
+distributed under this Agreement, and<br clear=left>
+b) in the case of each subsequent Contributor:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+changes to the Program, and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+additions to the Program;</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
+such changes and/or additions to the Program originate from and are distributed
+by that particular Contributor. A Contribution 'originates' from a Contributor
+if it was added to the Program by such Contributor itself or anyone acting on
+such Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in conjunction
+with the Program under their own license agreement, and (ii) are not derivative
+works of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
+entity that distributes the Program.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
+claims licensable by a Contributor which are necessarily infringed by the use
+or sale of its Contribution alone or when combined with the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
+distributed in accordance with this Agreement.</span> </p>
+
+<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
+receives the Program under this Agreement, including all Contributors.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+Subject to the terms of this Agreement, each Contributor hereby grants Recipient
+a non-exclusive, worldwide, royalty-free copyright license to<span
+style='color:red'> </span>reproduce, prepare derivative works of, publicly
+display, publicly perform, distribute and sublicense the Contribution of such
+Contributor, if any, and such derivative works, in source code and object code
+form.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+Subject to the terms of this Agreement, each Contributor hereby grants
+Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
+patent license under Licensed Patents to make, use, sell, offer to sell, import
+and otherwise transfer the Contribution of such Contributor, if any, in source
+code and object code form. This patent license shall apply to the combination
+of the Contribution and the Program if, at the time the Contribution is added
+by the Contributor, such addition of the Contribution causes such combination
+to be covered by the Licensed Patents. The patent license shall not apply to
+any other combinations which include the Contribution. No hardware per se is
+licensed hereunder. </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
+Recipient understands that although each Contributor grants the licenses to its
+Contributions set forth herein, no assurances are provided by any Contributor
+that the Program does not infringe the patent or other intellectual property
+rights of any other entity. Each Contributor disclaims any liability to Recipient
+for claims brought by any other entity based on infringement of intellectual
+property rights or otherwise. As a condition to exercising the rights and
+licenses granted hereunder, each Recipient hereby assumes sole responsibility
+to secure any other intellectual property rights needed, if any. For example,
+if a third party patent license is required to allow Recipient to distribute
+the Program, it is Recipient's responsibility to acquire that license before
+distributing the Program.</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
+Each Contributor represents that to its knowledge it has sufficient copyright
+rights in its Contribution, if any, to grant the copyright license set forth in
+this Agreement. </span></p>
+
+<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
+
+<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
+Program in object code form under its own license agreement, provided that:</span>
+</p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it complies with the terms and conditions of this Agreement; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
+its license agreement:</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
+effectively disclaims on behalf of all Contributors all warranties and
+conditions, express and implied, including warranties or conditions of title
+and non-infringement, and implied warranties or conditions of merchantability
+and fitness for a particular purpose; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
+effectively excludes on behalf of all Contributors all liability for damages,
+including direct, indirect, special, incidental and consequential damages, such
+as lost profits; </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
+states that any provisions which differ from this Agreement are offered by that
+Contributor alone and not by any other party; and</span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
+states that source code for the Program is available from such Contributor, and
+informs licensees how to obtain it in a reasonable manner on or through a
+medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
+
+<p><span style='font-size:10.0pt'>When the Program is made available in source
+code form:</span> </p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
+it must be made available under this Agreement; and </span></p>
+
+<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
+copy of this Agreement must be included with each copy of the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
+copyright notices contained within the Program. </span></p>
+
+<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
+originator of its Contribution, if any, in a manner that reasonably allows
+subsequent Recipients to identify the originator of the Contribution. </span></p>
+
+<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
+
+<p><span style='font-size:10.0pt'>Commercial distributors of software may
+accept certain responsibilities with respect to end users, business partners
+and the like. While this license is intended to facilitate the commercial use
+of the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create potential
+liability for other Contributors. Therefore, if a Contributor includes the
+Program in a commercial product offering, such Contributor (&quot;Commercial
+Contributor&quot;) hereby agrees to defend and indemnify every other
+Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
+costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
+legal actions brought by a third party against the Indemnified Contributor to
+the extent caused by the acts or omissions of such Commercial Contributor in
+connection with its distribution of the Program in a commercial product
+offering. The obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In order
+to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
+Contributor in writing of such claim, and b) allow the Commercial Contributor
+to control, and cooperate with the Commercial Contributor in, the defense and
+any related settlement negotiations. The Indemnified Contributor may participate
+in any such claim at its own expense.</span> </p>
+
+<p><span style='font-size:10.0pt'>For example, a Contributor might include the
+Program in a commercial product offering, Product X. That Contributor is then a
+Commercial Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance claims and
+warranties are such Commercial Contributor's responsibility alone. Under this
+section, the Commercial Contributor would have to defend claims against the
+other Contributors related to those performance claims and warranties, and if a
+court requires any other Contributor to pay any damages as a result, the
+Commercial Contributor must pay those damages.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
+WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and distributing the
+Program and assumes all risks associated with its exercise of rights under this
+Agreement , including but not limited to the risks and costs of program errors,
+compliance with applicable laws, damage to or loss of data, programs or
+equipment, and unavailability or interruption of operations. </span></p>
+
+<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
+
+<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
+AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
+THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
+
+<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
+
+<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
+or unenforceable under applicable law, it shall not affect the validity or
+enforceability of the remainder of the terms of this Agreement, and without
+further action by the parties hereto, such provision shall be reformed to the
+minimum extent necessary to make such provision valid and enforceable.</span> </p>
+
+<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
+against any entity (including a cross-claim or counterclaim in a lawsuit)
+alleging that the Program itself (excluding combinations of the Program with
+other software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the date
+such litigation is filed. </span></p>
+
+<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
+shall terminate if it fails to comply with any of the material terms or
+conditions of this Agreement and does not cure such failure in a reasonable
+period of time after becoming aware of such noncompliance. If all Recipient's
+rights under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive. </span></p>
+
+<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
+copies of this Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The Agreement
+Steward reserves the right to publish new versions (including revisions) of
+this Agreement from time to time. No one other than the Agreement Steward has
+the right to modify this Agreement. The Eclipse Foundation is the initial
+Agreement Steward. The Eclipse Foundation may assign the responsibility to
+serve as the Agreement Steward to a suitable separate entity. Each new version
+of the Agreement will be given a distinguishing version number. The Program
+(including Contributions) may always be distributed subject to the version of
+the Agreement under which it was received. In addition, after a new version of
+the Agreement is published, Contributor may elect to distribute the Program
+(including its Contributions) under the new version. Except as expressly stated
+in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
+the intellectual property of any Contributor under this Agreement, whether
+expressly, by implication, estoppel or otherwise. All rights in the Program not
+expressly granted under this Agreement are reserved.</span> </p>
+
+<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
+State of New York and the intellectual property laws of the United States of
+America. No party to this Agreement will bring a legal action under this
+Agreement more than one year after the cause of action arose. Each party waives
+its rights to a jury trial in any resulting litigation.</span> </p>
+
+<p class=MsoNormal></p>
+
+</div>
+
+</body>
+
+</html>
\ No newline at end of file
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/feature.properties b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/feature.properties
new file mode 100644
index 0000000..e598f56
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/feature.properties
@@ -0,0 +1,138 @@
+# NLS_MESSAGEFORMAT_VAR
+
+# "featureName" property - name of the feature
+featureName=IoT-ML sensiNact feature (Incubation)
+
+# "providerName" property - name of the company that provides the feature
+providerName=Eclipse Modeling Project 
+
+# "licenseURL" property - URL of the "Feature License"
+# do not translate value - just change to point to a locale-specific HTML page
+licenseURL=license.html
+
+# "license" property - text of the "Feature Update License"
+# should be plain text version of license agreement pointed to be "licenseURL"
+license=\
+Eclipse Foundation Software User Agreement\n\
+April 9, 2014\n\
+\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
+OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
+USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
+AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
+AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
+AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
+TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
+OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
+BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code,\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
+as downloadable archives ("Downloads").\n\
+\n\
+\t- Content may be structured and packaged into modules to facilitate delivering,\n\
+\t  extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+\t  plug-in fragments ("Fragments"), and features ("Features").\n\
+\t- Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+\t  in a directory named "plugins".\n\
+\t- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+\t  Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+\t  Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+\t  numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+\t- Features may also include other Features ("Included Features"). Within a Feature, files\n\
+\t  named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be\n\
+contained in files named "about.html" ("Abouts"). The terms and\n\
+conditions governing Features and Included Features should be contained\n\
+in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
+Licenses may be located in any directory of a Download or Module\n\
+including, but not limited to the following locations:\n\
+\n\
+\t- The top-level (root) directory\n\
+\t- Plug-in and Fragment directories\n\
+\t- Inside Plug-ins and Fragments packaged as JARs\n\
+\t- Sub-directories of the directory named "src" of certain Plug-ins\n\
+\t- Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
+Included Features, the Feature Update License should either provide you\n\
+with the terms and conditions governing the Included Features or inform\n\
+you where you can locate them. Feature Update Licenses may be found in\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
+TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
+SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+\t- Eclipse Distribution License Version 1.0 (available at http://www.eclipse.org/licenses/edl-v1.0.html)\n\
+\t- Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+\t- Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+\t- Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+\t- Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
+is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
+govern that particular Content.\n\
+\n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+\t1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+\t   the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+\t   extending or updating the functionality of an Eclipse-based product.\n\
+\t2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+\t   Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+\t3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+\t   govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+\t   Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+\t   with the Specification. Such Installable Software Agreement must inform the user of the\n\
+\t   terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+\t   the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+\t   indication of agreement by the user, the provisioning Technology will complete installation\n\
+\t   of the Installable Software.\n\
+\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are\n\
+currently may have restrictions on the import, possession, and use,\n\
+and/or re-export to another country, of encryption software. BEFORE\n\
+using any encryption software, please check the country's laws,\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
+########### end of license property ##########################################
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/feature.xml b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/feature.xml
new file mode 100644
index 0000000..8ff44b5
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/feature.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.eclipse.papyrus.iotml.sna.feature"
+      label="%featureName"
+      version="1.0.0.qualifier"
+      provider-name="%providerName">
+
+   <description url="https://eclipse.org/papyrus/">
+      Provide the capability to generate sensiNact DSL code
+   </description>
+
+   <copyright url="http://www.eclipse.org/legal/epl-v20.html">
+      Copyright (c) 2020 CEA
+All rights reserved.   This program and the accompanying materials
+are made available under the terms of the Eclipse Public License
+v2.0
+which accompanies this distribution, and is available at
+http://www.eclipse.org/legal/epl-v20.html
+Contributors:
+*  Ansgar Radermacher (CEA LIST) ansgar.radermacher@cea.fr - Initial API
+and implementation
+*  Shuai Li (CEA LIST) shuai.li@cea.fr - Integration
+   </copyright>
+
+   <license url="%licenseURL">
+      %license
+   </license>
+
+   <requires>
+      <import feature="org.eclipse.papyrus.designer.languages.common.feature"/>
+   </requires>
+
+   <plugin
+         id="org.eclipse.papyrus.iotml.sna.codegen"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/license.html b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/license.html
new file mode 100644
index 0000000..c3d34c3
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/license.html
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!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>Eclipse Foundation Software User Agreement</title>
+</head>
+
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 9, 2014</p>
+
+<h3>Usage Of Content</h3>
+
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
+
+<h3>Applicable Licenses</h3>
+
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation 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 provided with this Content and is also 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>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Eclipse Distribution License Version 1.0 (available at <a href="http://www.eclipse.org/licenses/edl-v10.html">http://www.eclipse.org/licenses/edl-v1.0.html</a>)</li>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/addons/sna/org.eclipse.papyrus.iotml.sna.feature/pom.xml b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/pom.xml
new file mode 100644
index 0000000..a3c4bfe
--- /dev/null
+++ b/addons/sna/org.eclipse.papyrus.iotml.sna.feature/pom.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>org.eclipse.papyrus.iotml.addons.sna</artifactId>
+		<groupId>org.eclipse.papyrus.iotml</groupId>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.papyrus.iotml.sna.feature</artifactId>
+	<packaging>eclipse-feature</packaging>
+	<name>org.eclipse.papyrus.iotml.sna.feature</name>
+	<description>Papyrus IoT-ML sNa feature</description>
+</project>
\ No newline at end of file
diff --git a/addons/sna/pom.xml b/addons/sna/pom.xml
new file mode 100644
index 0000000..43a355a
--- /dev/null
+++ b/addons/sna/pom.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<artifactId>org.eclipse.papyrus.iotml.addons</artifactId>
+		<groupId>org.eclipse.papyrus.iotml</groupId>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+	<artifactId>org.eclipse.papyrus.iotml.addons.sna</artifactId>
+	<packaging>pom</packaging>
+
+	<modules>
+		<module>org.eclipse.papyrus.iotml.sna.codegen</module>
+		<module>org.eclipse.papyrus.iotml.sna.feature</module>
+	</modules>
+	
+</project>
\ No newline at end of file
diff --git a/addons/wot/org.eclipse.papyrus.iotml.wot.td.feature/feature.xml b/addons/wot/org.eclipse.papyrus.iotml.wot.td.feature/feature.xml
index 4a1e832..9dc9fb4 100644
--- a/addons/wot/org.eclipse.papyrus.iotml.wot.td.feature/feature.xml
+++ b/addons/wot/org.eclipse.papyrus.iotml.wot.td.feature/feature.xml
@@ -6,7 +6,7 @@
       provider-name="%providerName">
 
    <description url="https://eclipse.org/papyrus/">
-      Provide the capability to execute a subset of UML interactions
+      Provide the capability to generate Web of Things Thing Descriptions
    </description>
 
    <copyright url="http://www.eclipse.org/legal/epl-v10.html">