Restlet and Jackson migrated to newer version
diff --git a/services/org.eclipse.sensinact.studio.http.messages/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.http.messages/META-INF/MANIFEST.MF
index cd2490a..7a51051 100644
--- a/services/org.eclipse.sensinact.studio.http.messages/META-INF/MANIFEST.MF
+++ b/services/org.eclipse.sensinact.studio.http.messages/META-INF/MANIFEST.MF
@@ -10,10 +10,10 @@
  org.eclipse.sensinact.studio.model.resource,
  org.apache.log4j,
  org.eclipse.sensinact.studio.preferences,
- com.fasterxml.jackson.core.jackson-databind;bundle-version="2.6.2",
- org.restlet.ext.jackson;bundle-version="2.2.3",
- com.fasterxml.jackson.core.jackson-core;bundle-version="2.6.2",
- org.eclipse.jetty.websocket.common;bundle-version="9.2.15"
+ com.fasterxml.jackson.core.jackson-databind,
+ org.restlet.ext.jackson,
+ com.fasterxml.jackson.core.jackson-core,
+ org.eclipse.jetty.websocket.common
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.sensinact.studio.http.messages.snamessage,
diff --git a/services/org.eclipse.sensinact.studio.http.services/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.http.services/META-INF/MANIFEST.MF
index 5567aed..8ca2bf3 100644
--- a/services/org.eclipse.sensinact.studio.http.services/META-INF/MANIFEST.MF
+++ b/services/org.eclipse.sensinact.studio.http.services/META-INF/MANIFEST.MF
@@ -10,11 +10,11 @@
  org.eclipse.sensinact.studio.model.resource,
  org.apache.log4j,
  org.eclipse.sensinact.studio.preferences,
- com.fasterxml.jackson.core.jackson-databind;bundle-version="2.6.2",
- org.restlet.ext.jackson;bundle-version="2.2.3",
- com.fasterxml.jackson.core.jackson-core;bundle-version="2.6.2",
- org.eclipse.jetty.websocket.common;bundle-version="9.2.15",
- org.eclipse.sensinact.studio.http.messages;bundle-version="1.0.0"
+ com.fasterxml.jackson.core.jackson-databind,
+ org.restlet.ext.jackson,
+ com.fasterxml.jackson.core.jackson-core,
+ org.eclipse.jetty.websocket.common,
+ org.eclipse.sensinact.studio.http.messages
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Bundle-ActivationPolicy: lazy
 Export-Package: org.eclipse.sensinact.studio.http.services.client,
diff --git a/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/GatewayHttpClient.java b/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/GatewayHttpClient.java
index ad84d1f..c725a1b 100644
--- a/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/GatewayHttpClient.java
+++ b/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/GatewayHttpClient.java
@@ -145,10 +145,6 @@
 		MsgSensinact retval;
 		try {
 			//httpURLConnection.setRequestProperty("Connection","close");
-
-			
-			
-			
 			
 			Representation cmd = clientResource.get();
 			json = cmd.getText();
@@ -181,6 +177,10 @@
 		}
 		
 		Representation postResponse = clientResource.post(stringRep);
+		if (postResponse == null) {
+			logger.error("postResponse is null for " + stringRep);
+		}
+		
 		Status status = clientResource.getResponse().getStatus();
 		
 		
diff --git a/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/RequestConfigurator.java b/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/RequestConfigurator.java
index 0bb34fe..b00373c 100644
--- a/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/RequestConfigurator.java
+++ b/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/RequestConfigurator.java
@@ -13,7 +13,7 @@
 import java.util.Map;
 
 import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
-import org.restlet.engine.header.Header;
+import org.restlet.data.Header;
 import org.restlet.resource.ClientResource;
 import org.restlet.util.Series;
 
diff --git a/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/RequestConfiguratorToken.java b/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/RequestConfiguratorToken.java
index dd531ba..8ff7659 100644
--- a/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/RequestConfiguratorToken.java
+++ b/services/org.eclipse.sensinact.studio.http.services/src/org/eclipse/sensinact/studio/http/services/client/RequestConfiguratorToken.java
@@ -11,7 +11,7 @@
 package org.eclipse.sensinact.studio.http.services.client;
 
 import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
-import org.restlet.engine.header.Header;
+import org.restlet.data.Header;
 import org.restlet.resource.ClientResource;
 import org.restlet.util.Series;
 
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditor.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditor.java
index 811980d..161c22e 100644
--- a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditor.java
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditor.java
@@ -11,23 +11,15 @@
 package org.eclipse.sensinact.studio.model.manager.modelupdater;
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Supplier;
 
-import org.apache.log4j.Logger;
-import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.common.util.WrappedException;
 import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.transaction.RecordingCommand;
 import org.eclipse.emf.transaction.RunnableWithResult;
-import org.eclipse.emf.transaction.TransactionalEditingDomain;
 import org.eclipse.sensinact.studio.http.messages.snamessage.MsgSensinact;
 import org.eclipse.sensinact.studio.http.messages.snamessage.describeresource.MsgDescribeRessource;
-import org.eclipse.sensinact.studio.http.messages.snamessage.describeresource.ObjectAccessMethods;
-import org.eclipse.sensinact.studio.http.messages.snamessage.describeresource.ObjectParameter;
 import org.eclipse.sensinact.studio.http.services.client.GatewayHttpClient;
 import org.eclipse.sensinact.studio.model.manager.listener.devicelocation.DeviceLocationManager;
 import org.eclipse.sensinact.studio.model.resource.utils.DeviceDescriptor;
@@ -39,32 +31,17 @@
 import org.eclipse.sensinact.studio.preferences.GatewayHttpConfig;
 import org.eclipse.sensinact.studio.resource.AccessMethod;
 import org.eclipse.sensinact.studio.resource.AccessMethodType;
-import org.eclipse.sensinact.studio.resource.Device;
-import org.eclipse.sensinact.studio.resource.Gateway;
-import org.eclipse.sensinact.studio.resource.Parameter;
-import org.eclipse.sensinact.studio.resource.Resource;
-import org.eclipse.sensinact.studio.resource.ResourceFactory;
-import org.eclipse.sensinact.studio.resource.ResourcePackage;
-import org.eclipse.sensinact.studio.resource.Service;
 import org.eclipse.sensinact.studio.resource.Studio;
 
 /**
  * @author Nicolas Hili, Etienne Gandrille
  */
-public class ModelEditor implements ConfigurationListerner {
+public class ModelEditor extends ModelEditorHelpers implements ConfigurationListerner {
 
 	/* ===================== */
 	/* Model data structures */
 	/* ===================== */
 
-	private static org.eclipse.emf.ecore.resource.Resource resource;
-
-	private final static String EDITING_DOMAIN_ID = "org.eclipse.sensinact.studio.model.resource.editingDomain";
-
-	private static TransactionalEditingDomain editingDomain;
-
-	private static final Logger logger = Logger.getLogger(ModelEditor.class);
-
 	private static ModelEditor INSTANCE = null;
 
 	private ModelEditor() {
@@ -77,6 +54,10 @@
 		return INSTANCE;
 	}
 
+	/* ====================== */
+	/* ConfigurationListerner */
+	/* ====================== */
+	
 	@Override
 	public void gatewayAddedOrUpdatedNotif(GatewayHttpConfig gateway) {
 		addGatewayIfNotExist_UNSAFE(gateway.getName());
@@ -91,23 +72,39 @@
 	public void studioPortUpdatedNotif(int port) {
 		// do nothing
 	}
-
-	private synchronized static TransactionalEditingDomain getEditingDomain() {
-		if (editingDomain == null) {
-			editingDomain = TransactionalEditingDomain.Registry.INSTANCE.getEditingDomain(EDITING_DOMAIN_ID);
-		}
-		return editingDomain;
+	
+	/* ============= */
+	/* Run exclusive */
+	/* ============= */
+		
+	private void runExclusive(Runnable runnable) {
+		RecordingCommand command = new RecordingCommand(getEditingDomain()) {
+			@Override
+			protected void doExecute() {
+				USE_IN_RUNEXLUSIVE_setupStudio();
+				runnable.run();
+			}
+		};
+		getEditingDomain().getCommandStack().execute(command);
+	}
+	
+	@SuppressWarnings("unchecked")
+	private <T> T runExclusive(Supplier<T> supplier) throws InterruptedException {
+		return (T) getEditingDomain().runExclusive(new RunnableWithResult.Impl<T>() {
+			@Override
+			public void run() {
+				USE_IN_RUNEXLUSIVE_setupStudio();
+				T value = supplier.get();
+				setResult(value);
+				return;
+			}
+		});
 	}
 
-	private static org.eclipse.emf.ecore.resource.Resource getResource() {
-		if (resource == null) {
-			String path = "/org.eclipse.sensinact.studio.model.resource/cache/resource.cache";
-			URI uri = URI.createPlatformPluginURI(path, true);
-			resource = getEditingDomain().getResourceSet().createResource(uri);
-		}
-		return resource;
-	}
-
+	/* ========== */
+	/* Root level */
+	/* ========== */
+	
 	/**
 	 * IMPORTANT. This method MUST NOT BE USED TO UPDATE THE MODEL !!!!
 	 * 
@@ -116,294 +113,69 @@
 	 */
 	public Studio getViewerInput() throws InterruptedException {
 
-		setupStudio();
+		runExclusive(() -> USE_IN_RUNEXLUSIVE_setupStudio());
 
 		// Init available gateways names
 		for (GatewayHttpConfig gateway : ConfigurationManager.getGateways()) {
 			addGatewayIfNotExist_UNSAFE(gateway.getName());
 		}
 
-		return (Studio) getEditingDomain().runExclusive(new RunnableWithResult.Impl<Studio>() {
-			@Override
-			public void run() {
-				setResult(USE_IN_RUNEXLUSIVE_getStudio());
-				return;
-			}
-		});
+		return runExclusive(() -> USE_IN_RUNEXLUSIVE_getStudio());
 	}
-
-	private void setupStudio() {
-		
-		final String label=getResource() instanceof Resource?((Resource)getResource()).getName():"Unknown resource";
-		
-		RecordingCommand command = new RecordingCommand(getEditingDomain(),label) {
-			@Override
-			protected void doExecute() {
-				EList<EObject> contents = getResource().getContents();
-				if (contents.size() == 0)
-					getResource().getContents().add(ResourceFactory.eINSTANCE.createStudio());
-			}
-		};
-		getEditingDomain().getCommandStack().execute(command);
-	}
-
-	/* ====================== */
-	/* Internal NON EXCLUSIVE */
-	/* ====================== */
-
-	private static Studio USE_IN_RUNEXLUSIVE_getStudio() {
-		EList<EObject> contents = getResource().getContents();
-		return (Studio) contents.get(0);
-	}
-
-	private static Gateway USE_IN_RUNEXLUSIVE_getGateway(String gatewayName) {
-		EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
-		for (Gateway gateway : gateways) {
-			if (gateway.getName().equals(gatewayName)) {
-				return gateway;
-			}
-		}
-		return null;
-	}
-
-	private static Device USE_IN_RUNEXLUSIVE_getDevice(String gatewayName, String devicename) {
-
-		Gateway gateway = USE_IN_RUNEXLUSIVE_getGateway(gatewayName);
-		if (gateway == null)
-			return null;
-
-		EList<Device> devices = gateway.getDevice();
-		for (Device device : devices) {
-			if (device.getName().equals(devicename)) {
-				return device;
-			}
-		}
-		return null;
-	}
-
-	private static Service USE_IN_RUNEXLUSIVE_getService(String gatewayName, String devicename, String servicename) {
-		Device device = USE_IN_RUNEXLUSIVE_getDevice(gatewayName, devicename);
-		if (device == null)
-			return null;
-
-		for (Service service : device.getService()) {
-			if (service.getName().equals(servicename)) {
-				return service;
-			}
-		}
-
-		return null;
-	}
-
-	private static Resource USE_IN_RUNEXLUSIVE_getResource(ResourceDescriptor descriptor) {
-		Service service = USE_IN_RUNEXLUSIVE_getService(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService());
-		if (service == null)
-			return null;
-
-		for (Resource resource : service.getResource()) {
-			if (resource.getName().equals(descriptor.getResource())) {
-				return resource;
-			}
-		}
-
-		return null;
-	}
-
-	private void USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(final String gatewayName, final String deviceId) {
-		if (USE_IN_RUNEXLUSIVE_getDevice(gatewayName, deviceId) != null)
-			return;
-
-		final Device addedDevice = ResourceFactory.eINSTANCE.createDevice();
-		addedDevice.setName(deviceId);
-		USE_IN_RUNEXLUSIVE_getGateway(gatewayName).getDevice().add(addedDevice);
-	}
-
-	private void USE_IN_RUNEXLUSIVE_addServiceIfNotExist(final String gatewayName, final String deviceId, final String serviceId) {
-		if (USE_IN_RUNEXLUSIVE_getService(gatewayName, deviceId, serviceId) != null)
-			return;
-
-		final Service addedService = ResourceFactory.eINSTANCE.createService();
-		addedService.setName(serviceId);
-		try {
-			USE_IN_RUNEXLUSIVE_getDevice(gatewayName, deviceId).getService().add(addedService);
-		} catch (NullPointerException e) {
-			e.printStackTrace();
-		}
-	}
-
+	
 	/* ======= */
 	/* Get IDs */
 	/* ======= */
 
-	@SuppressWarnings("unchecked")
 	public List<String> getGatewaysId() throws InterruptedException {
-		setupStudio();
-
-		return (List<String>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<String>>() {
-			@Override
-			public void run() {
-				List<String> retval = new ArrayList<String>();
-				EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
-				for (Gateway gateway : gateways) {
-					retval.add(gateway.getName());
-				}
-				setResult(retval);
-				return;
-			}
-		});
-	}
-
-	@SuppressWarnings("unchecked")
-	public List<String> getConnectedGatewaysId() throws InterruptedException {
-		setupStudio();
-
-		return (List<String>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<String>>() {
-			@Override
-			public void run() {
-				List<String> retval = new ArrayList<String>();
-				EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
-				for (Gateway gateway : gateways) {
-					if (gateway.getDevice().size() != 0)
-						retval.add(gateway.getName());
-				}
-				setResult(retval);
-				return;
-			}
-		});
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_getGatewaysId());
 	}
 	
-	@SuppressWarnings("unchecked")
-	public List<String> getDevicesId(final String gatewayName) throws InterruptedException {
-
-		//setupStudio();
-
-		return (List<String>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<String>>() {
-			@Override
-			public void run() {
-				List<String> retval = new ArrayList<String>();
-				EList<Device> devices = USE_IN_RUNEXLUSIVE_getGateway(gatewayName).getDevice();
-				for (Device device : devices) {
-					retval.add(device.getName());
-				}
-				setResult(retval);
-				return;
-			}
-		});
+	public List<String> getConnectedGatewaysId() throws InterruptedException {
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_getConnectedGatewaysId());
+	}
+	
+	public List<String> getDevicesId(String gatewayName) throws InterruptedException {
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_getDevicesId(gatewayName));
 	}
 
-	@SuppressWarnings("unchecked")
-	public List<String> getServicesId(final String gatewayName, final String devicename) throws InterruptedException {
-
-		//setupStudio();
-
-		return (List<String>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<String>>() {
-			@Override
-			public void run() {
-				List<String> retval = new ArrayList<String>();
-				Device device = USE_IN_RUNEXLUSIVE_getDevice(gatewayName, devicename);
-
-				if (device != null) {
-					for (Service service : device.getService()) {
-						retval.add(service.getName());
-					}
-				}
-
-				setResult(retval);
-				return;
-			}
-		});
+	public List<String> getServicesId(String gatewayName, String devicename) throws InterruptedException {
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_getServicesId(gatewayName, devicename));
 	}
 
-	@SuppressWarnings("unchecked")
-	public List<String> getResourcesId(final String gatewayName, final String devicename, final String servicename) throws InterruptedException {
-
-		setupStudio();
-
-		return (List<String>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<String>>() {
-			@Override
-			public void run() {
-				List<String> retval = new ArrayList<String>();
-
-				Service service = USE_IN_RUNEXLUSIVE_getService(gatewayName, devicename, servicename);
-
-				if (service != null) {
-					for (Resource resource : service.getResource()) {
-						retval.add(resource.getName());
-					}
-				}
-
-				setResult(retval);
-				return;
-			}
-		});
+	public List<String> getResourcesId(String gatewayName, String devicename, String servicename) throws InterruptedException {
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_getResourcesId(gatewayName, devicename, servicename));
 	}
 
+	public EClass getResourceClass(final ResourceDescriptor descriptor) throws InterruptedException {
+		return runExclusive(() -> USE_IN_RUNEXLUSIVE_getResource(descriptor).eClass());
+	}
+	
 	/* ================= */
 	/* Find Applications */
 	/* ================= */
 	
-	@SuppressWarnings("unchecked")
 	public List<ServiceDescriptor> findApplications() throws InterruptedException {
-
-		setupStudio();
-
-		return (List<ServiceDescriptor>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<List<ServiceDescriptor>>() {
-			@Override
-			public void run() {
-				List<ServiceDescriptor> retval = new ArrayList<>();
-				EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
-				for (Gateway gateway : gateways) {
-					Device appManager = findAppManager(gateway.getDevice());
-					if (appManager != null) {
-						retval.addAll(findApplications(appManager));
-					}
-				}
-				setResult(retval);
-				return;
-			}
-			
-			private Device findAppManager(EList<Device> devices) {
-				for (Device device : devices) {
-					if (device.getName().equals("AppManager"))
-						return device;
-				}
-				return null;
-			}
-			
-			private List<ServiceDescriptor> findApplications(Device appManager) {
-				List<ServiceDescriptor> retval = new ArrayList<>();
-				
-				String gateway = ((Gateway) appManager.eContainer()).getName();
-				String device = appManager.getName();
-				
-				for (Service service : appManager.getService()) {
-					String srvName = service.getName();
-					if (srvName != null && (! srvName.equalsIgnoreCase("admin"))) {
-						retval.add(new ServiceDescriptor(gateway, device, srvName));
-					}
-				}
-				return retval;
-			} 
-		});
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_findApplications());
 	}
 		
 	/* ============= */
 	/* Checks exists */
 	/* ============= */
 
-	public boolean existsGateway(final String gatewayId) throws InterruptedException {
+	public boolean existsGateway(String gatewayId) throws InterruptedException {
 		return getGatewaysId().contains(gatewayId);
 	}
 
-	public boolean existsDevice(final String gatewayId, String deviceId) throws InterruptedException {
+	public boolean existsDevice(String gatewayId, String deviceId) throws InterruptedException {
 		return getDevicesId(gatewayId).contains(deviceId);
 	}
 
-	public boolean existsService(final String gatewayId, String deviceId, String serviceId) throws InterruptedException {
+	public boolean existsService(String gatewayId, String deviceId, String serviceId) throws InterruptedException {
 		return getServicesId(gatewayId, deviceId).contains(serviceId);
 	}
 
-	public boolean existsResource(final String gatewayId, String deviceId, String serviceId, String resourceId) throws InterruptedException {
+	public boolean existsResource(String gatewayId, String deviceId, String serviceId, String resourceId) throws InterruptedException {
 		return existsResource(new ResourceDescriptor(gatewayId, deviceId, serviceId, resourceId));
 	}
 
@@ -414,72 +186,21 @@
 	/* ============== */
 	/* Access Methods */
 	/* ============== */
-
-	@SuppressWarnings("unchecked")
-	public EList<AccessMethod> getAccessMethods(final ResourceDescriptor descriptor) throws InterruptedException {
-
-		setupStudio();
-
-		EList<AccessMethod> accessMethods = null;
-		accessMethods = (EList<AccessMethod>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<EList<AccessMethod>>() {
-			@Override
-			public void run() {
-				EList<AccessMethod> accessMethods = new BasicEList<AccessMethod>();
-				Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
-				for (AccessMethod accessMethod : resource.getAccessMethod()) {
-					accessMethods.add(accessMethod);
-				}
-				setResult(accessMethods);
-				return;
-			}
-		});
-		return accessMethods;
+	
+	public EList<AccessMethod> getAccessMethods(ResourceDescriptor descriptor) throws InterruptedException {
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_getAccessMethods(descriptor));
 	}
 
-	@SuppressWarnings("unchecked")
-	public EList<AccessMethod> getAccessMethodsWithType(final ResourceDescriptor descriptor, final AccessMethodType type) throws InterruptedException {
-
-		setupStudio();
-
-		EList<AccessMethod> accessMethods = null;
-		accessMethods = (EList<AccessMethod>) getEditingDomain().runExclusive(new RunnableWithResult.Impl<EList<AccessMethod>>() {
-			@Override
-			public void run() {
-				EList<AccessMethod> accessMethods = new BasicEList<AccessMethod>();
-				Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
-				for (AccessMethod accessMethod : resource.getAccessMethod()) {
-					if (accessMethod.getType().equals(type)) {
-						accessMethods.add(accessMethod);
-					}
-				}
-				setResult(accessMethods);
-				return;
-			}
-		});
-		return accessMethods;
+	public int getAccessMethodNb(final ResourceDescriptor descriptor) throws InterruptedException {
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_getAccessMethods(descriptor).size());
+	}
+	
+	public EList<AccessMethod> getAccessMethodsWithType(ResourceDescriptor descriptor, AccessMethodType type) throws InterruptedException {
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_getAccessMethodsWithType(descriptor, type));
 	}
 
-	public AccessMethod getAccessMethodWithTypeNbParams(final ResourceDescriptor descriptor, final AccessMethodType type, final int nbOfParameters)
-			throws InterruptedException {
-
-		setupStudio();
-
-		return (AccessMethod) getEditingDomain().runExclusive(new RunnableWithResult.Impl<AccessMethod>() {
-			@Override
-			public void run() {
-				Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
-				for (AccessMethod accessMethod : resource.getAccessMethod()) {
-					if (accessMethod.getType().equals(type)) {
-						if (accessMethod.getParameter().size() == nbOfParameters) {
-							setResult(accessMethod);
-							return;
-						}
-					}
-				}
-				setResult(null);
-				return;
-			}
-		});
+	public AccessMethod getAccessMethodWithTypeNbParams(ResourceDescriptor descriptor, AccessMethodType type, int nbOfParameters) throws InterruptedException {
+		return runExclusive(() -> USE_IN_RUNEXCLUSIVE_getAccessMethodWithTypeNbParams(descriptor, type, nbOfParameters));
 	}
 
 	/* ================= */
@@ -490,63 +211,25 @@
 	// usually, if you want to add a gateway, use
 	// ConfigurationManager.addGateway
 	private void addGatewayIfNotExist_UNSAFE(final String gatewayName) {
-
-		//setupStudio();
-
-		RecordingCommand command = new RecordingCommand(getEditingDomain()) {
-
-			@Override
-			protected void doExecute() {
-				if (USE_IN_RUNEXLUSIVE_getGateway(gatewayName) != null)
-					return;
-
-				final Gateway addedGateway = ResourceFactory.eINSTANCE.createGateway();
-				addedGateway.setName(gatewayName);
-				USE_IN_RUNEXLUSIVE_getStudio().getGateways().add(addedGateway);
-				return;
-			}
-		};
-		getEditingDomain().getCommandStack().execute(command);
+		runExclusive(() -> USE_IN_RUNEXLUSIVE_addGatewayIfNotExist(gatewayName));
 	}
 
 	public void addDeviceIfNotExist(final String gatewayName, final String deviceId) {
-
-		//setupStudio();
-
-		RecordingCommand command = new RecordingCommand(getEditingDomain()) {
-			@Override
-			protected void doExecute() {
-				USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(gatewayName, deviceId);
-			}
-		};
-		getEditingDomain().getCommandStack().execute(command);
+		runExclusive(() -> USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(gatewayName, deviceId));
 	}
 
 	public void addServiceIfNotExist(final String gatewayName, final String deviceId, final String serviceId) {
-
-		//setupStudio();
-
-		RecordingCommand command = new RecordingCommand(getEditingDomain()) {
-			@Override
-			protected void doExecute() {
-				USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(gatewayName, deviceId);
-				USE_IN_RUNEXLUSIVE_addServiceIfNotExist(gatewayName, deviceId, serviceId);
-			}
-		};
-		getEditingDomain().getCommandStack().execute(command);
+		runExclusive(() -> {
+			USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(gatewayName, deviceId);
+			USE_IN_RUNEXLUSIVE_addServiceIfNotExist(gatewayName, deviceId, serviceId);
+		});
 	}
 
 	public void addResourceIfNotExist(final ResourceDescriptor descriptor) {
-
-		//setupStudio();
-		
-		addServiceIfNotExist(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService());
-
 		try {
 			if (!existsResource(descriptor)) {
 				Segments segment = new Segments.Builder().resource(descriptor).build();
 				
-				
 				MsgSensinact response = null;
 				try {
 					response = GatewayHttpClient.sendGetRequest(segment);
@@ -558,54 +241,8 @@
 					throw new RuntimeException("Can't get remote resources info for " + descriptor);
 				
 				final MsgDescribeRessource responseMessage = (MsgDescribeRessource) response;
-
-				RecordingCommand command = new RecordingCommand(getEditingDomain()) {
-					@Override
-					protected void doExecute() {
-
-						if (USE_IN_RUNEXLUSIVE_getResource(descriptor) != null)
-							return;
-
-						// create resource
-						String resourceType = responseMessage.getResponse().getType();
-						EClass type = literalToType(resourceType);
-						Resource createdResource = (Resource) ResourceFactory.eINSTANCE.create(type);
-						createdResource.setName(descriptor.getResource());
-
-						// create access methods
-						for (ObjectAccessMethods am : responseMessage.getResponse().getAccessMethods()) {
-							if (am != null) { // test to be removed after gateway bug fix 
-								AccessMethod accessMethod = ResourceFactory.eINSTANCE.createAccessMethod();
-								accessMethod.setType(AccessMethodType.get(am.getName()));
-	
-								Parameter[] parameters = new Parameter[am.getParameters().size()];
-								for (int i = 0; i < am.getParameters().size(); i++) {
-									ObjectParameter param = am.getParameters().get(i);
-									Parameter parameter = ResourceFactory.eINSTANCE.createParameter();
-									parameter.setName(param.getName());
-									parameter.setType(param.getType());
-									parameters[i] = parameter;
-								}
-	
-								for (Parameter parameter : parameters) {
-									accessMethod.getParameter().add(parameter);
-								}
-								createdResource.getAccessMethod().add(accessMethod);
-							}
-						}
-
-						USE_IN_RUNEXLUSIVE_getService(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService()).getResource().add(
-								createdResource);
-
-						return;
-					}
-				};
-				try {
-					getEditingDomain().getCommandStack().execute(command);
-				}catch (WrappedException we){
-					getEditingDomain().getCommandStack().flush();
-					//Caused by multiple events received.
-				}
+				
+				runExclusive(() -> USE_IN_RUNEXLUSIVE_addResourceIfNotExist(descriptor, responseMessage));
 			}
 		} catch (NullPointerException | InterruptedException e) {
 			getEditingDomain().getCommandStack().flush();
@@ -613,30 +250,6 @@
 		}
 	}
 
-	static EClass literalToType(final String type) {
-
-		final EClass resourceType;
-		// Literals
-		EClass stateVariableLiteral = ResourcePackage.Literals.STATE_VARIABLE;
-		EClass actionLiteral = ResourcePackage.Literals.ACTION;
-		EClass propertyLiteral = ResourcePackage.Literals.PROPERTY;
-		EClass sensorDataLiteral = ResourcePackage.Literals.SENSOR_DATA;
-
-		if ("STATE_VARIABLE".equals(type)) {
-			resourceType = stateVariableLiteral;
-		} else if ("ACTION".equals(type)) {
-			resourceType = actionLiteral;
-		} else if ("PROPERTY".equals(type)) {
-			resourceType = propertyLiteral;
-		} else if ("SENSOR".equals(type)) {
-			resourceType = sensorDataLiteral;
-		} else {
-			logger.error(ModelEditor.class.getCanonicalName() + "::updateResource with type=" + type + " - Is it a bug or a feature ?");
-			resourceType = actionLiteral;
-		}
-		return resourceType;
-	}
-
 	/* ==================== */
 	/* REMOVE Objects by ID */
 	/* ==================== */
@@ -644,139 +257,25 @@
 	// USE CAREFULLY
 	// usually, if you want to remove a gateway, use
 	// ConfigurationManager.removeGateway
-	private void removeGateway_UNSAFE(final String gatewayName) {
-
-		setupStudio();
-
-		RecordingCommand command = new RecordingCommand(getEditingDomain()) {
-			@Override
-			protected void doExecute() {
-				EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
-
-				for (int i = 0; i < gateways.size(); i++) {
-					Gateway gateway = gateways.get(i);
-					if (gateway.getName().equals(gatewayName)) {
-						gateways.remove(i);
-						return;
-					}
-				}
-			}
-		};
-		getEditingDomain().getCommandStack().execute(command);
-
+	private void removeGateway_UNSAFE(String gatewayName) {
+		runExclusive(() -> USE_IN_RUNEXLUSIVE_removeGateway(gatewayName));
 		DeviceLocationManager.getInstance().deleteGatewayInStudio(gatewayName);
 	}
-
-	public void clearGatewayContent(String name) {
-		try {
-			for (String device : getDevicesId(name)) {
-				removeDevice(name, device);
-			}
-		} catch (InterruptedException e) {
-			logger.error("Clear gateway content failed", e);
-		}
+		
+	public void clearGatewayContent(String gatewayName) {
+		runExclusive(() -> USE_IN_RUNEXCLUSIVE_removeAllDevices(gatewayName));
 	}
 
-	public void removeDevice(final String gatewayName, final String deviceId) {
-
-		setupStudio();
-
-		RecordingCommand command = new RecordingCommand(getEditingDomain()) {
-			@Override
-			protected void doExecute() {
-				Gateway gateway = USE_IN_RUNEXLUSIVE_getGateway(gatewayName);
-				if (gateway != null) {
-					EList<Device> devices = gateway.getDevice();
-					for (int i = 0; i < devices.size(); i++) {
-						Device device = devices.get(i);
-						if (deviceId.equals(device.getName())) {
-							devices.remove(i);
-							return;
-						}
-					}
-				}
-			}
-		};
-		getEditingDomain().getCommandStack().execute(command);
-
+	public void removeDevice(String gatewayName, String deviceId) {
+		runExclusive(() -> USE_IN_RUNEXCLUSIVE_removeDevice(gatewayName, deviceId));
 		DeviceLocationManager.getInstance().deleteDeviceInStudio(new DeviceDescriptor(gatewayName, deviceId));
 	}
-
-	public void removeService(final String gatewayName, final String deviceId, final String serviceId) {
-
-		//setupStudio();
-
-		RecordingCommand command = new RecordingCommand(getEditingDomain()) {
-			@Override
-			protected void doExecute() {
-				Device device = USE_IN_RUNEXLUSIVE_getDevice(gatewayName, deviceId);
-				if (device != null) {
-					EList<Service> services = device.getService();
-					for (int i = 0; i < services.size(); i++) {
-						Service service = services.get(i);
-						if (serviceId.equals(service.getName())) {
-							services.remove(i);
-							return;
-						}
-					}
-				}
-			}
-		};
-		getEditingDomain().getCommandStack().execute(command);
+		
+	public void removeService(String gatewayName, String deviceId, String serviceId) {
+		runExclusive(() -> USE_IN_RUNEXCLUSIVE_removeService(gatewayName, deviceId, serviceId)); 		
 	}
-
+	
 	public void removeResource(final ResourceDescriptor descriptor) {
-
-		setupStudio();
-
-		RecordingCommand command = new RecordingCommand(getEditingDomain()) {
-			@Override
-			protected void doExecute() {
-				Service service = USE_IN_RUNEXLUSIVE_getService(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService());
-				if (service != null) {
-					EList<Resource> resources = service.getResource();
-					for (int i = 0; i < resources.size(); i++) {
-						Resource resource = resources.get(i);
-						if (descriptor.getResource().equals(resource.getName())) {
-							resources.remove(i);
-							return;
-						}
-					}
-				}
-			}
-		};
-		getEditingDomain().getCommandStack().execute(command);
-	}
-
-	/* ==== */
-	/* MISC */
-	/* ==== */
-
-	public EClass getResourceClass(final ResourceDescriptor descriptor) throws InterruptedException {
-
-		//setupStudio();
-
-		return (EClass) getEditingDomain().runExclusive(new RunnableWithResult.Impl<EClass>() {
-			@Override
-			public void run() {
-				Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
-				setResult(resource.eClass());
-				return;
-			}
-		});
-	}
-
-	public int getAccessMethodNb(final ResourceDescriptor descriptor) throws InterruptedException {
-
-		//setupStudio();
-
-		return (Integer) getEditingDomain().runExclusive(new RunnableWithResult.Impl<Integer>() {
-			@Override
-			public void run() {
-				Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
-				setResult(new Integer(resource.getAccessMethod().size()));
-				return;
-			}
-		});
+		runExclusive(() -> USE_IN_RUNEXCLUSIVE_removeResource(descriptor));
 	}
 }
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditorHelpers.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditorHelpers.java
new file mode 100644
index 0000000..2a474e6
--- /dev/null
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelEditorHelpers.java
@@ -0,0 +1,410 @@
+package org.eclipse.sensinact.studio.model.manager.modelupdater;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+import org.eclipse.emf.common.util.BasicEList;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.transaction.TransactionalEditingDomain;
+import org.eclipse.sensinact.studio.http.messages.snamessage.describeresource.MsgDescribeRessource;
+import org.eclipse.sensinact.studio.http.messages.snamessage.describeresource.ObjectAccessMethods;
+import org.eclipse.sensinact.studio.http.messages.snamessage.describeresource.ObjectParameter;
+import org.eclipse.sensinact.studio.model.resource.utils.ResourceDescriptor;
+import org.eclipse.sensinact.studio.model.resource.utils.ServiceDescriptor;
+import org.eclipse.sensinact.studio.resource.AccessMethod;
+import org.eclipse.sensinact.studio.resource.AccessMethodType;
+import org.eclipse.sensinact.studio.resource.Device;
+import org.eclipse.sensinact.studio.resource.Gateway;
+import org.eclipse.sensinact.studio.resource.Parameter;
+import org.eclipse.sensinact.studio.resource.Resource;
+import org.eclipse.sensinact.studio.resource.ResourceFactory;
+import org.eclipse.sensinact.studio.resource.ResourcePackage;
+import org.eclipse.sensinact.studio.resource.Service;
+import org.eclipse.sensinact.studio.resource.Studio;
+
+public abstract class ModelEditorHelpers {
+
+	private static final Logger logger = Logger.getLogger(ModelEditorHelpers.class);
+	
+	private static org.eclipse.emf.ecore.resource.Resource resource;
+
+	private static TransactionalEditingDomain editingDomain;
+
+	private final static String EDITING_DOMAIN_ID = "org.eclipse.sensinact.studio.model.resource.editingDomain";
+
+	protected synchronized static org.eclipse.emf.ecore.resource.Resource getResource() {
+		if (resource == null) {
+			String path = "/org.eclipse.sensinact.studio.model.resource/cache/resource.cache";
+			URI uri = URI.createPlatformPluginURI(path, true);
+			resource = getEditingDomain().getResourceSet().createResource(uri);
+		}
+		return resource;
+	}
+
+	protected synchronized static TransactionalEditingDomain getEditingDomain() {
+		if (editingDomain == null) {
+			editingDomain = TransactionalEditingDomain.Registry.INSTANCE.getEditingDomain(EDITING_DOMAIN_ID);
+		}
+		return editingDomain;
+	}
+
+	protected static void USE_IN_RUNEXLUSIVE_setupStudio() {
+		EList<EObject> contents = getResource().getContents();
+		if (contents.size() == 0)
+			getResource().getContents().add(ResourceFactory.eINSTANCE.createStudio());
+	}
+
+	protected static Studio USE_IN_RUNEXLUSIVE_getStudio() {
+		EList<EObject> contents = getResource().getContents();
+		return (Studio) contents.get(0);
+	}
+
+	protected static Gateway USE_IN_RUNEXLUSIVE_getGateway(String gatewayName) {
+		EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
+		for (Gateway gateway : gateways) {
+			if (gateway.getName().equals(gatewayName)) {
+				return gateway;
+			}
+		}
+		return null;
+	}
+
+	protected static Device USE_IN_RUNEXLUSIVE_getDevice(String gatewayName, String devicename) {
+
+		Gateway gateway = USE_IN_RUNEXLUSIVE_getGateway(gatewayName);
+		if (gateway == null)
+			return null;
+
+		EList<Device> devices = gateway.getDevice();
+		for (Device device : devices) {
+			if (device.getName().equals(devicename)) {
+				return device;
+			}
+		}
+		return null;
+	}
+
+	protected static Service USE_IN_RUNEXLUSIVE_getService(String gatewayName, String devicename, String servicename) {
+		Device device = USE_IN_RUNEXLUSIVE_getDevice(gatewayName, devicename);
+		if (device == null)
+			return null;
+
+		for (Service service : device.getService()) {
+			if (service.getName().equals(servicename)) {
+				return service;
+			}
+		}
+
+		return null;
+	}
+
+	protected static Resource USE_IN_RUNEXLUSIVE_getResource(ResourceDescriptor descriptor) {
+		Service service = USE_IN_RUNEXLUSIVE_getService(descriptor.getGateway(), descriptor.getDevice(),
+				descriptor.getService());
+		if (service == null)
+			return null;
+
+		for (Resource resource : service.getResource()) {
+			if (resource.getName().equals(descriptor.getResource())) {
+				return resource;
+			}
+		}
+
+		return null;
+	}
+
+	protected void USE_IN_RUNEXLUSIVE_addGatewayIfNotExist(final String gatewayName) {
+		if (USE_IN_RUNEXLUSIVE_getGateway(gatewayName) != null)
+			return;
+
+		final Gateway addedGateway = ResourceFactory.eINSTANCE.createGateway();
+		addedGateway.setName(gatewayName);
+		USE_IN_RUNEXLUSIVE_getStudio().getGateways().add(addedGateway);
+		return;
+	}
+
+	protected void USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(String gatewayName, String deviceId) {
+		if (USE_IN_RUNEXLUSIVE_getDevice(gatewayName, deviceId) != null)
+			return;
+
+		final Device addedDevice = ResourceFactory.eINSTANCE.createDevice();
+		addedDevice.setName(deviceId);
+		USE_IN_RUNEXLUSIVE_getGateway(gatewayName).getDevice().add(addedDevice);
+	}
+
+	protected void USE_IN_RUNEXLUSIVE_addServiceIfNotExist(String gatewayName, String deviceId, String serviceId) {
+		if (USE_IN_RUNEXLUSIVE_getService(gatewayName, deviceId, serviceId) != null)
+			return;
+
+		final Service addedService = ResourceFactory.eINSTANCE.createService();
+		addedService.setName(serviceId);
+		try {
+			USE_IN_RUNEXLUSIVE_getDevice(gatewayName, deviceId).getService().add(addedService);
+		} catch (NullPointerException e) {
+			e.printStackTrace();
+		}
+	}
+
+	protected void USE_IN_RUNEXLUSIVE_addResourceIfNotExist(ResourceDescriptor descriptor,
+			MsgDescribeRessource responseMessage) {
+		if (USE_IN_RUNEXLUSIVE_getResource(descriptor) != null)
+			return;
+
+		// preparation
+		USE_IN_RUNEXLUSIVE_addDeviceIfNotExist(descriptor.getGateway(), descriptor.getDevice());
+		USE_IN_RUNEXLUSIVE_addServiceIfNotExist(descriptor.getGateway(), descriptor.getDevice(),
+				descriptor.getService());
+
+		// create resource
+		String resourceType = responseMessage.getResponse().getType();
+		EClass type = literalToType(resourceType);
+		Resource createdResource = (Resource) ResourceFactory.eINSTANCE.create(type);
+		createdResource.setName(descriptor.getResource());
+
+		// create access methods
+		for (ObjectAccessMethods am : responseMessage.getResponse().getAccessMethods()) {
+			if (am != null) { // test to be removed after gateway bug fix
+				AccessMethod accessMethod = ResourceFactory.eINSTANCE.createAccessMethod();
+				accessMethod.setType(AccessMethodType.get(am.getName()));
+
+				Parameter[] parameters = new Parameter[am.getParameters().size()];
+				for (int i = 0; i < am.getParameters().size(); i++) {
+					ObjectParameter param = am.getParameters().get(i);
+					Parameter parameter = ResourceFactory.eINSTANCE.createParameter();
+					parameter.setName(param.getName());
+					parameter.setType(param.getType());
+					parameters[i] = parameter;
+				}
+
+				for (Parameter parameter : parameters) {
+					accessMethod.getParameter().add(parameter);
+				}
+				createdResource.getAccessMethod().add(accessMethod);
+			}
+		}
+
+		USE_IN_RUNEXLUSIVE_getService(descriptor.getGateway(), descriptor.getDevice(), descriptor.getService())
+				.getResource().add(createdResource);
+	}
+
+	protected void USE_IN_RUNEXLUSIVE_removeGateway(String gatewayName) {
+		EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
+
+		for (int i = 0; i < gateways.size(); i++) {
+			Gateway gateway = gateways.get(i);
+			if (gateway.getName().equals(gatewayName)) {
+				gateways.remove(i);
+				return;
+			}
+		}
+	}
+
+	protected void USE_IN_RUNEXCLUSIVE_removeDevice(String gatewayName, String deviceId) {
+		Gateway gateway = USE_IN_RUNEXLUSIVE_getGateway(gatewayName);
+		if (gateway != null) {
+			EList<Device> devices = gateway.getDevice();
+			for (int i = 0; i < devices.size(); i++) {
+				Device device = devices.get(i);
+				if (deviceId.equals(device.getName())) {
+					devices.remove(i);
+					return;
+				}
+			}
+		}
+	}
+
+	protected void USE_IN_RUNEXCLUSIVE_removeAllDevices(String gatewayName) {
+		Gateway gateway = USE_IN_RUNEXLUSIVE_getGateway(gatewayName);
+		if (gateway != null) {
+			gateway.getDevice().clear();
+		}
+	}
+
+	protected List<String> USE_IN_RUNEXCLUSIVE_getGatewaysId() {
+		List<String> retval = new ArrayList<String>();
+		EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
+		for (Gateway gateway : gateways) {
+			retval.add(gateway.getName());
+		}
+		return retval;
+	}
+
+	protected List<String> USE_IN_RUNEXCLUSIVE_getConnectedGatewaysId() {
+		List<String> retval = new ArrayList<String>();
+		EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
+		for (Gateway gateway : gateways) {
+			if (gateway.getDevice().size() != 0)
+				retval.add(gateway.getName());
+		}
+		return retval;
+	}
+
+	protected List<String> USE_IN_RUNEXCLUSIVE_getDevicesId(String gatewayName) {
+		List<String> retval = new ArrayList<String>();
+		EList<Device> devices = USE_IN_RUNEXLUSIVE_getGateway(gatewayName).getDevice();
+		for (Device device : devices) {
+			retval.add(device.getName());
+		}
+		return retval;
+	}
+
+	protected List<String> USE_IN_RUNEXCLUSIVE_getServicesId(String gatewayName, String devicename) {
+		List<String> retval = new ArrayList<String>();
+		Device device = USE_IN_RUNEXLUSIVE_getDevice(gatewayName, devicename);
+
+		if (device != null) {
+			for (Service service : device.getService()) {
+				retval.add(service.getName());
+			}
+		}
+		return retval;
+	}
+
+	protected List<String> USE_IN_RUNEXCLUSIVE_getResourcesId(String gatewayName, String devicename,
+			String servicename) {
+		List<String> retval = new ArrayList<String>();
+		Service service = USE_IN_RUNEXLUSIVE_getService(gatewayName, devicename, servicename);
+		if (service != null) {
+			for (Resource resource : service.getResource()) {
+				retval.add(resource.getName());
+			}
+		}
+		return retval;
+	}
+
+	protected List<ServiceDescriptor> USE_IN_RUNEXCLUSIVE_findApplications() {
+		List<ServiceDescriptor> retval = new ArrayList<>();
+		EList<Gateway> gateways = USE_IN_RUNEXLUSIVE_getStudio().getGateways();
+		for (Gateway gateway : gateways) {
+			Device appManager = findAppManager(gateway.getDevice());
+			if (appManager != null) {
+				retval.addAll(findApplications(appManager));
+			}
+		}
+		return retval;
+	}
+
+	protected EList<AccessMethod> USE_IN_RUNEXCLUSIVE_getAccessMethods(ResourceDescriptor descriptor) {
+		EList<AccessMethod> accessMethods = new BasicEList<AccessMethod>();
+		Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
+		for (AccessMethod accessMethod : resource.getAccessMethod()) {
+			accessMethods.add(accessMethod);
+		}
+		return accessMethods;
+	}
+
+	protected EList<AccessMethod> USE_IN_RUNEXCLUSIVE_getAccessMethodsWithType(ResourceDescriptor descriptor,
+			AccessMethodType type) {
+		EList<AccessMethod> accessMethods = new BasicEList<AccessMethod>();
+		Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
+		for (AccessMethod accessMethod : resource.getAccessMethod()) {
+			if (accessMethod.getType().equals(type)) {
+				accessMethods.add(accessMethod);
+			}
+		}
+		return accessMethods;
+	}
+
+	protected AccessMethod USE_IN_RUNEXCLUSIVE_getAccessMethodWithTypeNbParams(ResourceDescriptor descriptor,
+			AccessMethodType type, int nbOfParameters) {
+		Resource resource = USE_IN_RUNEXLUSIVE_getResource(descriptor);
+		for (AccessMethod accessMethod : resource.getAccessMethod()) {
+			if (accessMethod.getType().equals(type)) {
+				if (accessMethod.getParameter().size() == nbOfParameters) {
+					return accessMethod;
+				}
+			}
+		}
+		return null;
+	}
+
+	protected void USE_IN_RUNEXCLUSIVE_removeResource(final ResourceDescriptor descriptor) {
+		Service service = USE_IN_RUNEXLUSIVE_getService(descriptor.getGateway(), descriptor.getDevice(),
+				descriptor.getService());
+		if (service != null) {
+			EList<Resource> resources = service.getResource();
+			for (int i = 0; i < resources.size(); i++) {
+				Resource resource = resources.get(i);
+				if (descriptor.getResource().equals(resource.getName())) {
+					resources.remove(i);
+					return;
+				}
+			}
+		}
+	}
+
+	protected void USE_IN_RUNEXCLUSIVE_removeService(final String gatewayName, final String deviceId,
+			final String serviceId) {
+		Device device = USE_IN_RUNEXLUSIVE_getDevice(gatewayName, deviceId);
+		if (device != null) {
+			EList<Service> services = device.getService();
+			for (int i = 0; i < services.size(); i++) {
+				Service service = services.get(i);
+				if (serviceId.equals(service.getName())) {
+					services.remove(i);
+					return;
+				}
+			}
+		}
+	}
+
+	/* ============ */
+	/* RunExclusive */
+	/* ============ */
+
+	protected static EClass literalToType(final String type) {
+
+		final EClass resourceType;
+		// Literals
+		EClass stateVariableLiteral = ResourcePackage.Literals.STATE_VARIABLE;
+		EClass actionLiteral = ResourcePackage.Literals.ACTION;
+		EClass propertyLiteral = ResourcePackage.Literals.PROPERTY;
+		EClass sensorDataLiteral = ResourcePackage.Literals.SENSOR_DATA;
+
+		if ("STATE_VARIABLE".equals(type)) {
+			resourceType = stateVariableLiteral;
+		} else if ("ACTION".equals(type)) {
+			resourceType = actionLiteral;
+		} else if ("PROPERTY".equals(type)) {
+			resourceType = propertyLiteral;
+		} else if ("SENSOR".equals(type)) {
+			resourceType = sensorDataLiteral;
+		} else {
+			logger.error(ModelEditor.class.getCanonicalName() + "::updateResource with type=" + type + " - Is it a bug or a feature ?");
+			resourceType = actionLiteral;
+		}
+		return resourceType;
+	}
+
+	/* ============= */
+	/* MODEL HELPERS */
+	/* ============= */
+
+	protected Device findAppManager(EList<Device> devices) {
+		for (Device device : devices) {
+			if (device.getName().equals("AppManager"))
+				return device;
+		}
+		return null;
+	}
+
+	protected List<ServiceDescriptor> findApplications(Device appManager) {
+		List<ServiceDescriptor> retval = new ArrayList<>();
+
+		String gateway = ((Gateway) appManager.eContainer()).getName();
+		String device = appManager.getName();
+
+		for (Service service : appManager.getService()) {
+			String srvName = service.getName();
+			if (srvName != null && (!srvName.equalsIgnoreCase("admin"))) {
+				retval.add(new ServiceDescriptor(gateway, device, srvName));
+			}
+		}
+		return retval;
+	}
+
+}
diff --git a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelUpdater.java b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelUpdater.java
index 8c3bb3a..7656285 100644
--- a/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelUpdater.java
+++ b/services/org.eclipse.sensinact.studio.model.manager/src/org/eclipse/sensinact/studio/model/manager/modelupdater/ModelUpdater.java
@@ -69,7 +69,7 @@
 		
 			logger.info("Full model update triggered");
 
-			Segments segments = new Segments.Builder().gateway(gatewayName).jsonPath("jsonpath=$.*['name','location']").build();
+			Segments segments = new Segments.Builder().gateway(gatewayName).root().build();
 			MsgSensinact snaMsg = GatewayHttpClient.sendGetRequest(segments);
 			
 			if (!(snaMsg instanceof MsgCompleteList))
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.model.resource.edit/META-INF/MANIFEST.MF
index 2d925a9..f29fa40 100644
--- a/services/org.eclipse.sensinact.studio.model.resource.edit/META-INF/MANIFEST.MF
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/META-INF/MANIFEST.MF
@@ -2,6 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.sensinact.studio.model.resource.edit;singleton:=true
+Automatic-Module-Name: org.eclipse.sensinact.studio.model.resource.edit
 Bundle-Version: 1.0.0.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.sensinact.studio.resource.provider.ResourceEditPlugin$Implementation
diff --git a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProviderAdapterFactory.java b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProviderAdapterFactory.java
index ad572e7..b4bd837 100644
--- a/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProviderAdapterFactory.java
+++ b/services/org.eclipse.sensinact.studio.model.resource.edit/src/org/eclipse/sensinact/studio/resource/provider/ResourceItemProviderAdapterFactory.java
@@ -432,6 +432,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public ComposeableAdapterFactory getRootAdapterFactory() {
 		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
 	}
@@ -442,6 +443,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
 		this.parentAdapterFactory = parentAdapterFactory;
 	}
@@ -490,6 +492,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void addListener(INotifyChangedListener notifyChangedListener) {
 		changeNotifier.addListener(notifyChangedListener);
 	}
@@ -500,6 +503,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void removeListener(INotifyChangedListener notifyChangedListener) {
 		changeNotifier.removeListener(notifyChangedListener);
 	}
@@ -510,6 +514,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void fireNotifyChanged(Notification notification) {
 		changeNotifier.fireNotifyChanged(notification);
 
@@ -524,6 +529,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void dispose() {
 		if (studioItemProvider != null) studioItemProvider.dispose();
 		if (deviceItemProvider != null) deviceItemProvider.dispose();
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.model.resource.editor/META-INF/MANIFEST.MF
index 4ea618a..73500ab 100644
--- a/services/org.eclipse.sensinact.studio.model.resource.editor/META-INF/MANIFEST.MF
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/META-INF/MANIFEST.MF
@@ -2,6 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.sensinact.studio.model.resource.editor;singleton:=true
+Automatic-Module-Name: org.eclipse.sensinact.studio.model.resource.editor
 Bundle-Version: 1.0.0.qualifier
 Bundle-ClassPath: .
 Bundle-Activator: org.eclipse.sensinact.studio.resource.presentation.ResourceEditorPlugin$Implementation
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceActionBarContributor.java b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceActionBarContributor.java
index be1ad84..1454ed1 100644
--- a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceActionBarContributor.java
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceActionBarContributor.java
@@ -173,6 +173,7 @@
 	 */
 	@Override
 	public void contributeToToolBar(IToolBarManager toolBarManager) {
+		super.contributeToToolBar(toolBarManager);
 		toolBarManager.add(new Separator("resource-settings"));
 		toolBarManager.add(new Separator("resource-additions"));
 	}
@@ -209,6 +210,7 @@
 		//
 		submenuManager.addMenuListener
 			(new IMenuListener() {
+				 @Override
 				 public void menuAboutToShow(IMenuManager menuManager) {
 					 menuManager.updateAll(true);
 				 }
@@ -256,6 +258,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void selectionChanged(SelectionChangedEvent event) {
 		// Remove any menu items for old selection.
 		//
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditor.java b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditor.java
index a5c9dde..84cc7cb 100644
--- a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditor.java
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceEditor.java
@@ -79,6 +79,7 @@
 
 import org.eclipse.swt.graphics.Point;
 
+import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.layout.FillLayout;
 
 import org.eclipse.swt.widgets.Composite;
@@ -331,6 +332,7 @@
 	 */
 	protected IPartListener partListener =
 		new IPartListener() {
+			@Override
 			public void partActivated(IWorkbenchPart p) {
 				if (p instanceof ContentOutline) {
 					if (((ContentOutline)p).getCurrentPage() == contentOutlinePage) {
@@ -349,15 +351,19 @@
 					handleActivate();
 				}
 			}
+			@Override
 			public void partBroughtToTop(IWorkbenchPart p) {
 				// Ignore.
 			}
+			@Override
 			public void partClosed(IWorkbenchPart p) {
 				// Ignore.
 			}
+			@Override
 			public void partDeactivated(IWorkbenchPart p) {
 				// Ignore.
 			}
+			@Override
 			public void partOpened(IWorkbenchPart p) {
 				// Ignore.
 			}
@@ -443,6 +449,7 @@
 					dispatching = true;
 					getSite().getShell().getDisplay().asyncExec
 						(new Runnable() {
+							 @Override
 							 public void run() {
 								 dispatching = false;
 								 updateProblemIndication();
@@ -472,6 +479,7 @@
 	 */
 	protected IResourceChangeListener resourceChangeListener =
 		new IResourceChangeListener() {
+			@Override
 			public void resourceChanged(IResourceChangeEvent event) {
 				IResourceDelta delta = event.getDelta();
 				try {
@@ -480,6 +488,7 @@
 						protected Collection<Resource> changedResources = new ArrayList<Resource>();
 						protected Collection<Resource> removedResources = new ArrayList<Resource>();
 
+						@Override
 						public boolean visit(IResourceDelta delta) {
 							if (delta.getResource().getType() == IResource.FILE) {
 								if (delta.getKind() == IResourceDelta.REMOVED ||
@@ -515,6 +524,7 @@
 					if (!visitor.getRemovedResources().isEmpty()) {
 						getSite().getShell().getDisplay().asyncExec
 							(new Runnable() {
+								 @Override
 								 public void run() {
 									 removedResources.addAll(visitor.getRemovedResources());
 									 if (!isDirty()) {
@@ -527,6 +537,7 @@
 					if (!visitor.getChangedResources().isEmpty()) {
 						getSite().getShell().getDisplay().asyncExec
 							(new Runnable() {
+								 @Override
 								 public void run() {
 									 changedResources.addAll(visitor.getChangedResources());
 									 if (getSite().getPage().getActiveEditor() == ResourceEditor.this) {
@@ -585,8 +596,9 @@
 	 */
 	protected void handleChangedResources() {
 		if (!changedResources.isEmpty() && (!isDirty() || handleDirtyConflict())) {
+			ResourceSet resourceSet = editingDomain.getResourceSet();
 			if (isDirty()) {
-				changedResources.addAll(editingDomain.getResourceSet().getResources());
+				changedResources.addAll(resourceSet.getResources());
 			}
 			editingDomain.getCommandStack().flush();
 
@@ -595,7 +607,7 @@
 				if (resource.isLoaded()) {
 					resource.unload();
 					try {
-						resource.load(Collections.EMPTY_MAP);
+						resource.load(resourceSet.getLoadOptions());
 					}
 					catch (IOException exception) {
 						if (!resourceToDiagnosticMap.containsKey(resource)) {
@@ -716,9 +728,11 @@
 		//
 		commandStack.addCommandStackListener
 			(new CommandStackListener() {
+				 @Override
 				 public void commandStackChanged(final EventObject event) {
 					 getContainer().getDisplay().asyncExec
 						 (new Runnable() {
+							  @Override
 							  public void run() {
 								  firePropertyChange(IEditorPart.PROP_DIRTY);
 
@@ -771,6 +785,7 @@
 		if (theSelection != null && !theSelection.isEmpty()) {
 			Runnable runnable =
 				new Runnable() {
+					@Override
 					public void run() {
 						// Try to select the items in the current content viewer of the editor.
 						//
@@ -791,6 +806,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public EditingDomain getEditingDomain() {
 		return editingDomain;
 	}
@@ -887,6 +903,7 @@
 					new ISelectionChangedListener() {
 						// This just notifies those things that are affected by the section.
 						//
+						@Override
 						public void selectionChanged(SelectionChangedEvent selectionChangedEvent) {
 							setSelection(selectionChangedEvent.getSelection());
 						}
@@ -921,6 +938,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public Viewer getViewer() {
 		return currentViewer;
 	}
@@ -1226,8 +1244,11 @@
 
 			getSite().getShell().getDisplay().asyncExec
 				(new Runnable() {
+					 @Override
 					 public void run() {
-						 setActivePage(0);
+						 if (!getContainer().isDisposed()) {
+							 setActivePage(0);
+						 }
 					 }
 				 });
 		}
@@ -1250,6 +1271,7 @@
 
 		getSite().getShell().getDisplay().asyncExec
 			(new Runnable() {
+				 @Override
 				 public void run() {
 					 updateProblemIndication();
 				 }
@@ -1267,9 +1289,9 @@
 		if (getPageCount() <= 1) {
 			setPageText(0, "");
 			if (getContainer() instanceof CTabFolder) {
-				((CTabFolder)getContainer()).setTabHeight(1);
 				Point point = getContainer().getSize();
-				getContainer().setSize(point.x, point.y + 6);
+				Rectangle clientArea = getContainer().getClientArea();
+				getContainer().setSize(point.x,  2 * point.y - clientArea.height - clientArea.y);
 			}
 		}
 	}
@@ -1285,9 +1307,9 @@
 		if (getPageCount() > 1) {
 			setPageText(0, getString("_UI_SelectionPage_label"));
 			if (getContainer() instanceof CTabFolder) {
-				((CTabFolder)getContainer()).setTabHeight(SWT.DEFAULT);
 				Point point = getContainer().getSize();
-				getContainer().setSize(point.x, point.y - 6);
+				Rectangle clientArea = getContainer().getClientArea();
+				getContainer().setSize(point.x, clientArea.height + clientArea.y);
 			}
 		}
 	}
@@ -1315,15 +1337,15 @@
 	 */
 	@SuppressWarnings("rawtypes")
 	@Override
-	public Object getAdapter(Class key) {
+	public <T> T getAdapter(Class<T> key) {
 		if (key.equals(IContentOutlinePage.class)) {
-			return showOutlineView() ? getContentOutlinePage() : null;
+			return showOutlineView() ? key.cast(getContentOutlinePage()) : null;
 		}
 		else if (key.equals(IPropertySheetPage.class)) {
-			return getPropertySheetPage();
+			return key.cast(getPropertySheetPage());
 		}
 		else if (key.equals(IGotoMarker.class)) {
-			return this;
+			return key.cast(this);
 		}
 		else {
 			return super.getAdapter(key);
@@ -1386,6 +1408,7 @@
 				(new ISelectionChangedListener() {
 					 // This ensures that we handle selections correctly.
 					 //
+					 @Override
 					 public void selectionChanged(SelectionChangedEvent event) {
 						 handleContentOutlineSelection(event.getSelection());
 					 }
@@ -1403,7 +1426,7 @@
 	 */
 	public IPropertySheetPage getPropertySheetPage() {
 		PropertySheetPage propertySheetPage =
-			new ExtendedPropertySheetPage(editingDomain) {
+			new ExtendedPropertySheetPage(editingDomain, ExtendedPropertySheetPage.Decoration.NONE, null, 0, false) {
 				@Override
 				public void setSelectionToViewer(List<?> selection) {
 					ResourceEditor.this.setSelectionToViewer(selection);
@@ -1610,6 +1633,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void gotoMarker(IMarker marker) {
 		List<?> targetObjects = markerHelper.getTargetObjects(editingDomain, marker);
 		if (!targetObjects.isEmpty()) {
@@ -1654,6 +1678,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void addSelectionChangedListener(ISelectionChangedListener listener) {
 		selectionChangedListeners.add(listener);
 	}
@@ -1664,6 +1689,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
 		selectionChangedListeners.remove(listener);
 	}
@@ -1674,6 +1700,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public ISelection getSelection() {
 		return editorSelection;
 	}
@@ -1685,6 +1712,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void setSelection(ISelection selection) {
 		editorSelection = selection;
 
@@ -1754,6 +1782,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void menuAboutToShow(IMenuManager menuManager) {
 		((IMenuListener)getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager);
 	}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceModelWizard.java b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceModelWizard.java
index 9208e6c..5652741 100644
--- a/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceModelWizard.java
+++ b/services/org.eclipse.sensinact.studio.model.resource.editor/src/org/eclipse/sensinact/studio/resource/presentation/ResourceModelWizard.java
@@ -182,6 +182,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	@Override
 	public void init(IWorkbench workbench, IStructuredSelection selection) {
 		this.workbench = workbench;
 		this.selection = selection;
@@ -288,6 +289,7 @@
 				final ISelection targetSelection = new StructuredSelection(modelFile);
 				getShell().getDisplay().asyncExec
 					(new Runnable() {
+						 @Override
 						 public void run() {
 							 ((ISetSelectionTarget)activePart).selectReveal(targetSelection);
 						 }
@@ -404,6 +406,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
+		@Override
 		public void createControl(Composite parent) {
 			Composite composite = new Composite(parent, SWT.NONE); {
 				GridLayout layout = new GridLayout();
@@ -478,6 +481,7 @@
 		 */
 		protected ModifyListener validator =
 			new ModifyListener() {
+				@Override
 				public void modifyText(ModifyEvent e) {
 					setPageComplete(validatePage());
 				}
diff --git a/services/org.eclipse.sensinact.studio.model.resource.tests/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.model.resource.tests/META-INF/MANIFEST.MF
index 771c45d..b1e1068 100644
--- a/services/org.eclipse.sensinact.studio.model.resource.tests/META-INF/MANIFEST.MF
+++ b/services/org.eclipse.sensinact.studio.model.resource.tests/META-INF/MANIFEST.MF
@@ -2,6 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.sensinact.studio.model.resource.tests;singleton:=true
+Automatic-Module-Name: org.eclipse.sensinact.studio.model.resource.tests
 Bundle-Version: 1.0.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
diff --git a/services/org.eclipse.sensinact.studio.model.resource/META-INF/MANIFEST.MF b/services/org.eclipse.sensinact.studio.model.resource/META-INF/MANIFEST.MF
index f7158da..479a437 100644
--- a/services/org.eclipse.sensinact.studio.model.resource/META-INF/MANIFEST.MF
+++ b/services/org.eclipse.sensinact.studio.model.resource/META-INF/MANIFEST.MF
@@ -2,6 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.sensinact.studio.model.resource;singleton:=true
+Automatic-Module-Name: org.eclipse.sensinact.studio.model.resource
 Bundle-Version: 1.0.0.qualifier
 Bundle-ClassPath: .
 Bundle-Vendor: %providerName
diff --git a/services/org.eclipse.sensinact.studio.model.resource/models/resource.genmodel b/services/org.eclipse.sensinact.studio.model.resource/models/resource.genmodel
index 3561579..b1f40dc 100644
--- a/services/org.eclipse.sensinact.studio.model.resource/models/resource.genmodel
+++ b/services/org.eclipse.sensinact.studio.model.resource/models/resource.genmodel
@@ -14,8 +14,8 @@
       <genEnumLiterals ecoreEnumLiteral="resource.ecore#//AccessMethodType/SUBSCRIBE"/>
       <genEnumLiterals ecoreEnumLiteral="resource.ecore#//AccessMethodType/UNSUBSCRIBE"/>
     </genEnums>
-    <genClasses ecoreClass="resource.ecore#//Devices">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Devices/device"/>
+    <genClasses ecoreClass="resource.ecore#//Studio">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Studio/gateways"/>
     </genClasses>
     <genClasses ecoreClass="resource.ecore#//Device">
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//Device/friendlyName"/>
@@ -36,7 +36,7 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//Resource/friendlyName"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Resource/attribute"/>
       <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Resource/accessMethod"/>
-      <genOperations ecoreOperation="resource.ecore#//Resource/getAccessMethod">
+      <genOperations ecoreOperation="resource.ecore#//Resource/getAccessMethod" body="EList&lt;AccessMethod> accessMethodByType = new EObjectContainmentEList&lt;AccessMethod>(AccessMethod.class, this, ResourcePackage.RESOURCE__ACCESS_METHOD);&#xA;&#x9;&#x9;for (AccessMethod accessMethod : getAccessMethod()) {&#xA;&#x9;&#x9;&#x9;if (accessMethod.getType().equals(type))&#xA;&#x9;&#x9;&#x9;&#x9;accessMethodByType.add(accessMethod);&#xA;&#x9;&#x9;}&#xA;&#x9;&#x9;return accessMethodByType;">
         <genParameters ecoreParameter="resource.ecore#//Resource/getAccessMethod/type"/>
       </genOperations>
     </genClasses>
@@ -57,5 +57,8 @@
       <genFeatures createChild="false" ecoreFeature="ecore:EAttribute resource.ecore#//AccessMethod/type"/>
     </genClasses>
     <genClasses ecoreClass="resource.ecore#//Parameter"/>
+    <genClasses ecoreClass="resource.ecore#//Gateway">
+      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference resource.ecore#//Gateway/device"/>
+    </genClasses>
   </genPackages>
 </genmodel:GenModel>
diff --git a/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Segments.java b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Segments.java
index 55c083b..18202c6 100644
--- a/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Segments.java
+++ b/services/org.eclipse.sensinact.studio.model.resource/src/org/eclipse/sensinact/studio/model/resource/utils/Segments.java
@@ -106,6 +106,10 @@
 			return new BuilderLocation(gateway);
 		}
 		
+		public BuilderReady root() {
+			return new BuilderReady(gateway, ROOT_SEGMENT);
+		}
+		
 		public BuilderReady devices() {
 			return new BuilderReady(gateway, ROOT_SEGMENT, PROVIDERS);
 		}
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/META-INF/MANIFEST.MF b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/META-INF/MANIFEST.MF
index d3b0ced..584b538 100644
--- a/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/META-INF/MANIFEST.MF
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ide/META-INF/MANIFEST.MF
@@ -8,8 +8,7 @@
 Require-Bundle: org.eclipse.sensinact.studio.language.sensinact,
  org.eclipse.xtext.ide,
  org.eclipse.xtext.xbase.ide,
- org.antlr.runtime
+ org.antlr.runtime;bundle-version="[3.2.0,3.2.1)"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
 Export-Package: org.eclipse.sensinact.studio.language.ide.contentassist.antlr,
  org.eclipse.sensinact.studio.language.ide.contentassist.antlr.internal
-
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/META-INF/MANIFEST.MF b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/META-INF/MANIFEST.MF
index e1d616e..14317a8 100644
--- a/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/META-INF/MANIFEST.MF
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.tests/META-INF/MANIFEST.MF
@@ -9,7 +9,7 @@
  org.junit,
  org.eclipse.xtext.junit4,
  org.eclipse.xtext.xbase.junit,
- org.eclipse.xtext.xbase.lib,
+ org.eclipse.xtext.xbase.lib;bundle-version="2.14.0",
  org.eclipse.xtext.testing,
  org.eclipse.xtext.xbase.testing
 Bundle-RequiredExecutionEnvironment: JavaSE-1.7
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/META-INF/MANIFEST.MF b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/META-INF/MANIFEST.MF
index 081c687..3365da1 100644
--- a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/META-INF/MANIFEST.MF
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/META-INF/MANIFEST.MF
@@ -15,8 +15,8 @@
  org.eclipse.ui,
  org.eclipse.compare,
  org.eclipse.xtext.builder,
- org.eclipse.xtend.lib;resolution:=optional,
- org.eclipse.xtext.xbase.lib,
+ org.eclipse.xtend.lib;bundle-version="2.14.0";resolution:=optional,
+ org.eclipse.xtext.xbase.lib;bundle-version="2.14.0",
  org.eclipse.sensinact.studio.model.manager
 Import-Package: org.apache.log4j
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/plugin.xml_gen b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/plugin.xml_gen
index 705ed4f..384a316 100644
--- a/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/plugin.xml_gen
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact.ui/plugin.xml_gen
@@ -204,6 +204,15 @@
 			</activeWhen>
 		</handler>
 	</extension>
+	<extension point="org.eclipse.core.contenttype.contentTypes">
+		<content-type
+			base-type="org.eclipse.core.runtime.text"
+			file-extensions="sna"
+			id="org.eclipse.sensinact.studio.language.Sensinact.contenttype"
+			name="Sensinact File"
+			priority="normal">
+		</content-type>
+	</extension>
 	<!-- adding resource factories -->
 	<extension
 		point="org.eclipse.emf.ecore.extension_parser">
@@ -388,12 +397,18 @@
 			class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
 			extensions="sna">
 		</viewer>
+		<contentTypeBinding
+			contentTypeId="org.eclipse.sensinact.studio.language.Sensinact.contenttype"
+			contentViewerId="org.eclipse.sensinact.studio.language.Sensinact.compare.contentViewers" />
 	</extension>
 	<extension point="org.eclipse.compare.contentMergeViewers">
 		<viewer id="org.eclipse.sensinact.studio.language.Sensinact.compare.contentMergeViewers"
 			class="org.eclipse.sensinact.studio.language.ui.SensinactExecutableExtensionFactory:org.eclipse.xtext.ui.compare.InjectableViewerCreator"
 			extensions="sna" label="Sensinact Compare">
 		</viewer>
+		<contentTypeBinding
+			contentTypeId="org.eclipse.sensinact.studio.language.Sensinact.contenttype"
+			contentMergeViewerId="org.eclipse.sensinact.studio.language.Sensinact.compare.contentMergeViewers" />
 	</extension>
 	<extension point="org.eclipse.ui.editors.documentProviders">
 		<provider id="org.eclipse.sensinact.studio.language.Sensinact.editors.documentProviders"
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/META-INF/MANIFEST.MF b/xtext/org.eclipse.sensinact.studio.language.sensinact/META-INF/MANIFEST.MF
index 7956ec7..64f6982 100644
--- a/xtext/org.eclipse.sensinact.studio.language.sensinact/META-INF/MANIFEST.MF
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/META-INF/MANIFEST.MF
@@ -1,31 +1,31 @@
-Manifest-Version: 1.0

-Bundle-ManifestVersion: 2

-Bundle-Name: org.eclipse.sensinact.studio.language.sensinact

-Bundle-Vendor: My Company

-Bundle-Version: 1.0.0.qualifier

-Bundle-SymbolicName: org.eclipse.sensinact.studio.language.sensinact; singleton:=true

-Bundle-ActivationPolicy: lazy

-Require-Bundle: org.eclipse.xtext,

- org.eclipse.xtext.xbase,

- org.eclipse.equinox.common;bundle-version="3.5.0",

- org.eclipse.emf.ecore,

- org.eclipse.xtext.xbase.lib,

- org.antlr.runtime,

- org.eclipse.xtext.util,

- org.eclipse.xtend.lib,

- org.eclipse.emf.common,

- org.eclipse.sensinact.studio.model.manager;bundle-version="1.0.0",

- org.eclipse.sensinact.studio.model.resource;bundle-version="1.0.0"

-Bundle-RequiredExecutionEnvironment: JavaSE-1.8

-Export-Package: org.eclipse.sensinact.studio.language.validation,

- org.eclipse.sensinact.studio.language.sensinact.impl,

- org.eclipse.sensinact.studio.language.scoping,

- org.eclipse.sensinact.studio.language.sensinact.util,

- org.eclipse.sensinact.studio.language.parser.antlr.internal,

- org.eclipse.sensinact.studio.language.parser.antlr,

- org.eclipse.sensinact.studio.language,

- org.eclipse.sensinact.studio.language.services,

- org.eclipse.sensinact.studio.language.sensinact,

- org.eclipse.sensinact.studio.language.serializer,

- org.eclipse.sensinact.studio.language.generator

-Import-Package: org.apache.log4j

+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: org.eclipse.sensinact.studio.language.sensinact
+Bundle-Vendor: My Company
+Bundle-Version: 1.0.0.qualifier
+Bundle-SymbolicName: org.eclipse.sensinact.studio.language.sensinact; singleton:=true
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.eclipse.xtext,
+ org.eclipse.xtext.xbase,
+ org.eclipse.equinox.common;bundle-version="3.5.0",
+ org.eclipse.emf.ecore,
+ org.eclipse.xtext.xbase.lib;bundle-version="2.14.0",
+ org.antlr.runtime;bundle-version="[3.2.0,3.2.1)",
+ org.eclipse.xtext.util,
+ org.eclipse.xtend.lib;bundle-version="2.14.0",
+ org.eclipse.emf.common,
+ org.eclipse.sensinact.studio.model.manager;bundle-version="1.0.0",
+ org.eclipse.sensinact.studio.model.resource;bundle-version="1.0.0"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Export-Package: org.eclipse.sensinact.studio.language.validation,
+ org.eclipse.sensinact.studio.language.sensinact.impl,
+ org.eclipse.sensinact.studio.language.scoping,
+ org.eclipse.sensinact.studio.language.sensinact.util,
+ org.eclipse.sensinact.studio.language.parser.antlr.internal,
+ org.eclipse.sensinact.studio.language.parser.antlr,
+ org.eclipse.sensinact.studio.language,
+ org.eclipse.sensinact.studio.language.services,
+ org.eclipse.sensinact.studio.language.sensinact,
+ org.eclipse.sensinact.studio.language.serializer,
+ org.eclipse.sensinact.studio.language.generator
+Import-Package: org.apache.log4j
diff --git a/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.genmodel b/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.genmodel
index 6a60467..3b623b6 100644
--- a/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.genmodel
+++ b/xtext/org.eclipse.sensinact.studio.language.sensinact/model/generated/Sensinact.genmodel
@@ -1,9 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <genmodel:GenModel xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="generated by Xtext 2.12.0" modelDirectory="/org.eclipse.sensinact.studio.language.sensinact/src-gen"
+    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="generated by Xtext 2.16.0" modelDirectory="/org.eclipse.sensinact.studio.language.sensinact/src-gen"
     modelPluginID="org.eclipse.sensinact.studio.language.sensinact" forceOverwrite="true"
     modelName="Sensinact" updateClasspath="false" rootExtendsClass="org.eclipse.emf.ecore.impl.MinimalEObjectImpl$Container"
-    complianceLevel="6.0" copyrightFields="false" runtimeVersion="2.13">
+    complianceLevel="6.0" copyrightFields="false" runtimeVersion="2.16">
   <genPackages prefix="Sensinact" basePackage="org.eclipse.sensinact.studio.language"
       disposableProviderFactory="true" fileExtensions="sna" ecorePackage="Sensinact.ecore#/">
     <genClasses ecoreClass="Sensinact.ecore#//Sensinact">