Merge branch 'dev' into feature0

Conflicts:
	org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/notifier/Notifier.java
	org.eclipse.om2m.site.in-cse/om2m.product
	org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/AccessControlPolicyTest.java
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/ACP.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/ACP.java
new file mode 100644
index 0000000..367b959
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/ACP.java
@@ -0,0 +1,167 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ACP extends TestConfig{	
+	private static String acpTestRU = "acpTestRU";
+	private static String acpTestD = "aeTestD";
+	private static String acpTestC = "acpTestC";
+	private static String aeName = "aeTestRU";
+	private static String cntName = "cntTest";
+	private static String badOriginator = "guest:guest";	
+
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		JSONObject obj = new JSONObject();
+		obj.put("rn", aeName);
+		obj.put("api", 12345);
+		obj.put("rr", false);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:ae", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+        
+		JSONArray acor = new JSONArray();
+		acor.put("admin:admin");
+		//acor.put("cae-admin");
+		JSONObject item = new JSONObject();
+		item.put("acor", acor);
+		item.put("acop", 63);
+		JSONArray acr1 = new JSONArray();
+		acr1.put(item);
+		
+		acor = new JSONArray();
+		acor.put("guest:guest");
+		acor.put("admin:admin");
+		//acor.put("cae-admin");
+		item = new JSONObject();
+		item.put("acor", acor);
+		item.put("acop", 34);
+		JSONArray acr2 = new JSONArray();
+		acr2.put(item);
+		
+		JSONObject pv = new JSONObject();
+		pv.put("acr",acr1);	
+		pv.put("acr",acr2);	
+		JSONObject pvs = new JSONObject();
+		pvs.put("acr", acr1);
+		obj = new JSONObject();
+		obj.put("rn", acpTestRU);
+		obj.put("pv", pv);	
+		obj.put("pvs", pvs);	
+		resource = new JSONObject();
+		resource.put("m2m:acp", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName, resource.toString(), 1);
+		
+		obj = new JSONObject();
+		obj.put("rn", acpTestD);
+		obj.put("pv", pv);
+		obj.put("pvs", pvs);	
+		resource = new JSONObject();
+		resource.put("m2m:acp", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName, resource.toString(), 1);
+
+		JSONArray acpi = new JSONArray();
+		acpi.put("/"+cseId+"/"+cseName+"/"+aeName+"/"+acpTestRU);
+		obj = new JSONObject();
+        obj.put("acpi",acpi); 
+        obj.put("rn", cntName);
+        resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+        RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName, resource.toString(), 3);  
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName);
+	}
+	
+	@Test
+	public void testCreate() {	
+		JSONArray acor = new JSONArray();
+		acor.put("admin:admin");
+		//acor.put("cae-admin");
+
+		JSONObject item = new JSONObject();
+		item.put("acor", acor);
+		item.put("acop", 63);
+		
+		JSONArray acr = new JSONArray();
+		acr.put(item);
+		
+		JSONObject pv = new JSONObject();
+		pv.put("acr",acr);
+		
+		JSONObject pvs = new JSONObject();
+		pvs.put("acr", acr);	
+		
+		JSONObject obj = new JSONObject();
+		obj.put("rn", acpTestC);
+		obj.put("pv", pv);	
+		obj.put("pvs", pv);	
+		
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:acp", obj);
+				
+		HttpResponse httpResponse = RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName, resource.toString(), 1);
+		assertEquals(201, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+acpTestRU);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testUpdate() {
+		JSONArray acor = new JSONArray();
+		//acor.put("cae-admin");
+		acor.put("*");
+		
+		JSONObject item = new JSONObject();
+		item.put("acor", acor);
+		item.put("acop", 63);
+		
+		JSONArray acr = new JSONArray();
+		acr.put(item);
+		
+		JSONObject pv = new JSONObject();
+		pv.put("acr",acr);
+		
+		JSONObject pvs = new JSONObject();
+		pvs.put("acr", acr);
+			
+		
+		JSONObject obj = new JSONObject();
+		obj.put("pv", pv);	
+		obj.put("pvs", pv);	
+		
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:acp", obj);
+				
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+acpTestRU, resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+acpTestD);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testNonAuthorizedOperation() {
+		HttpResponse httpResponse = RestHttpClient.delete(badOriginator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName);
+		assertEquals(403, httpResponse.getStatusCode());
+	}
+
+}
+
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/AE.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/AE.java
new file mode 100644
index 0000000..718c346
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/AE.java
@@ -0,0 +1,77 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class AE extends TestConfig{	
+	private static String aeTestRU = "aeTestRU";
+	private static String aeTestD = "aeTestD";
+	private static String aeTestC = "aeTestC";
+
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		JSONObject obj = new JSONObject();
+		obj.put("rn", aeTestRU);
+		obj.put("api", 12345);
+		obj.put("rr", false);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:ae", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+		
+		obj = new JSONObject();
+		obj.put("rn", aeTestD);
+		obj.put("api", 12345);
+		obj.put("rr", false);
+		resource = new JSONObject();
+		resource.put("m2m:ae", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeTestRU);
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeTestD);
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeTestC);
+	}
+	
+	@Test
+	public void testCreate() {	
+		JSONObject obj = new JSONObject();
+		obj.put("rn", aeTestC);
+		obj.put("api", 12345);
+		obj.put("rr", false);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:ae", obj);
+		HttpResponse httpResponse = RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+		assertEquals(201, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeTestRU);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testUpdate() {
+		JSONObject obj = new JSONObject();
+		obj.put("rr", true);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:ae", obj);
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeTestRU, resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeTestD);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/CSEBase.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/CSEBase.java
new file mode 100644
index 0000000..34fc2b1
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/CSEBase.java
@@ -0,0 +1,17 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.junit.Test;
+
+public class CSEBase extends TestConfig {
+
+	@Test
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Container.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Container.java
new file mode 100644
index 0000000..be21029
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Container.java
@@ -0,0 +1,81 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class Container extends TestConfig {
+	
+	private static String aeC = "aeTestRU";
+	private static String cnTestRU = "cnTestRU";
+	private static String cnTestD = "cnTestD";
+	private static String cnTestC = "cnTestC";
+	
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		
+		JSONObject obj = new JSONObject();
+		obj.put("rn", aeC);
+		obj.put("api", 12345);
+		obj.put("rr", false);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:ae", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+		
+	
+		obj = new JSONObject();
+        obj.put("rn", cnTestRU);
+        resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+        RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeC, resource.toString(), 3);
+        
+  
+        obj = new JSONObject();
+        obj.put("rn", cnTestD);
+        resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+        RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeC, resource.toString(), 3);
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeC);
+	}
+
+	@Test
+	public void testCreate() {
+		JSONObject obj = new JSONObject();
+		obj.put("rn", cnTestC);
+		JSONObject resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+		HttpResponse httpResponse = RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeC, resource.toString(), 3);
+		assertEquals(201, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeC+"/"+cnTestRU);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testUpdate() {
+		JSONObject obj = new JSONObject();
+		obj.put("et", "20181228T164835");
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:cnt", obj);
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeC+"/"+cnTestRU, resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeC+"/"+cnTestD);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/ContentInstance.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/ContentInstance.java
new file mode 100644
index 0000000..2f161be
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/ContentInstance.java
@@ -0,0 +1,107 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ContentInstance extends TestConfig{
+
+	private static String aeName = "aeTestRU";
+	private static String cntName = "cntTest";
+	private static String cinTestRU = "cinTestRU";
+	private static String cinTestD = "cinTestD";
+	private static String cinTestC = "cinTestC";
+	
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+	
+		JSONObject obj = new JSONObject();
+		obj.put("rn", aeName);
+		obj.put("api", 12345);
+		obj.put("rr", false);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:ae", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+				
+	
+		obj = new JSONObject();
+		obj.put("rn", cntName);
+		resource = new JSONObject();
+		resource.put("m2m:cnt", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName, resource.toString(), 3);
+		
+		
+	
+		obj = new JSONObject();
+		obj.put("rn", cinTestRU);
+		obj.put("cnf", "application/text");
+		obj.put("con", 25);
+		resource = new JSONObject();
+		resource.put("m2m:cin", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName, resource.toString(), 4);
+		
+	
+		obj = new JSONObject();
+		obj.put("rn", cinTestD);
+		obj.put("cnf", "application/text");
+		obj.put("con", 35);
+		resource = new JSONObject();
+		resource.put("m2m:cin", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName, resource.toString(), 4);
+	}
+
+	//@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName);
+	}
+	
+	@Test
+	public void testCreate() {
+		JSONObject obj = new JSONObject();
+		obj.put("rn", cinTestC);
+		obj.put("cnf", "application/text");
+		obj.put("con", 30);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:cin", obj);
+		HttpResponse httpResponse = RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName, resource.toString(), 4);
+		assertEquals(201, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName+"/"+cinTestRU);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreiveLA() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName+"/la");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreiveOL() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName+"/ol");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	/*public void testUpdate() {
+		JSONObject obj = new JSONObject();
+		obj.put("et", "20161228T164835");
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:cin", obj);
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeCi+"/"+cnCi+"/"+cinTestRU, resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}*/
+	@Test
+	public void testDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName+"/"+cinTestD);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Discovery.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Discovery.java
new file mode 100644
index 0000000..d83b0cb
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Discovery.java
@@ -0,0 +1,86 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class Discovery extends TestConfig {
+
+	private static String aeName = "aeTest";
+	
+	//@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+	 JSONObject obj = new JSONObject();
+	 obj.put("rn", aeName);
+	 obj.put("api", 12345);
+	 obj.put("rr", false);
+	 JSONArray array = new JSONArray();
+	 array.put("Type/Sensor"); 
+	 array.put("Category/Luminosity"); 
+	 array.put("Manufactor/Philips"); 
+	 obj.put("lbl", array);
+	 JSONObject resource = new JSONObject();
+	 resource.put("m2m:ae", obj);
+	 RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+	}
+	
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName);
+	}
+	
+	@Test
+	public void testAllResources() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void TestWithFilterCriteria() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1&ty=2");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void TestWithLimitFilterCriteria() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1&lim=1");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void TestWithLabelFilterCriteria() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1&lbl=Manufactor/Philips");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+
+	@Test
+	public void TestWithMultipleFilterCriteria() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1&ty=1&lbl=Type/Sensor");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void TestWithLevelFilterCriteria() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1&lvl=1");
+		assertEquals(200, httpResponse.getStatusCode());
+		httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1&lvl=2");
+		assertEquals(200, httpResponse.getStatusCode());
+		httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1&lvl=3");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void TestWithOffsetFilterCriteria() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1&ofst=3&lim=1");
+		assertEquals(200, httpResponse.getStatusCode());
+		httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"?fu=1&ofst=3");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/FanoutPoint.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/FanoutPoint.java
new file mode 100644
index 0000000..4ec5316
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/FanoutPoint.java
@@ -0,0 +1,144 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class FanoutPoint extends TestConfig {
+
+	private static String groupC = "groupTest";
+	private static String groupRU = "groupRU"; 
+	private static String groupD = "groupD";
+	
+	private static String cnTestC1 = "cnTestC1";
+	private static String cnTestC2 = "cnTestC2";
+	
+	private static String cnTestRU1 = "cnTestRU1";
+	private static String cnTestRU2 = "cnTestRU2";
+	
+	private static String cnTestD1 = "cnTestD1";
+	private static String cnTestD2 = "cnTestD1";
+	
+	private static String cinTest = "cinTest";
+	
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		JSONObject obj = new JSONObject();
+        obj.put("rn", cnTestRU1);
+        JSONObject resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+        RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 3);
+          
+        obj = new JSONObject();
+        obj.put("rn", cnTestRU2);
+        resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+        RestHttpClient.post(originator, csePoa+"/~/"+remoteCseId, resource.toString(), 3);
+		
+		JSONArray array = new JSONArray();
+		array.put("/"+cseId+"/"+cseName+"/"+cnTestRU1);
+		array.put("/"+remoteCseId+"/"+remoteCseName+"/"+cnTestRU2);
+		obj = new JSONObject();
+		obj.put("mid", array);
+		obj.put("rn", groupRU); 
+		obj.put("mnm", 3);
+		resource = new JSONObject();		
+		resource.put("m2m:grp", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 9);
+		
+		obj = new JSONObject();
+        obj.put("rn", cnTestD1);
+        resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+        RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 3);
+          
+        obj = new JSONObject();
+        obj.put("rn", cnTestD2);
+        resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+        RestHttpClient.post(originator, csePoa+"/~/"+remoteCseId, resource.toString(), 3);
+		
+		array = new JSONArray();
+		array.put("/"+cseId+"/"+cseName+"/"+cnTestD1);
+		array.put("/"+remoteCseId+"/"+remoteCseName+"/"+cnTestD2);
+		obj = new JSONObject();
+		obj.put("mid", array);
+		obj.put("rn", groupD); 
+		obj.put("mnm", 3);
+		resource = new JSONObject();		
+		resource.put("m2m:grp", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 9);
+		
+		
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupC);
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupRU);
+	}
+
+	@Test
+	public void testCreate() {
+		JSONObject obj = new JSONObject();
+        obj.put("rn", cnTestC1);
+        JSONObject resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+        RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 3);
+          
+        obj = new JSONObject();
+        obj.put("rn", cnTestC2);
+        resource = new JSONObject();
+        resource.put("m2m:cnt", obj);
+        RestHttpClient.post(originator, csePoa+"/~/"+remoteCseId, resource.toString(), 3);
+		
+		JSONArray array = new JSONArray();
+		array.put("/"+cseId+"/"+cseName+"/"+cnTestC1);
+		array.put("/"+remoteCseId+"/"+remoteCseName+"/"+cnTestC2);
+		obj = new JSONObject();
+		obj.put("mid", array);
+		obj.put("rn", groupC); 
+		obj.put("mnm", 3);
+		resource = new JSONObject();		
+		resource.put("m2m:grp", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 9);
+		
+		obj = new JSONObject();
+		obj.put("rn", cinTest);
+		obj.put("cnf", "application/text");
+		obj.put("con", 25);
+		resource = new JSONObject();
+		resource.put("m2m:cin", obj);
+		HttpResponse httpResponse  = RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupC+"/fopt", resource.toString(), 4);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupRU+"/fopt");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test 
+	public void testDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupD+"/fopt");
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testUpdate() {
+		JSONObject obj = new JSONObject();
+		obj.put("et", "20181228T164835");
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:cnt", obj);
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupRU+"/fopt", resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Group.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Group.java
new file mode 100644
index 0000000..2e5b2a1
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Group.java
@@ -0,0 +1,92 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class Group extends TestConfig {
+	
+	private static String groupTestRU = "groupTestRU";
+	private static String groupTestD = "groupTestD";
+	private static String groupTestC = "groupTestC";
+	private static String aeName = "aeTest";
+	
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		JSONObject obj = new JSONObject();
+		obj.put("rn", aeName);
+		obj.put("api", 12345);
+		obj.put("rr", false);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:ae", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+		
+		JSONArray array = new JSONArray();
+		array.put("/"+cseId+"/"+cseName+"/"+aeName);
+		obj = new JSONObject();
+		obj.put("mid", array);
+		obj.put("rn", groupTestRU); 
+		obj.put("mnm", 3);
+		resource = new JSONObject();		
+		resource.put("m2m:grp", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 9);
+		
+		obj = new JSONObject();
+		obj.put("mid", array);
+		obj.put("rn", groupTestD); 
+		obj.put("mnm", 3);
+		resource = new JSONObject();		
+		resource.put("m2m:grp", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 9);
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupTestC);
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupTestRU);
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName);
+	}
+
+	@Test
+	public void testCreate() {
+		JSONArray array = new JSONArray();
+		array.put("/"+cseId+"/"+cseName+"/"+aeName);
+		JSONObject obj = new JSONObject();
+		obj.put("mid", array);
+		obj.put("rn", groupTestC); 
+		obj.put("mnm", 3);
+		JSONObject resource = new JSONObject();		
+		resource.put("m2m:grp", obj);
+		HttpResponse httpResponse = RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 9);
+		assertEquals(201, httpResponse.getStatusCode());
+	}
+	
+	@Test 
+	public void testRetreive(){
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupTestRU);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testUpdate(){
+		JSONObject obj = new JSONObject();
+		obj.put("et", "20171228T164835");
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:grp", obj);
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupTestRU, resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test 
+	public void testDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+groupTestD);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/LongPolling.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/LongPolling.java
new file mode 100644
index 0000000..902dc46
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/LongPolling.java
@@ -0,0 +1,80 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class LongPolling extends TestConfig {
+	
+	private static String lpTestRU = "lpRU";
+	private static String lpTestD = "lpD";
+	private static String lpTestC = "lpC";
+	private static String aeName = "ae_test";
+	
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		JSONObject obj = new JSONObject();
+		obj.put("rn", aeName);
+		obj.put("api", 12345);
+		obj.put("rr", false);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:ae", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+		
+		obj = new JSONObject();
+		obj.put("rn", lpTestRU);
+		resource = new JSONObject();
+		resource.put("m2m:pch", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName, resource.toString(), 15);
+		
+		obj = new JSONObject();
+		obj.put("rn", lpTestD);
+		resource = new JSONObject();		
+		resource.put("m2m:pch", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName, resource.toString(), 15);
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+lpTestC);
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+lpTestRU);
+	}
+
+	@Test
+	public void testCreate() {
+		JSONObject obj = new JSONObject();
+		obj.put("rn", lpTestC);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:pch", obj);
+		HttpResponse httpResponse = RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName, resource.toString(), 15);
+		assertEquals(201, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+lpTestRU);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testUpdate(){
+		JSONObject obj = new JSONObject();
+		obj.put("et", "20181228T164835");
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:pch", obj);
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+lpTestRU, resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+lpTestD);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Node.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Node.java
new file mode 100644
index 0000000..d309f7c
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Node.java
@@ -0,0 +1,74 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class Node extends TestConfig {
+	
+	private static String nodeTestRU = "nodeRU";
+	private static String nodeTestD = "nodeD";
+	private static String nodeTestC = "nodeC";
+	
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		JSONObject obj = new JSONObject();
+		obj.put("rn", nodeTestRU);
+		obj.put("ni", "node-test");
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:nod", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 14);
+		
+		obj = new JSONObject();
+		obj.put("rn", nodeTestD);
+		obj.put("ni", "node-test2");
+		resource = new JSONObject();		
+		resource.put("m2m:nod", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 14);
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+nodeTestC);
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+nodeTestRU);
+	}
+
+	@Test
+	public void testCreate() {
+		JSONObject obj = new JSONObject();
+		obj.put("rn", nodeTestC);
+		obj.put("ni", "node-test3");
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:nod", obj);
+		HttpResponse httpResponse = RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 14);
+		assertEquals(201, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+nodeTestRU);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testUpdate(){
+		JSONObject obj = new JSONObject();
+		obj.put("et", "20181228T164835");
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:nod", obj);
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+nodeTestRU, resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+nodeTestD);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/RemoteCSE.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/RemoteCSE.java
new file mode 100644
index 0000000..523a966
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/RemoteCSE.java
@@ -0,0 +1,93 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class RemoteCSE extends TestConfig {
+	
+	private static String remoteCSETestRU = "remoteCSETestRU";
+	private static String remoteCSETestD = "remoteCSETestD";
+	private static String remoteCSETestC = "remoteCSETestC";
+	
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		JSONObject obj = new JSONObject(); 
+		obj.put("cb", remoteCSETestRU); 
+		obj.put("rn", remoteCSETestRU);
+		obj.put("csi", remoteCSETestRU); 
+		obj.put("rr", true); 
+		JSONArray array = new JSONArray();
+		array.put(remoteCsePoa+"/");
+		obj.put("poa", array);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:csr", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 16);
+		
+		obj = new JSONObject(); 
+		obj.put("cb", remoteCSETestD); 
+		obj.put("rn", remoteCSETestD);
+		obj.put("csi", remoteCSETestD); 
+		obj.put("rr", true); 
+		array = new JSONArray();
+		array.put(remoteCsePoa+"/");
+		obj.put("poa", array);
+		resource = new JSONObject();
+		resource.put("m2m:csr", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 16);
+		
+		
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+remoteCSETestRU);
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+remoteCSETestC);
+	}
+
+	@Test
+	public void testCreate() {
+		JSONObject obj = new JSONObject(); 
+		obj.put("cb", remoteCSETestC); 
+		obj.put("rn", remoteCSETestC);
+		obj.put("csi", remoteCSETestC); 
+		obj.put("rr", true); 
+		JSONArray array = new JSONArray();
+		array.put(remoteCsePoa+"/");
+		obj.put("poa", array);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:csr", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 16);
+	}
+
+	@Test 
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+remoteCSETestRU);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+remoteCSETestD);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testUpdate(){
+		JSONObject obj = new JSONObject();
+		JSONArray array = new JSONArray();
+		array.put("http://127.0.0.1:8585/");
+		obj.put("poa", array);
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:csr", obj);
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+remoteCSETestRU, resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Subscription.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Subscription.java
new file mode 100644
index 0000000..c1b384d
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/Subscription.java
@@ -0,0 +1,161 @@
+package org.eclipse.om2m.adn.tests;
+
+import static org.junit.Assert.*;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.InetSocketAddress;
+import java.util.concurrent.Executors;
+
+import org.eclipse.om2m.adn.tools.HttpResponse;
+import org.eclipse.om2m.adn.tools.RestHttpClient;
+import org.json.JSONArray;
+import org.json.JSONObject;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.sun.net.httpserver.HttpExchange;
+import com.sun.net.httpserver.HttpHandler;
+import com.sun.net.httpserver.HttpServer;
+
+public class Subscription extends TestConfig {
+	
+	private static String aeName = "aeTest";
+	private static String cntName = "cntTest";
+	private static String subTestRU = "subTestRU"; 
+	private static String subTestD = "subTestD"; 
+	private static String subTestC = "subTestC"; 
+	
+	private static String aeProtocol="http";
+	private static String aeIp = "127.0.0.1";
+	private static int aePort = 1401;	
+	private static String notificationURI = aeProtocol+"://"+aeIp+":"+aePort;
+
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+		//Starting Server
+		HttpServer server = null;
+		try {
+			server = HttpServer.create(new InetSocketAddress(aePort), 0);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		server.createContext("/", new MyHandler());
+		server.setExecutor(Executors.newCachedThreadPool());
+		server.start();
+		
+	
+		 JSONObject obj = new JSONObject();
+		 obj.put("rn", aeName);
+		 obj.put("api", 12345);
+		 obj.put("rr", false);
+		 JSONObject resource = new JSONObject();
+		 resource.put("m2m:ae", obj);
+		 RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName, resource.toString(), 2);
+						
+
+		obj = new JSONObject();
+		obj.put("rn", cntName);
+		resource = new JSONObject();
+		resource.put("m2m:cnt", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName, resource.toString(), 3);
+		
+	
+	
+		JSONArray array = new JSONArray();
+		array.put(notificationURI);
+		obj = new JSONObject();
+		obj.put("nu", array);
+		obj.put("rn", subTestRU);
+		obj.put("nct", 2);
+		resource = new JSONObject();		
+		resource.put("m2m:sub", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName, resource.toString(), 23);
+		
+
+		array = new JSONArray();
+		array.put(notificationURI);
+		obj = new JSONObject();
+		obj.put("nu", array);
+		obj.put("rn", subTestD);
+		obj.put("nct", 2);
+		resource = new JSONObject();		
+		resource.put("m2m:sub", obj);
+		RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName, resource.toString(), 23);
+	}
+
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+		RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName);
+	}
+
+	@Test
+	public void testCreate() {
+		JSONArray array = new JSONArray();
+		array.put(notificationURI);
+		JSONObject obj = new JSONObject();
+		obj.put("nu", array);
+		obj.put("rn", subTestC);
+		obj.put("nct", 2);
+		JSONObject resource = new JSONObject();		
+		resource.put("m2m:sub", obj);
+		HttpResponse httpResponse = RestHttpClient.post(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName, resource.toString(), 23);
+		assertEquals(201, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testRetreive() {
+		HttpResponse httpResponse = RestHttpClient.get(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName+"/"+subTestRU);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test
+	public void testUpdate() {
+		JSONObject obj = new JSONObject();
+		obj.put("et", "20181228T164835");
+		JSONObject resource = new JSONObject();
+		resource.put("m2m:sub", obj);
+		HttpResponse httpResponse = RestHttpClient.put(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName+"/"+subTestRU, resource.toString());
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	@Test 
+	public void TestDelete() {
+		HttpResponse httpResponse = RestHttpClient.delete(originator, csePoa+"/~/"+cseId+"/"+cseName+"/"+aeName+"/"+cntName+"/"+subTestD);
+		assertEquals(200, httpResponse.getStatusCode());
+	}
+	
+	
+	static class MyHandler implements HttpHandler {
+		 
+		public void handle(HttpExchange httpExchange)  {
+			System.out.println("Event Recieved!");
+ 
+			try{
+				InputStream in = httpExchange.getRequestBody();
+ 
+				String requestBody = "";
+				int i;char c;
+				while ((i = in.read()) != -1) {
+					c = (char) i;
+					requestBody = (String) (requestBody+c);
+				}
+ 
+				System.out.println(requestBody);
+ 
+				String responseBudy ="";
+				byte[] out = responseBudy.getBytes("UTF-8");
+				httpExchange.sendResponseHeaders(200, out.length);
+				OutputStream os =  httpExchange.getResponseBody();
+				os.write(out);
+				os.close();
+ 
+			} catch(Exception e){
+				e.printStackTrace();
+			}		
+		}
+	}
+
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/TestConfig.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/TestConfig.java
new file mode 100644
index 0000000..adf8007
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tests/TestConfig.java
@@ -0,0 +1,22 @@
+package org.eclipse.om2m.adn.tests;
+
+public class TestConfig {
+	
+	public final static String originator="admin:admin";
+	public final static String cseProtocol="http";
+	
+	public final static String cseIp = "127.0.0.1";
+	public final static int csePort = 8080;
+	
+	public final static String cseId = "in-cse";
+	public final static String cseName = "in-name";
+	
+	public final static String remoteCseIp = "127.0.0.1";
+	public final static int remoteCSEPort = 8282;
+	
+	public final static String remoteCseId = "mn-cse";
+	public final static String remoteCseName = "mn-name";
+	
+	public final static String csePoa = cseProtocol+"://"+cseIp+":"+csePort;
+	public final static String remoteCsePoa = cseProtocol+"://"+remoteCseIp+":"+remoteCSEPort; 
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tools/HttpResponse.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tools/HttpResponse.java
new file mode 100644
index 0000000..d9289d2
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tools/HttpResponse.java
@@ -0,0 +1,22 @@
+package org.eclipse.om2m.adn.tools;
+
+public class HttpResponse {
+	private int statusCode;
+	private String body;
+
+	public int getStatusCode() {
+		return statusCode;
+	}
+	
+	public void setStatusCode(int statusCode) {
+		this.statusCode = statusCode;
+	}
+	
+	public String getBody() {
+		return body;
+	}
+	
+	public void setBody(String body) {
+		this.body = body;
+	}
+}
diff --git a/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tools/RestHttpClient.java b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tools/RestHttpClient.java
new file mode 100644
index 0000000..081e371
--- /dev/null
+++ b/org.eclipse.om2m.adntest/src/test/java/org/eclipse/om2m/adn/tools/RestHttpClient.java
@@ -0,0 +1,214 @@
+/*****************************************************************************************
+* SENSINOV ("COMPANY") CONFIDENTIAL
+* Copyright (c) 2016 SENSINOV, All Rights Reserved.
+*
+* NOTICE:  All information contained herein is, and remains the property of COMPANY. 
+* The intellectual and technical concepts contained herein are proprietary to COMPANY 
+* and may be covered by France and Foreign Patents, patents in process, and are protected 
+* by trade secret or copyright law. Dissemination of this information or reproduction 
+* of this material is strictly forbidden unless prior written permission is obtained
+* from COMPANY. Access to the source code contained herein is hereby forbidden to 
+* anyone except current COMPANY employees, managers or contractors who have executed 
+* Confidentiality and Non-disclosure agreements explicitly covering such access.
+*
+* The copyright notice above does not evidence any actual or intended publication or 
+* disclosure  of  this source code, which includes * information that is confidential 
+* and/or proprietary, and is a trade secret, of  COMPANY. ANY REPRODUCTION, MODIFICATION,
+* DISTRIBUTION, PUBLIC  PERFORMANCE, OR PUBLIC DISPLAY OF OR THROUGH USE  OF THIS  SOURCE 
+* CODE  WITHOUT  THE EXPRESS WRITTEN CONSENT OF COMPANY IS STRICTLY PROHIBITED, AND IN 
+* VIOLATION OF APPLICABLE * LAWS AND INTERNATIONAL TREATIES. THE RECEIPT OR POSSESSION OF
+* THIS SOURCE CODE AND/OR RELATED INFORMATION DOES NOT CONVEY OR IMPLY ANY RIGHTS TO 
+* REPRODUCE, DISCLOSE OR DISTRIBUTE ITS CONTENTS, OR TO MANUFACTURE, USE, OR SELL ANYTHING
+* THAT IT  MAY DESCRIBE, IN WHOLE OR IN PART.                
+*******************************************************************************************/
+
+package org.eclipse.om2m.adn.tools;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.security.KeyManagementException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import javax.net.ssl.HostnameVerifier;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.methods.*;
+import org.apache.http.conn.scheme.Scheme;
+import org.apache.http.conn.ssl.SSLSocketFactory;
+import org.apache.http.conn.ssl.X509HostnameVerifier;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.DefaultHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.eclipse.om2m.adn.tests.TestConfig;
+
+
+public class RestHttpClient {
+	 static DefaultHttpClient httpclient=null;
+
+	 public static void init(){
+		
+		 httpclient = new DefaultHttpClient();
+         
+		 if(TestConfig.cseProtocol.equals("https")){
+			try{
+	            KeyStore trustStore  = KeyStore.getInstance(KeyStore.getDefaultType());
+	            FileInputStream instream = new FileInputStream(new File("keystore.jks"));
+	            try {
+	                trustStore.load(instream, "keystore".toCharArray());
+	            }catch (NoSuchAlgorithmException e) {
+					e.printStackTrace();
+				}catch (CertificateException e) {
+					e.printStackTrace();
+				}finally {
+	                try { instream.close(); } catch (Exception ignore) {}
+	            }
+					 SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore, "keystore",trustStore);
+					 socketFactory.setHostnameVerifier((X509HostnameVerifier) SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
+				     Scheme sch = new Scheme("https", 8443, socketFactory);
+				     httpclient.getConnectionManager().getSchemeRegistry().register(sch);
+				}catch (Exception e){
+					e.printStackTrace();
+				}
+			 }
+		 
+	 }
+	 
+	 
+	public static HttpResponse get(String originator, String uri) {
+		if(httpclient==null){
+			 init();
+		 }
+		System.out.println("HTTP GET "+uri);
+
+		HttpGet httpGet= new HttpGet(uri);
+		
+		httpGet.addHeader("x-m2m-ri",generateRI());
+		httpGet.addHeader("x-m2m-origin",originator);
+		httpGet.addHeader("Accept","application/json");
+
+		HttpResponse httpResponse = new HttpResponse();
+		
+			try {
+				CloseableHttpResponse closeableHttpResponse = httpclient.execute(httpGet);
+				try{
+					httpResponse.setStatusCode(closeableHttpResponse.getStatusLine().getStatusCode());
+					httpResponse.setBody(EntityUtils.toString(closeableHttpResponse.getEntity()));
+				}finally{
+					closeableHttpResponse.close();
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			} 
+		System.out.println("HTTP Response "+httpResponse.getStatusCode()+"\n"+httpResponse.getBody());
+		return httpResponse;	
+	}
+	public static HttpResponse put(String originator, String uri, String body) {
+		if(httpclient==null){
+			 init();
+		 }
+		System.out.println("HTTP PUT "+uri+"\n"+body);
+		
+		HttpPut httpPut= new HttpPut(uri);
+		
+		httpPut.addHeader("X-M2M-RI",generateRI());
+		httpPut.addHeader("X-M2M-Origin",originator);
+		httpPut.addHeader("Content-Type","application/json");
+		httpPut.addHeader("Accept","application/json");
+
+		HttpResponse httpResponse = new HttpResponse();
+		try {
+			CloseableHttpResponse closeableHttpResponse =null;
+			try {
+				httpPut.setEntity(new StringEntity(body));
+				closeableHttpResponse= httpclient.execute(httpPut);
+				httpResponse.setStatusCode(closeableHttpResponse.getStatusLine().getStatusCode());
+				httpResponse.setBody(EntityUtils.toString(closeableHttpResponse.getEntity()));
+				
+			}finally{
+				closeableHttpResponse.close();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} 
+		System.out.println("HTTP Response "+httpResponse.getStatusCode()+"\n"+httpResponse.getBody());
+
+		return httpResponse ;	
+	}
+	
+	public static HttpResponse post(String originator, String uri, String body, int ty) {
+		if(httpclient==null){
+			 init();
+		 }
+		System.out.println("HTTP POST "+uri+"\n"+body);
+
+
+		final HttpPost httpPost = new HttpPost(uri);
+		
+		httpPost.addHeader("X-M2M-RI",generateRI());
+		httpPost.addHeader("X-M2M-Origin",originator);
+		httpPost.addHeader("Accept","application/json");
+		
+		httpPost.addHeader("Content-Type","application/json;ty="+ty);
+				
+		final HttpResponse httpResponse = new HttpResponse();
+
+			try{
+				httpPost.setEntity(new StringEntity(body));
+						try {
+							CloseableHttpResponse closeableHttpResponse=null;
+							closeableHttpResponse = httpclient.execute(httpPost);
+							httpResponse.setStatusCode(closeableHttpResponse.getStatusLine().getStatusCode());
+							httpResponse.setBody(EntityUtils.toString(closeableHttpResponse.getEntity()));
+						} catch (ClientProtocolException e) {
+							e.printStackTrace();
+						} catch (IOException e) {
+							e.printStackTrace();
+						}
+	
+		} catch (Exception e) {
+			e.printStackTrace();
+		} 
+		System.out.println("HTTP Response "+httpResponse.getStatusCode()+"\n"+httpResponse.getBody());
+		return httpResponse ;	
+	}
+	
+	public static HttpResponse delete(String originator, String uri) {
+		if(httpclient==null){
+			 init();
+		 }
+		System.out.println("HTTP DELETE "+uri);
+
+		HttpDelete httpDelete = new HttpDelete(uri);
+
+		httpDelete.addHeader("X-M2M-RI",generateRI());
+		httpDelete.addHeader("X-M2M-Origin",originator);
+		httpDelete.addHeader("Accept","application/json");
+
+
+		HttpResponse httpResponse = new HttpResponse();
+		try {
+			CloseableHttpResponse closeableHttpResponse = httpclient.execute(httpDelete);
+			try {
+				httpResponse.setStatusCode(closeableHttpResponse.getStatusLine().getStatusCode());
+				httpResponse.setBody(EntityUtils.toString(closeableHttpResponse.getEntity()));				
+			}finally{
+				closeableHttpResponse.close();
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} 
+		System.out.println("HTTP Response "+httpResponse.getStatusCode()+"\n"+httpResponse.getBody());
+		return httpResponse ;	
+	}	
+	
+	public static String generateRI(){
+		Integer random = (int)(Math.random()*1000)+100000;
+		return random.toString();
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.om2m.binding.coap/.project b/org.eclipse.om2m.binding.coap/.project
index 7fc3104..22688b7 100644
--- a/org.eclipse.om2m.binding.coap/.project
+++ b/org.eclipse.om2m.binding.coap/.project
@@ -11,11 +11,6 @@
 			</arguments>
 		</buildCommand>
 		<buildCommand>
-			<name>org.eclipse.m2e.core.maven2Builder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
 			<name>org.eclipse.pde.ManifestBuilder</name>
 			<arguments>
 			</arguments>
@@ -25,6 +20,11 @@
 			<arguments>
 			</arguments>
 		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
 	</buildSpec>
 	<natures>
 		<nature>org.eclipse.m2e.core.maven2Nature</nature>
diff --git a/org.eclipse.om2m.binding.http/src/main/java/org/eclipse/om2m/binding/http/RestHttpClient.java b/org.eclipse.om2m.binding.http/src/main/java/org/eclipse/om2m/binding/http/RestHttpClient.java
index 165151f..4062106 100644
--- a/org.eclipse.om2m.binding.http/src/main/java/org/eclipse/om2m/binding/http/RestHttpClient.java
+++ b/org.eclipse.om2m.binding.http/src/main/java/org/eclipse/om2m/binding/http/RestHttpClient.java
@@ -39,7 +39,7 @@
 import org.apache.http.conn.HttpHostConnectException;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.client.HttpClientBuilder;
 import org.eclipse.om2m.binding.http.constants.HttpHeaders;
 import org.eclipse.om2m.binding.http.constants.HttpParameters;
 import org.eclipse.om2m.binding.service.RestClientService;
@@ -79,11 +79,12 @@
 	 */
 	public ResponsePrimitive sendRequest(RequestPrimitive requestPrimitive) {
 		LOGGER.info("Sending request: " + requestPrimitive);
-		CloseableHttpClient httpClient = HttpClients.createDefault();
+		CloseableHttpClient httpClient = HttpClientBuilder.create()
+				.disableAutomaticRetries()
+				.build();
 		ResponsePrimitive responsePrimitive = new ResponsePrimitive(requestPrimitive);    	
 		HttpUriRequest method = null;
 		
-		
 		// Retrieve the url
 		String url = requestPrimitive.getTo();
 		if(!url.startsWith(protocol+"://")){
@@ -208,7 +209,6 @@
 				responsePrimitive.setLocation(contentHeader);
 			}
 			LOGGER.info("Http Client response: " + responsePrimitive);
-			httpClient.close();
 		} catch(HttpHostConnectException e){
 			LOGGER.info("Target is not reachable: " + requestPrimitive.getTo());
 			responsePrimitive.setResponseStatusCode(ResponseStatusCode.TARGET_NOT_REACHABLE);
@@ -217,7 +217,14 @@
 		} catch (IOException e){
 			LOGGER.error(url + " not found", e);
 			responsePrimitive.setResponseStatusCode(ResponseStatusCode.TARGET_NOT_REACHABLE);
-		} 
+		} finally {
+			try {
+				httpClient.close();
+			} catch (IOException e) {
+				// Silently fail
+				LOGGER.trace("Fail closing the http client", e);
+			}
+		}
 		return responsePrimitive;
 	}
 
diff --git a/org.eclipse.om2m.binding.mqtt/.classpath b/org.eclipse.om2m.binding.mqtt/.classpath
new file mode 100644
index 0000000..f7edce6
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/.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.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry exported="true" kind="lib" path="libs/org.eclipse.paho.client.mqttv3-1.0.2.jar"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.om2m.testsuite.flexcontainer/.project b/org.eclipse.om2m.binding.mqtt/.project
similarity index 93%
rename from org.eclipse.om2m.testsuite.flexcontainer/.project
rename to org.eclipse.om2m.binding.mqtt/.project
index a2c11cc..fed26a3 100644
--- a/org.eclipse.om2m.testsuite.flexcontainer/.project
+++ b/org.eclipse.om2m.binding.mqtt/.project
@@ -1,34 +1,34 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<projectDescription>

-	<name>org.eclipse.om2m.testsuite.flexcontaienr</name>

-	<comment></comment>

-	<projects>

-	</projects>

-	<buildSpec>

-		<buildCommand>

-			<name>org.eclipse.jdt.core.javabuilder</name>

-			<arguments>

-			</arguments>

-		</buildCommand>

-		<buildCommand>

-			<name>org.eclipse.pde.ManifestBuilder</name>

-			<arguments>

-			</arguments>

-		</buildCommand>

-		<buildCommand>

-			<name>org.eclipse.pde.SchemaBuilder</name>

-			<arguments>

-			</arguments>

-		</buildCommand>

-		<buildCommand>

-			<name>org.eclipse.m2e.core.maven2Builder</name>

-			<arguments>

-			</arguments>

-		</buildCommand>

-	</buildSpec>

-	<natures>

-		<nature>org.eclipse.m2e.core.maven2Nature</nature>

-		<nature>org.eclipse.pde.PluginNature</nature>

-		<nature>org.eclipse.jdt.core.javanature</nature>

-	</natures>

-</projectDescription>

+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.om2m.binding.mqtt</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.m2e.core.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.m2e.core.maven2Nature</nature>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.om2m.binding.mqtt/META-INF/MANIFEST.MF b/org.eclipse.om2m.binding.mqtt/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..a09741c
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: MQTT Binding
+Bundle-SymbolicName: org.eclipse.om2m.binding.mqtt
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.om2m.binding.mqtt.Activator
+Bundle-RequiredExecutionEnvironment: JavaSE-1.7
+Import-Package: org.apache.commons.logging,
+ org.eclipse.om2m.binding.service,
+ org.eclipse.om2m.commons.constants,
+ org.eclipse.om2m.commons.resource,
+ org.eclipse.om2m.core.service,
+ org.eclipse.om2m.datamapping.service,
+ org.osgi.framework;version="1.3.0",
+ org.osgi.util.tracker;version="1.5.1"
+Bundle-ActivationPolicy: lazy
+Bundle-ClassPath: libs/org.eclipse.paho.client.mqttv3-1.0.2.jar,
+ .
diff --git a/org.eclipse.om2m.binding.mqtt/README b/org.eclipse.om2m.binding.mqtt/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/README
diff --git a/org.eclipse.om2m.binding.mqtt/build.properties b/org.eclipse.om2m.binding.mqtt/build.properties
new file mode 100644
index 0000000..65cee24
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/build.properties
@@ -0,0 +1,4 @@
+source.. = src/main/java/
+bin.includes = META-INF/,\
+               .,\
+               libs/org.eclipse.paho.client.mqttv3-1.0.2.jar
diff --git a/org.eclipse.om2m.binding.mqtt/libs/org.eclipse.paho.client.mqttv3-1.0.2.jar b/org.eclipse.om2m.binding.mqtt/libs/org.eclipse.paho.client.mqttv3-1.0.2.jar
new file mode 100644
index 0000000..9a88162
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/libs/org.eclipse.paho.client.mqttv3-1.0.2.jar
Binary files differ
diff --git a/org.eclipse.om2m.binding.mqtt/pom.xml b/org.eclipse.om2m.binding.mqtt/pom.xml
new file mode 100644
index 0000000..46e30e6
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/pom.xml
@@ -0,0 +1,30 @@
+<!--
+     Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+     7 Colonel Roche 31077 Toulouse - France
+     
+     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
+     
+     Initial Contributors:
+         Thierry Monteil : Project manager, technical co-manager
+         Mahdi Ben Alaya : Technical co-manager
+         Samir Medjiah : Technical co-manager
+         Khalil Drira : Strategy expert
+         Guillaume Garzone : Developer
+         François Aïssaoui : Developer
+   
+      New contributors :
+ -->
+<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>
+	<artifactId>org.eclipse.om2m.binding.mqtt</artifactId>
+	<packaging>eclipse-plugin</packaging>
+	<parent>
+		<groupId>org.eclipse.om2m</groupId>
+		<artifactId>org.eclipse.om2m</artifactId>
+		<version>1.0.0-SNAPSHOT</version>
+	</parent>
+</project>
\ No newline at end of file
diff --git a/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/Activator.java b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/Activator.java
new file mode 100644
index 0000000..c8f126f
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/Activator.java
@@ -0,0 +1,170 @@
+/*******************************************************************************
+ *  Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ *  7 Colonel Roche 31077 Toulouse - France
+ *  
+ *  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
+ *  
+ *  Initial Contributors:
+ *      Thierry Monteil : Project manager, technical co-manager
+ *      Mahdi Ben Alaya : Technical co-manager
+ *      Samir Medjiah : Technical co-manager
+ *      Khalil Drira : Strategy expert
+ *      Guillaume Garzone : Developer
+ *      François Aïssaoui : Developer
+ *
+ *   New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.binding.mqtt;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.eclipse.om2m.binding.mqtt.util.DataMapperRegistry;
+import org.eclipse.om2m.binding.service.RestClientService;
+import org.eclipse.om2m.core.service.CseService;
+import org.eclipse.om2m.datamapping.service.DataMapperService;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.util.tracker.ServiceTrackerCustomizer;
+
+public class Activator implements BundleActivator {
+
+	private static BundleContext context;
+
+	static BundleContext getContext() {
+		return context;
+	}
+
+	private static final Log LOGGER = LogFactory.getLog(Activator.class);
+
+	/** {@link DataMapperServiceTracker} reference */
+	private static ServiceTracker<DataMapperService, DataMapperService> dataMapperServiceTracker;
+	/** {@link CseService} reference */
+	private static ServiceTracker<CseService, CseService> cseServiceTracker;
+
+	/** MQTT Request Handler that connects to the MQTT Broker */
+	private static MqttRequestHandler mqttRequestHandler;
+
+	public void start(BundleContext bundleContext) throws Exception {
+		Activator.context = bundleContext;
+		
+		// Listening on Cse Service
+		cseServiceTracker = new ServiceTracker<CseService, CseService>(
+				bundleContext, CseService.class,
+				new CseServiceTrackerCustomizer());
+		cseServiceTracker.open();
+
+		// Listening on DataMapper Service
+		dataMapperServiceTracker = new ServiceTracker<DataMapperService, DataMapperService>(
+				bundleContext, DataMapperService.class,
+				new DataMapperServiceTracker());
+		dataMapperServiceTracker.open();
+		
+		// Registering RestClientService of MQTT
+		getContext().registerService(RestClientService.class, new MqttRestClient(), null);
+	}
+
+	public void stop(BundleContext bundleContext) throws Exception {
+		Activator.context = null;
+		if (cseServiceTracker != null) {
+			cseServiceTracker.close();
+			cseServiceTracker = null;
+		}
+		if (dataMapperServiceTracker != null) {
+			dataMapperServiceTracker.close();
+			dataMapperServiceTracker = null;
+		}
+		if (mqttRequestHandler != null){
+			mqttRequestHandler.close();
+			mqttRequestHandler = null;
+		}
+	}
+
+	private static class CseServiceTrackerCustomizer implements
+			ServiceTrackerCustomizer<CseService, CseService> {
+
+		@Override
+		public CseService addingService(ServiceReference<CseService> reference) {
+			if (reference == null) {
+				return null;
+			}
+			Object service = Activator.getContext().getService(reference);
+			if (service != null && service instanceof CseService) {
+				LOGGER.debug("New CseService discovered");
+				CseService cse = (CseService) service;
+				MqttRequestHandler.setCseService(cse);
+				if (mqttRequestHandler == null) {
+					new Thread() {
+						public void run() {
+							LOGGER.info("Creating MQTT Request Handler");
+							mqttRequestHandler = new MqttRequestHandler();
+						};
+					}.start();
+				}
+				return cse;
+			}
+			return null;
+		}
+
+		@Override
+		public void modifiedService(ServiceReference<CseService> reference,
+				CseService service) {
+			if (service != null) {
+				LOGGER.info("CseService modified");
+				MqttRequestHandler.setCseService(service);
+			}
+		}
+
+		@Override
+		public void removedService(ServiceReference<CseService> reference,
+				CseService service) {
+			MqttRequestHandler.setCseService(null);
+		}
+
+	}
+
+	private static class DataMapperServiceTracker implements
+			ServiceTrackerCustomizer<DataMapperService, DataMapperService> {
+
+		@Override
+		public DataMapperService addingService(
+				ServiceReference<DataMapperService> reference) {
+			if (reference == null) {
+				return null;
+			}
+			Object service = Activator.getContext().getService(reference);
+			if (service != null && service instanceof DataMapperService) {
+				DataMapperService dms = (DataMapperService) service;
+				LOGGER.debug("New DataMapper Service discovered: "
+						+ dms.getServiceDataType());
+				DataMapperRegistry.register(dms);
+				return dms;
+			}
+			return null;
+		}
+
+		@Override
+		public void modifiedService(
+				ServiceReference<DataMapperService> reference,
+				DataMapperService service) {
+			if (service != null) {
+				DataMapperRegistry.register(service);
+			}
+		}
+
+		@Override
+		public void removedService(
+				ServiceReference<DataMapperService> reference,
+				DataMapperService service) {
+			if (service != null) {
+				DataMapperRegistry.remove(service);
+			}
+		}
+
+	}
+
+}
diff --git a/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/MqttRequestHandler.java b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/MqttRequestHandler.java
new file mode 100644
index 0000000..779e4de
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/MqttRequestHandler.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ *  Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ *  7 Colonel Roche 31077 Toulouse - France
+ *  
+ *  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
+ *  
+ *  Initial Contributors:
+ *      Thierry Monteil : Project manager, technical co-manager
+ *      Mahdi Ben Alaya : Technical co-manager
+ *      Samir Medjiah : Technical co-manager
+ *      Khalil Drira : Strategy expert
+ *      Guillaume Garzone : Developer
+ *      François Aïssaoui : Developer
+ *
+ *   New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.binding.mqtt;
+
+import java.math.BigInteger;
+import java.util.regex.Matcher;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.eclipse.om2m.binding.mqtt.util.DataMapperRegistry;
+import org.eclipse.om2m.binding.mqtt.util.MqttConstants;
+import org.eclipse.om2m.binding.mqtt.util.QueueSender;
+import org.eclipse.om2m.commons.constants.Constants;
+import org.eclipse.om2m.commons.constants.MimeMediaType;
+import org.eclipse.om2m.commons.constants.ResponseStatusCode;
+import org.eclipse.om2m.commons.resource.PrimitiveContent;
+import org.eclipse.om2m.commons.resource.RequestPrimitive;
+import org.eclipse.om2m.commons.resource.ResponsePrimitive;
+import org.eclipse.om2m.core.service.CseService;
+import org.eclipse.om2m.datamapping.service.DataMapperService;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+
+/**
+ * MQTT Request Handler class that subscribe to oneM2M request topic.
+ * When a request is received in the request topic, it is de-serialized and send
+ * to the CseService implementation available. Then the response from the service
+ * is serialized and sent to the oneM2M response topic.
+ */
+public class MqttRequestHandler implements MqttCallback {
+
+	// Static attributes of the class 
+	
+	/** MQTT Client ID */
+	private static final String CLIENT_ID = Constants.CSE_ID;
+	/** Logger reference */
+	private static final Log LOGGER = LogFactory.getLog(MqttRequestHandler.class);
+	/** MQTT Request Topic */
+	private static final String REQUEST_TOPIC = "/oneM2M/req/+/" + Constants.CSE_ID + "/+";
+	
+
+	/** Reference to the current cseService implementation*/
+	private static CseService cseService;
+
+	/**
+	 * Set the current CseService used when a request is 
+	 * received on the oneM2M request topic.
+	 * @param cse the CseService implementation to use
+	 */
+	public static void setCseService(CseService cse) {
+		cseService = cse;
+	}
+
+	// Private attributes
+	
+	/** MQTT Client from the Paho library */
+	private MqttClient mainMqttClient;
+
+	/** The MQTT connection options to use */
+	private MqttConnectOptions connOpts;
+	
+	/** Tell the thread to keep retrying or not */
+	private boolean retry = true;
+	/** Connection retry thread */
+	private Thread retryThread;
+	
+	/**
+	 * Default constructor of the Request Handler
+	 */
+	public MqttRequestHandler() {
+		MemoryPersistence persistence = new MemoryPersistence();
+		String url = "tcp://" + MqttConstants.MQTT_BROKER_HOSTNAME + ":"
+				+ MqttConstants.MQTT_BROKER_PORT;
+		this.connOpts = new MqttConnectOptions();
+		connOpts.setCleanSession(true);
+		if(MqttConstants.MQTT_BROKER_USERNAME != null && MqttConstants.MQTT_BROKER_PASSWORD != null){
+			connOpts.setUserName(MqttConstants.MQTT_BROKER_USERNAME);
+			connOpts.setPassword(MqttConstants.MQTT_BROKER_PASSWORD.toCharArray());
+		}
+		try {
+			LOGGER.debug("Connecting MQTT client to: " + url);
+			this.mainMqttClient = new MqttClient(url, CLIENT_ID, persistence);
+			this.mainMqttClient.setCallback(MqttRequestHandler.this);
+			this.connect(this.connOpts);
+		} catch (MqttException e) {
+			LOGGER.error("Error in MQTT Client creation", e);
+		}
+	}
+	
+	/**
+	 * Connect and retry if the connection fails
+	 * @param connOpts
+	 */
+	private void connect(final MqttConnectOptions connOpts){
+		if(retry && retryThread == null){
+			retryThread = new Thread("mqtt-connection-retrier"){
+				public void run() {
+					while(retry && !MqttRequestHandler.this.mainMqttClient.isConnected()){
+						try {
+							MqttRequestHandler.this.mainMqttClient.connect(connOpts);
+							
+							LOGGER.info("Subscribing on MQTT topic: " + REQUEST_TOPIC);
+							MqttRequestHandler.this.mainMqttClient.subscribe(REQUEST_TOPIC, 2);
+						} catch (MqttException e) {
+							LOGGER.warn("Cannot connect to MQTT Broker, retrying in 10s. Cause: " + e.getMessage());
+						}
+						if(!MqttRequestHandler.this.mainMqttClient.isConnected()){
+							try {
+								Thread.sleep(10000);
+							} catch (InterruptedException e) {
+								// Ignore
+							}
+						}
+					}
+					MqttRequestHandler.this.retryThread = null;
+				};
+			};
+		}
+		retryThread.start();
+	}
+
+	@Override
+	public void connectionLost(Throwable throwable) {
+		LOGGER.warn("Connection lost on MQTT Broker at " + MqttConstants.MQTT_BROKER_HOSTNAME + ":" + MqttConstants.MQTT_BROKER_PORT);
+		this.connect(this.connOpts);
+	}
+
+	@Override
+	public void deliveryComplete(IMqttDeliveryToken token) {
+		// Empty
+	}
+
+	@Override
+	public void messageArrived(String topic, MqttMessage message)
+			throws Exception {
+		Matcher matcher = MqttConstants.REQUEST_PATTERN_IN.matcher(topic);
+		if (matcher.matches()) {
+			String aeId = matcher.group(1);
+			String format = matcher.group(2);
+			String responseTopic = "/oneM2M/resp/" + Constants.CSE_ID + "/" + aeId + "/" + format;
+			
+			if (message.getPayload() == null) {
+				LOGGER.info("Null message received on " + topic);
+				sendErrorResponse("The message is null", responseTopic, aeId, format);
+				return;
+			}
+			String payload = new String(message.getPayload());
+			LOGGER.debug("(" + topic + ") Message received (qos: " + message.getQos() + "):\n" + payload);
+			DataMapperService dms = DataMapperRegistry.getFromMqttFormat(format);
+
+			if (dms == null) {
+				LOGGER.warn("MQTT Request received with unhandled content type: " + format);
+				sendErrorResponse("The format type is not handled", 
+						responseTopic.replace("/" + format, "/" + MqttConstants.MQTT_XML), 
+						aeId, MqttConstants.MQTT_XML);
+				return;
+			}
+			Object objectPayload = dms.stringToObj(payload);
+			if(objectPayload == null || !(objectPayload instanceof RequestPrimitive)){
+				LOGGER.info("Invalid content provided in MQTT request");
+				sendErrorResponse("Invalid content provided in request primitive", responseTopic, aeId, format);
+				return;
+			}
+			RequestPrimitive requestPrimitive = (RequestPrimitive) objectPayload;
+			requestPrimitive.setRequestContentType(MimeMediaType.OBJ);
+			requestPrimitive.setReturnContentType(MimeMediaType.OBJ);
+			// Primitive content handling
+			if(requestPrimitive.getPrimitiveContent() != null && 
+					!requestPrimitive.getPrimitiveContent().getAny().isEmpty() && 
+					requestPrimitive.getContent() == null){
+				requestPrimitive.setContent(requestPrimitive.getPrimitiveContent().getAny().get(0));
+			}
+			
+			ResponsePrimitive responsePrimitive = null;
+			
+			if(cseService != null){
+				// Sending the request to the CSE
+				responsePrimitive = cseService.doRequest(requestPrimitive);
+				
+				// Handling the custom "content" field and map it to PrimitiveContent for serialization
+				if(responsePrimitive.getContent() != null && 
+						responsePrimitive.getPrimitiveContent() == null){
+					PrimitiveContent pc = new PrimitiveContent();
+					pc.getAny().add(responsePrimitive.getContent());
+					responsePrimitive.setPrimitiveContent(pc);
+				}
+				
+				// Building and sending response
+				final String responsePayload = dms.objToString(responsePrimitive);
+				LOGGER.debug("Response to be sent on topic: " + responseTopic + ". Payload:\n" + responsePayload);
+				
+				// Sending the request in another thread otherwise it blocks the reception thread of Paho
+				QueueSender.queue(mainMqttClient, responseTopic, responsePayload.getBytes());
+			} else {
+				sendErrorResponse("/" + Constants.CSE_ID + " is not available", responseTopic, aeId, format, ResponseStatusCode.SERVICE_UNAVAILABLE);
+			}
+
+		} else {
+			LOGGER.debug("The topic is not well formed. (" + topic + ")");
+		}
+	}
+	
+	/**
+	 * Util method that send an error message to the client
+	 * @param message the message to send
+	 * @param responseTopic the response topic to reply on
+	 * @param aeId the id of the client
+	 * @param format the format of exchange
+	 */
+	private void sendErrorResponse(String message, String responseTopic,
+			String aeId, String format, BigInteger responseStatusCode) {
+		ResponsePrimitive responsePrimitive = new ResponsePrimitive();
+		responsePrimitive.setTo(aeId);
+		responsePrimitive.setFrom("/" + Constants.CSE_ID);
+		responsePrimitive.setResponseStatusCode(responseStatusCode);
+		responsePrimitive.setPrimitiveContent(new PrimitiveContent());
+		responsePrimitive.getPrimitiveContent().getAny().add(message);
+		DataMapperService dms = DataMapperRegistry.getFromMqttFormat(format);
+		byte[] errorPayload = dms.objToString(responsePrimitive).getBytes();
+		QueueSender.queue(mainMqttClient, responseTopic, errorPayload);
+	}
+	
+	/**
+	 * Send a bad request response to the client 
+	 * @param message the message
+	 * @param responseTopic the response topic
+	 * @param aeId the id of the client
+	 * @param format the format of exchange
+	 */
+	private void sendErrorResponse(String message, String responseTopic,
+			String aeId, String format){
+		sendErrorResponse(message, responseTopic, aeId, format, ResponseStatusCode.BAD_REQUEST);
+	}
+
+	/**
+	 * Disconnecting and closing the MQTT Client.
+	 */
+	public void close(){
+		// Disconnect the MQTT Client
+		try {
+			this.mainMqttClient.disconnect();
+		} catch (MqttException e) {
+			LOGGER.debug("Error disconnecting the MQTT Client", e);
+		}
+		// Prevent on any reconnection retry
+		retry = false;
+		// Wake up the retry thread after the false on "retry" has been set
+		if(retryThread != null && retryThread.isAlive()){
+			retryThread.interrupt();
+		}
+	}
+}
diff --git a/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/MqttRestClient.java b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/MqttRestClient.java
new file mode 100644
index 0000000..95ba01c
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/MqttRestClient.java
@@ -0,0 +1,174 @@
+/*******************************************************************************
+ *  Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ *  7 Colonel Roche 31077 Toulouse - France
+ *  
+ *  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
+ *  
+ *  Initial Contributors:
+ *      Thierry Monteil : Project manager, technical co-manager
+ *      Mahdi Ben Alaya : Technical co-manager
+ *      Samir Medjiah : Technical co-manager
+ *      Khalil Drira : Strategy expert
+ *      Guillaume Garzone : Developer
+ *      François Aïssaoui : Developer
+ *
+ *   New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.binding.mqtt;
+
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.eclipse.om2m.binding.mqtt.util.DataMapperRegistry;
+import org.eclipse.om2m.binding.mqtt.util.MqttConstants;
+import org.eclipse.om2m.binding.mqtt.util.QueueSender;
+import org.eclipse.om2m.binding.mqtt.util.ResponseRegistry;
+import org.eclipse.om2m.binding.mqtt.util.ResponseSemaphore;
+import org.eclipse.om2m.binding.service.RestClientService;
+import org.eclipse.om2m.commons.constants.Constants;
+import org.eclipse.om2m.commons.constants.MimeMediaType;
+import org.eclipse.om2m.commons.constants.ResponseStatusCode;
+import org.eclipse.om2m.commons.resource.PrimitiveContent;
+import org.eclipse.om2m.commons.resource.RequestPrimitive;
+import org.eclipse.om2m.commons.resource.ResponsePrimitive;
+import org.eclipse.om2m.datamapping.service.DataMapperService;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
+
+public class MqttRestClient implements RestClientService {
+	
+	private static final Log LOGGER = LogFactory.getLog(MqttRestClient.class);
+	
+	@Override
+	public ResponsePrimitive sendRequest(RequestPrimitive requestPrimitive) {
+		if(requestPrimitive.getContent() != null){
+			PrimitiveContent pc = new PrimitiveContent();
+			switch(requestPrimitive.getRequestContentType()){
+			case MimeMediaType.XML:
+				pc.getAny().add(DataMapperRegistry.get(MimeMediaType.XML).stringToObj((String)requestPrimitive.getContent()));
+				break;
+			case MimeMediaType.JSON:
+				pc.getAny().add(DataMapperRegistry.get(MimeMediaType.JSON).stringToObj((String)requestPrimitive.getContent()));
+				break;
+			case MimeMediaType.OBJ: case MimeMediaType.TEXT_PLAIN:
+				pc.getAny().add(requestPrimitive.getContent());
+				break;
+			default:
+				break;
+			}
+			if(!pc.getAny().isEmpty()){
+				requestPrimitive.setPrimitiveContent(pc);
+			}
+		}
+		
+		ResponsePrimitive responsePrimitive = new ResponsePrimitive(requestPrimitive);
+
+		if(requestPrimitive.getMqttTopic() == null || requestPrimitive.getMqttUri() == null){
+			responsePrimitive.setResponseStatusCode(ResponseStatusCode.BAD_REQUEST);
+			return responsePrimitive;
+		}
+		
+		if(requestPrimitive.getRequestIdentifier() == null){
+			requestPrimitive.setRequestIdentifier(UUID.randomUUID().toString());
+		}
+		
+		String uri = requestPrimitive.getMqttUri();
+		if(uri.startsWith("mqtt://")){
+			uri = uri.replaceFirst("mqtt://", "tcp://");
+		}
+		
+		if(requestPrimitive.getTo().startsWith("mqtt://")){
+			Pattern mqttUriPatter = Pattern.compile("(mqtt://[^:/]*(:[0-9]{1,5})?)(/.*)");
+			Matcher matcher = mqttUriPatter.matcher(requestPrimitive.getTo());
+			if(matcher.matches()){
+				requestPrimitive.setTo(matcher.group(3));
+			}
+		}
+		
+		String topic = requestPrimitive.getMqttTopic();
+		String payload = null;
+		String format = null;
+		if (topic.endsWith("/json")){
+			payload = DataMapperRegistry.get(MimeMediaType.JSON).objToString(requestPrimitive);
+			format = "json";
+		} else {
+			// Case of XML and default
+			payload = DataMapperRegistry.get(MimeMediaType.XML).objToString(requestPrimitive);
+			format = "xml";
+		}
+		
+		try {
+			MqttClient mqttClient = new MqttClient(uri, requestPrimitive.getRequestIdentifier(), new MemoryPersistence());
+			mqttClient.connect();
+			LOGGER.debug("Sending request on topic: " + topic + " with payload:\n" + payload);
+			ResponseSemaphore responseSemaphore = null;
+			if(requestPrimitive.isMqttResponseExpected()){
+				Matcher matcher = MqttConstants.REQUEST_PATTERN_OUT.matcher(topic);
+				if(matcher.matches()){
+					String responseTopic = "/oneM2M/resp/" + matcher.group(1) + "/"+ Constants.CSE_ID + "/" + format; 
+					responseSemaphore = ResponseRegistry.createSemaphore(requestPrimitive.getRequestIdentifier(), mqttClient, responseTopic);
+				} else {					
+					responsePrimitive.setResponseStatusCode(ResponseStatusCode.TARGET_NOT_REACHABLE);
+				}
+			} else {
+				mqttClient.publish(topic, new MqttMessage(payload.getBytes()));
+				responsePrimitive.setResponseStatusCode(ResponseStatusCode.OK);
+			} 
+			if(responseSemaphore != null){
+				QueueSender.queue(mqttClient, topic, payload.getBytes());
+				LOGGER.debug("Waiting for response... (" + MqttConstants.TIME_OUT_DURATION + "s)");
+				boolean released = responseSemaphore.getSemaphore().tryAcquire(1, MqttConstants.TIME_OUT_DURATION, TimeUnit.SECONDS);
+				if(released){
+					responsePrimitive = responseSemaphore.getResponsePrimitive();
+					fillAndConvertContent(requestPrimitive, responsePrimitive);
+					LOGGER.debug("Response received: " + responsePrimitive);
+				} else {
+					responsePrimitive.setResponseStatusCode(ResponseStatusCode.TARGET_NOT_REACHABLE);
+				}
+			}
+			mqttClient.disconnect();
+			mqttClient.close();
+		} catch (MqttException e) {
+			LOGGER.warn("Cannot connect to: " + requestPrimitive.getMqttUri());
+			responsePrimitive.setResponseStatusCode(ResponseStatusCode.TARGET_NOT_REACHABLE);
+			return responsePrimitive;
+		} catch (InterruptedException e) {
+			LOGGER.error("Interrupted exception caught in MqttRestClient: " + e.getMessage());
+			responsePrimitive.setResponseStatusCode(ResponseStatusCode.TARGET_NOT_REACHABLE);
+			return responsePrimitive;
+		}
+		
+		return responsePrimitive;
+	}
+
+	private void fillAndConvertContent(RequestPrimitive requestPrimitive,
+			ResponsePrimitive responsePrimitive) {
+		if(responsePrimitive.getPrimitiveContent() != null && 
+				!responsePrimitive.getPrimitiveContent().getAny().isEmpty() && 
+				responsePrimitive.getContent() == null){
+			if(requestPrimitive.getReturnContentType().equals(MimeMediaType.OBJ)){
+				responsePrimitive.setContent(responsePrimitive.getPrimitiveContent().getAny().get(0));				
+			} else {
+				DataMapperService dms = DataMapperRegistry.get(requestPrimitive.getReturnContentType()); 
+				String content = dms.objToString(responsePrimitive.getPrimitiveContent().getAny().get(0));
+				responsePrimitive.setContent(content);
+				responsePrimitive.setContentType(requestPrimitive.getReturnContentType());
+			}
+		}
+	}
+
+	@Override
+	public String getProtocol() {
+		return MqttConstants.PROTOCOL;
+	}	
+	
+}
diff --git a/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/DataMapperRegistry.java b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/DataMapperRegistry.java
new file mode 100644
index 0000000..d4e4741
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/DataMapperRegistry.java
@@ -0,0 +1,94 @@
+/*******************************************************************************
+ *  Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ *  7 Colonel Roche 31077 Toulouse - France
+ *  
+ *  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
+ *  
+ *  Initial Contributors:
+ *      Thierry Monteil : Project manager, technical co-manager
+ *      Mahdi Ben Alaya : Technical co-manager
+ *      Samir Medjiah : Technical co-manager
+ *      Khalil Drira : Strategy expert
+ *      Guillaume Garzone : Developer
+ *      François Aïssaoui : Developer
+ *
+ *   New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.binding.mqtt.util;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.om2m.commons.constants.MimeMediaType;
+import org.eclipse.om2m.datamapping.service.DataMapperService;
+
+/**
+ * This class is used to store instances of {@link DataMapperService} classes.
+ *
+ */
+public class DataMapperRegistry {
+
+	/** Private constructor to avoid creation */
+	private DataMapperRegistry(){}
+	
+	/**
+	 * Service registry classified by data type handled.
+	 */
+	private static Map<String, DataMapperService> serviceRegistery = new HashMap<String, DataMapperService>();
+
+	/**
+	 * Add a new {@link DataMapperService} to the registery.
+	 * @param dms the service to register
+	 */
+	public static void register(DataMapperService dms){
+		if(dms != null && dms.getServiceDataType() != null){
+			serviceRegistery.put(dms.getServiceDataType(), dms);
+		}
+	}
+
+	/**
+	 * Retrieve a {@link DataMapperService} from a data type.
+	 * @param dataType the 
+	 * @return the {@link DataMapperService} that handle the data type or null if none
+	 */
+	public static DataMapperService get(String dataType){
+		return serviceRegistery.get(dataType);
+	}
+	
+	/**
+	 * Remove the {@link DataMapperService} from the registry
+	 * @param dataType the data type of the service to remove
+	 */
+	public static void remove(String dataType){
+		serviceRegistery.remove(dataType);
+	}
+	
+	/**
+	 * Remove the {@link DataMapperService} from the registry
+	 * @param dms the service to remove from the registry
+	 */
+	public static void remove(DataMapperService dms){
+		remove(dms.getServiceDataType());
+	}
+	
+	/**
+	 * Retrieve the {@link DataMapperService} from the registry 
+	 * from the MQTT format String
+	 * @param format the format of the DMS
+	 * @return the DMS with the specified format or null
+	 */
+	public static DataMapperService getFromMqttFormat(String format){
+		switch (format) {
+		case "xml":
+			return DataMapperRegistry.get(MimeMediaType.XML);
+		case "json":
+			return DataMapperRegistry.get(MimeMediaType.JSON);
+		default:
+			return null;
+		}
+	}
+	
+}
diff --git a/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/MqttConstants.java b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/MqttConstants.java
new file mode 100644
index 0000000..5f0f546
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/MqttConstants.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ *  Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ *  7 Colonel Roche 31077 Toulouse - France
+ *  
+ *  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
+ *  
+ *  Initial Contributors:
+ *      Thierry Monteil : Project manager, technical co-manager
+ *      Mahdi Ben Alaya : Technical co-manager
+ *      Samir Medjiah : Technical co-manager
+ *      Khalil Drira : Strategy expert
+ *      Guillaume Garzone : Developer
+ *      François Aïssaoui : Developer
+ *
+ *   New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.binding.mqtt.util;
+
+import java.util.regex.Pattern;
+
+import org.eclipse.om2m.commons.constants.Constants;
+
+/**
+ * A set of MQTT constants retrieved from the System.getProperty method.
+ *
+ */
+public final class MqttConstants {
+	
+	private MqttConstants(){}
+
+	/** Hostname of the main broker */
+	public static final String MQTT_BROKER_HOSTNAME = System.getProperty("org.eclipse.om2m.mqtt.ip", "127.0.0.1");
+	
+	/** IP of the main broker */
+	public static final int MQTT_BROKER_PORT = Integer.valueOf(System.getProperty("org.eclipse.om2m.mqtt.port", "1883"));
+	
+	/** Username to connect to broker */
+	public static final String MQTT_BROKER_USERNAME = System.getProperty("org.eclipse.om2m.mqtt.username");
+	
+	/** Password to connect to broker */
+	public static final String MQTT_BROKER_PASSWORD = System.getProperty("org.eclipse.om2m.mqtt.password");
+	
+	/** MQTT Protocol prefix */
+	public static final String PROTOCOL = "mqtt";
+	
+	/** Size of the request sender queue */
+	public static final int MQTT_QUEUE_SENDER_SIZE = Integer.valueOf(System.getProperty("org.eclipse.om2m.mqtt.queue.size", "8"));
+	
+	/** Request pattern to parse the request topic on message reception */
+	public static final Pattern REQUEST_PATTERN_IN = Pattern.compile("/oneM2M/req/([^/]+)/" + Constants.CSE_ID + "/(.*)");
+	
+	/** Request pattern when sending a message. */
+	public static final Pattern REQUEST_PATTERN_OUT = Pattern.compile("/oneM2M/req/" + Constants.CSE_ID+ "/([^/]+)+/(.*)");
+	
+	/** Time out duration when waiting for a response. Unit in second. */ 
+	public static final long TIME_OUT_DURATION = Long.valueOf(System.getProperty("org.eclipse.om2m.mqtt.timeout", "20"));
+	
+	/** MQTT format for XML in topic */
+	public static final String MQTT_XML = "xml";
+	
+	/** MQTT format for JSON in topic */
+	public static final String MQTT_JSON = "json";
+	
+}
diff --git a/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/QueueSender.java b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/QueueSender.java
new file mode 100644
index 0000000..d6db359
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/QueueSender.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ *  Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ *  7 Colonel Roche 31077 Toulouse - France
+ *  
+ *  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
+ *  
+ *  Initial Contributors:
+ *      Thierry Monteil : Project manager, technical co-manager
+ *      Mahdi Ben Alaya : Technical co-manager
+ *      Samir Medjiah : Technical co-manager
+ *      Khalil Drira : Strategy expert
+ *      Guillaume Garzone : Developer
+ *      François Aïssaoui : Developer
+ *
+ *   New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.binding.mqtt.util;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.SynchronousQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttException;
+
+public final class QueueSender {
+	
+	private static final Log LOGGER = LogFactory.getLog(QueueSender.class);
+	private static ExecutorService threadPool;
+
+	static {
+		int queueSize = MqttConstants.MQTT_QUEUE_SENDER_SIZE <= 2 ? 2
+				: MqttConstants.MQTT_QUEUE_SENDER_SIZE;
+		threadPool = new ThreadPoolExecutor(2, queueSize, 1, TimeUnit.MINUTES,
+				new SynchronousQueue<Runnable>());
+	}
+
+	public static void queue(MqttClient mqttClient, String topic, byte[] payload){
+		LOGGER.debug("Sending MQTT message to " + mqttClient.getServerURI() + " topic: " + topic);
+		threadPool.execute(new MqttSender(mqttClient, topic, payload));
+	}
+	
+	private static class MqttSender implements Runnable {
+
+		private MqttClient mqttClient;
+		private String topic;
+		private byte[] payload;
+
+		public MqttSender(MqttClient mqttClient, String topic, byte[] payload) {
+			super();
+			this.mqttClient = mqttClient;
+			this.topic = topic;
+			this.payload = payload;
+		}
+
+		@Override
+		public void run() {
+			try {
+				this.mqttClient.publish(topic, payload, 1, false);
+			} catch (MqttException e) {
+				LOGGER.warn("Error publishing on topic: " + this.topic
+						+ " of broker " + this.mqttClient.getServerURI()
+						+ ". Error: " + e.getMessage());
+			}
+		}
+
+	}
+	
+	private QueueSender(){
+		// Empty and private constructor to avoid class creation
+	}
+
+}
diff --git a/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/ResponseRegistry.java b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/ResponseRegistry.java
new file mode 100644
index 0000000..b77bf73
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/ResponseRegistry.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ *  Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ *  7 Colonel Roche 31077 Toulouse - France
+ *  
+ *  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
+ *  
+ *  Initial Contributors:
+ *      Thierry Monteil : Project manager, technical co-manager
+ *      Mahdi Ben Alaya : Technical co-manager
+ *      Samir Medjiah : Technical co-manager
+ *      Khalil Drira : Strategy expert
+ *      Guillaume Garzone : Developer
+ *      François Aïssaoui : Developer
+ *
+ *   New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.binding.mqtt.util;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.Semaphore;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.eclipse.om2m.commons.constants.Constants;
+import org.eclipse.om2m.commons.constants.MimeMediaType;
+import org.eclipse.om2m.commons.resource.ResponsePrimitive;
+import org.eclipse.om2m.datamapping.service.DataMapperService;
+import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
+import org.eclipse.paho.client.mqttv3.MqttCallback;
+import org.eclipse.paho.client.mqttv3.MqttClient;
+import org.eclipse.paho.client.mqttv3.MqttException;
+import org.eclipse.paho.client.mqttv3.MqttMessage;
+
+public final class ResponseRegistry {
+
+	private ResponseRegistry() {
+		// Empty and private constructor to avoid instantiation of this class
+	}
+	
+	private static final Map<String, ResponseSemaphore> responseMap = new HashMap<String, ResponseSemaphore>();
+
+	public static ResponseSemaphore createSemaphore(String requestIdentifier, MqttClient mqttClient, 
+			String responseTopic) throws MqttException{
+		synchronized (responseMap) {
+			mqttClient.setCallback(new ResponseCallback());
+			mqttClient.subscribe(responseTopic, 1);
+			if(!responseMap.containsKey(requestIdentifier)){
+				ResponseSemaphore respSemaphore = new ResponseSemaphore(new Semaphore(0));
+				responseMap.put(requestIdentifier, respSemaphore);
+				return respSemaphore;
+			}
+			return null;
+		}
+	}
+	
+	private static void responseReceived(ResponsePrimitive responsePrimitive){
+		synchronized (responseMap) {
+			if(responseMap.containsKey(responsePrimitive.getRequestIdentifier())){
+				ResponseSemaphore responseSemanphore = responseMap.get(responsePrimitive.getRequestIdentifier());
+				responseSemanphore.setResponsePrimitive(responsePrimitive);
+				responseSemanphore.getSemaphore().release();
+				responseMap.remove(responsePrimitive.getRequestIdentifier());
+			}			
+		}
+	}
+	
+	private static class ResponseCallback implements MqttCallback {
+
+		private static Pattern responsePattern = Pattern.compile("/oneM2M/resp/([^/]+)/" + Constants.CSE_ID + "/(.*)");
+
+		@Override
+		public void connectionLost(Throwable cause) {
+			// Ignore
+		}
+
+		@Override
+		public void deliveryComplete(IMqttDeliveryToken token) {
+			// Ignore
+		}
+
+		@Override
+		public void messageArrived(String topic, MqttMessage message)
+				throws Exception {
+			Matcher matcher = responsePattern.matcher(topic);
+			if(!matcher.matches()){
+				return;
+			}
+			String format = matcher.group(2);
+			DataMapperService dms = null;
+			switch (format) {
+			case "xml":
+				dms = DataMapperRegistry.get(MimeMediaType.XML);
+				break;
+			case "json":
+				dms = DataMapperRegistry.get(MimeMediaType.JSON);
+				break;
+			default:
+				break;
+			}
+			if(dms == null){
+				// The format is not handled here
+				return;
+			}
+			String payload = new String(message.getPayload());
+			ResponsePrimitive resp = (ResponsePrimitive) dms.stringToObj(payload);
+			if(resp == null || resp.getRequestIdentifier() == null){
+				return;
+			}
+			responseReceived(resp);
+		}
+		
+	}
+	
+}
diff --git a/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/ResponseSemaphore.java b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/ResponseSemaphore.java
new file mode 100644
index 0000000..037c336
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/ResponseSemaphore.java
@@ -0,0 +1,51 @@
+/*******************************************************************************

+ *  Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)

+ *  7 Colonel Roche 31077 Toulouse - France

+ *  

+ *  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

+ *  

+ *  Initial Contributors:

+ *      Thierry Monteil : Project manager, technical co-manager

+ *      Mahdi Ben Alaya : Technical co-manager

+ *      Samir Medjiah : Technical co-manager

+ *      Khalil Drira : Strategy expert

+ *      Guillaume Garzone : Developer

+ *      François Aïssaoui : Developer

+ *

+ *   New contributors :

+ *******************************************************************************/

+package org.eclipse.om2m.binding.mqtt.util;

+

+import java.util.concurrent.Semaphore;

+

+import org.eclipse.om2m.commons.resource.ResponsePrimitive;

+

+public class ResponseSemaphore {

+

+	private Semaphore semaphore;

+	private ResponsePrimitive responsePrimitive;

+

+	public ResponseSemaphore(Semaphore semaphore) {

+		this.semaphore = semaphore;

+	}

+

+	public Semaphore getSemaphore() {

+		return semaphore;

+	}

+

+	public void setSemaphore(Semaphore semaphore) {

+		this.semaphore = semaphore;

+	}

+

+	public ResponsePrimitive getResponsePrimitive() {

+		return responsePrimitive;

+	}

+

+	public void setResponsePrimitive(ResponsePrimitive responsePrimitive) {

+		this.responsePrimitive = responsePrimitive;

+	}

+

+}

diff --git a/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/Utils.java b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/Utils.java
new file mode 100644
index 0000000..56766fd
--- /dev/null
+++ b/org.eclipse.om2m.binding.mqtt/src/main/java/org/eclipse/om2m/binding/mqtt/util/Utils.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ *  Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ *  7 Colonel Roche 31077 Toulouse - France
+ *  
+ *  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
+ *  
+ *  Initial Contributors:
+ *      Thierry Monteil : Project manager, technical co-manager
+ *      Mahdi Ben Alaya : Technical co-manager
+ *      Samir Medjiah : Technical co-manager
+ *      Khalil Drira : Strategy expert
+ *      Guillaume Garzone : Developer
+ *      François Aïssaoui : Developer
+ *
+ *   New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.binding.mqtt.util;
+
+import org.eclipse.om2m.commons.resource.ResponsePrimitive;
+
+public final class Utils {
+
+	public static void fillPrimitiveContent(){
+		
+	}
+	
+	public static void fillContent(ResponsePrimitive requestPrimitive){
+		if(requestPrimitive.getPrimitiveContent() != null && 
+				!requestPrimitive.getPrimitiveContent().getAny().isEmpty() && 
+				requestPrimitive.getContent() == null){
+			requestPrimitive.setContent(requestPrimitive.getPrimitiveContent().getAny().get(0));
+		}
+	}
+	
+}
diff --git a/org.eclipse.om2m.commons/.classpath b/org.eclipse.om2m.commons/.classpath
index 851b630..848ca71 100644
--- a/org.eclipse.om2m.commons/.classpath
+++ b/org.eclipse.om2m.commons/.classpath
@@ -1,8 +1,8 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<classpath>

-	<classpathentry exported="true" kind="lib" path="libs/javax.persistence.jar"/>

-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>

-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

-	<classpathentry kind="src" path="src/main/java"/>

-	<classpathentry kind="output" path="target/classes"/>

-</classpath>

+<?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.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/java"/>
+	<classpathentry exported="true" kind="lib" path="libs/javax.persistence.jar"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/Constants.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/Constants.java
index 183c960..8f0d5f9 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/Constants.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/Constants.java
@@ -1,97 +1,100 @@
-/*******************************************************************************

- * Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)

- * 7 Colonel Roche 31077 Toulouse - France

- *

- * 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

- *

- * Initial Contributors:

- *     Thierry Monteil : Project manager, technical co-manager

- *     Mahdi Ben Alaya : Technical co-manager

- *     Samir Medjiah : Technical co-manager

- *     Khalil Drira : Strategy expert

- *     Guillaume Garzone : Developer

- *     François Aïssaoui : Developer

- *

- * New contributors :

- *******************************************************************************/

-package org.eclipse.om2m.commons.constants;

-

-import java.math.BigInteger;

-

-/**

- * Initializes platform properties

- */

-public class Constants {

-	//CseBase resource properties

-    /** CSE Type */

-    public static final String CSE_TYPE = System.getProperty("org.eclipse.om2m.cseType","IN-CSE");

-    /** CseBase id. */

-    public static final String CSE_ID = System.getProperty("org.eclipse.om2m.cseBaseId","in-cse");

-    /** CseBase name. */

-    public static final String CSE_NAME = System.getProperty("org.eclipse.om2m.cseBaseName", "in-name");

-   

-    /** Default admin access right profile */

-    public static final String ADMIN_PROFILE_ID = "acp_admin";

-    /** Default admin requesting entity. (username/password) */

-    public static final String ADMIN_REQUESTING_ENTITY = System.getProperty("org.eclipse.om2m.adminRequestingEntity","admin:admin");

-    /** Default guest access right profile */

-    public static final String GUEST_PROFILE_ID = "ACP_GUEST";

-    /** Default guest requesting entity. (username/password) */

-    public static final String GUEST_REQUESTING_ENTITY = System.getProperty("org.eclipse.om2m.guestRequestingEntity","guest:guest");

-    /** Default resources expiration time. */

-    public static final long EXPIRATION_TIME = 999999999;

-    //CseBase communication properties

-    /** CseBase default communication protocol. */

-    public static final String CSE_DEFAULT_PROTOCOL = System.getProperty("org.eclipse.om2m.cseBaseProtocol.default","http");

-    /** CseBase ip address. */

-    public static final String CSE_IP = System.getProperty("org.eclipse.om2m.cseBaseAddress","127.0.0.1");

-    /** CseBase listening port. */

-    public static final int CSE_PORT = Integer.parseInt(System.getProperty("org.eclipse.equinox.http.jetty.http.port","8080"));

-    /** CseBase coap port. */

-    public static final int COAP_PORT = Integer.parseInt(System.getProperty("org.eclipse.om2m.coap.port","5684"));

-    /** listening context. Not oneM2M compliant */

-    @Deprecated

-    public static final String CSE_CONTEXT = System.getProperty("org.eclipse.om2m.cseBaseContext","/api");

-    /** M2M Service Provider identifier */

-    public static final String M2M_SP_ID = System.getProperty("org.eclipse.om2m.m2mSpId", "om2m.org");

-    

-    //The following properties are required only for ASN or MN to perform authentication on a remote IN or MN

-    /** Connect to the remote CSE (if not IN) */

-    public static final boolean CSE_AUTHENTICATION = Boolean.valueOf(System.getProperty("org.eclipse.om2m.cseAuthentication", "true"));

-    /** Remote Cse Id. (Required only for MN or ASN)*/

-    public static final String REMOTE_CSE_ID = System.getProperty("org.eclipse.om2m.remoteCseId","in-cse");

-    /** Remote Cse ip address. (Required only for MN or ASN)*/

-    public static final String REMOTE_CSE_IP = System.getProperty("org.eclipse.om2m.remoteCseAddress","127.0.0.1");

-    /** Remote Cse listening port. (Required only for MN or ASN)*/

-    public static final int REMOTE_CSE_PORT = Integer.parseInt(System.getProperty("org.eclipse.om2m.remoteCsePort","8080"));

-    /** Remote Cse listening port. (Required only for MN or ASN)*/

-    public static final int REMOTE_CSE_COAP_PORT = Integer.parseInt(System.getProperty("org.eclipse.om2m.remoteCseCoapPort","5683"));

-    /** Remote Cse listening context. */

-    public static final String REMOTE_CSE_CONTEXT = System.getProperty("org.eclipse.om2m.remoteCseContext","/api");

-    /** Remote Cse Name */

-    public static final String REMOTE_CSE_NAME = System.getProperty("org.eclipse.om2m.remoteCseName", "in-name");

-    

-    // Default values for container creation

-    /** Default ContentInstances collection maximum number of instance. */

-    public static final BigInteger MAX_NBR_OF_INSTANCES = new BigInteger(System.getProperty("org.eclipse.om2m.maxNrOfInstances","10"));

-    /** Default max byte size for a container */

-    public static final BigInteger MAX_BYTE_SIZE = new BigInteger(System.getProperty("org.eclipse.om2m.maxByteSize", "10000"));

-    

-    // Regular expressions

-    /** Regular expression for ID of resources */

-    public static final String ID_REGEXPR = "^[A-Za-z0-9_-]*$" ;

-	/** Prefix separator for IDs */

-	public static final String PREFIX_SEPERATOR = System.getProperty("org.eclipse.om2m.resource.idseparator", "-");

-	

-	// Non blocking supported boolean

-	public static final boolean NON_BLOCKING_SUPPORTED = Boolean.parseBoolean(System.getProperty("org.eclipse.om2m.nonblocking", "true"));

-

-	public static final String SP_RELATIVE_URI_SEPARATOR = "~";

-	public static final String ABSOLUTE_URI_SEPARATOR = "_";

-	

-	public static final Integer MAX_THREAD_POOL_SIZE = Integer.valueOf(System.getProperty("org.eclipse.om2m.maxThreadPoolSize", "50"));

-	

+/*******************************************************************************
+ * Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ * 7 Colonel Roche 31077 Toulouse - France
+ *
+ * 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
+ *
+ * Initial Contributors:
+ *     Thierry Monteil : Project manager, technical co-manager
+ *     Mahdi Ben Alaya : Technical co-manager
+ *     Samir Medjiah : Technical co-manager
+ *     Khalil Drira : Strategy expert
+ *     Guillaume Garzone : Developer
+ *     François Aïssaoui : Developer
+ *
+ * New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.commons.constants;
+
+import java.math.BigInteger;
+
+/**
+ * Initializes platform properties
+ */
+public class Constants {
+	//CseBase resource properties
+    /** CSE Type */
+    public static final String CSE_TYPE = System.getProperty("org.eclipse.om2m.cseType","IN-CSE");
+    /** CseBase id. */
+    public static final String CSE_ID = System.getProperty("org.eclipse.om2m.cseBaseId","in-cse");
+    /** CseBase name. */
+    public static final String CSE_NAME = System.getProperty("org.eclipse.om2m.cseBaseName", "in-name");
+   
+    /** Default admin access right profile */
+    public static final String ADMIN_PROFILE_ID = "acp_admin";
+    /** Default admin requesting entity. (username/password) */
+    public static final String ADMIN_REQUESTING_ENTITY = System.getProperty("org.eclipse.om2m.adminRequestingEntity","admin:admin");
+    /** Default guest access right profile */
+    public static final String GUEST_PROFILE_ID = "ACP_GUEST";
+    /** Default guest requesting entity. (username/password) */
+    public static final String GUEST_REQUESTING_ENTITY = System.getProperty("org.eclipse.om2m.guestRequestingEntity","guest:guest");
+    /** Default resources expiration time. */
+    public static final long EXPIRATION_TIME = 999999999;
+    //CseBase communication properties
+    /** CseBase default communication protocol. */
+    public static final String CSE_DEFAULT_PROTOCOL = System.getProperty("org.eclipse.om2m.cseBaseProtocol.default","http");
+    /** CseBase ip address. */
+    public static final String CSE_IP = System.getProperty("org.eclipse.om2m.cseBaseAddress","127.0.0.1");
+    /** CseBase listening port. */
+    public static final int CSE_PORT = Integer.parseInt(System.getProperty("org.eclipse.equinox.http.jetty.http.port","8080"));
+    /** CseBase coap port. */
+    public static final int COAP_PORT = Integer.parseInt(System.getProperty("org.eclipse.om2m.coap.port","5684"));
+    /** listening context. Not oneM2M compliant */
+    @Deprecated
+    public static final String CSE_CONTEXT = System.getProperty("org.eclipse.om2m.cseBaseContext","/api");
+    /** M2M Service Provider identifier */
+    public static final String M2M_SP_ID = System.getProperty("org.eclipse.om2m.m2mSpId", "om2m.org");
+    
+    //The following properties are required only for ASN or MN to perform authentication on a remote IN or MN
+    /** Connect to the remote CSE (if not IN) */
+    public static final boolean CSE_AUTHENTICATION = Boolean.valueOf(System.getProperty("org.eclipse.om2m.cseAuthentication", "true"));
+    /** Remote Cse Id. (Required only for MN or ASN)*/
+    public static final String REMOTE_CSE_ID = System.getProperty("org.eclipse.om2m.remoteCseId","in-cse");
+    /** Remote Cse ip address. (Required only for MN or ASN)*/
+    public static final String REMOTE_CSE_IP = System.getProperty("org.eclipse.om2m.remoteCseAddress","127.0.0.1");
+    /** Remote Cse listening port. (Required only for MN or ASN)*/
+    public static final int REMOTE_CSE_PORT = Integer.parseInt(System.getProperty("org.eclipse.om2m.remoteCsePort","8080"));
+    /** Remote Cse listening port. (Required only for MN or ASN)*/
+    public static final int REMOTE_CSE_COAP_PORT = Integer.parseInt(System.getProperty("org.eclipse.om2m.remoteCseCoapPort","5683"));
+    /** Remote Cse listening context. */
+    public static final String REMOTE_CSE_CONTEXT = System.getProperty("org.eclipse.om2m.remoteCseContext","/api");
+    /** Remote Cse Name */
+    public static final String REMOTE_CSE_NAME = System.getProperty("org.eclipse.om2m.remoteCseName", "in-name");
+    
+    // Default values for container creation
+    /** Default ContentInstances collection maximum number of instance. */
+    public static final BigInteger MAX_NBR_OF_INSTANCES = new BigInteger(System.getProperty("org.eclipse.om2m.maxNrOfInstances","10"));
+    /** Default max byte size for a container */
+    public static final BigInteger MAX_BYTE_SIZE = new BigInteger(System.getProperty("org.eclipse.om2m.maxByteSize", "10000"));
+    
+    // Regular expressions
+    /** Regular expression for ID of resources */
+    public static final String ID_REGEXPR = "^[A-Za-z0-9_-]*$" ;
+	/** Prefix separator for IDs */
+	public static final String PREFIX_SEPERATOR = System.getProperty("org.eclipse.om2m.resource.idseparator", "-");
+	
+	// Non blocking supported boolean
+	public static final boolean NON_BLOCKING_SUPPORTED = Boolean.parseBoolean(System.getProperty("org.eclipse.om2m.nonblocking", "true"));
+
+	public static final String SP_RELATIVE_URI_SEPARATOR = "~";
+	public static final String ABSOLUTE_URI_SEPARATOR = "_";
+	
+	public static final Integer MAX_THREAD_POOL_SIZE = Integer.valueOf(System.getProperty("org.eclipse.om2m.maxThreadPoolSize", "50"));
+
+	// The MimeMediaType to use to serialize a notification
+	public static final String NOTIFICATION_MMT = System.getProperty("org.eclipse.om2m.notification.mmt", MimeMediaType.XML);
+	
 }
\ No newline at end of file
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AccessControlPolicyEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AccessControlPolicyEntity.java
index f5fa003..1dd9a48 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AccessControlPolicyEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AccessControlPolicyEntity.java
@@ -499,14 +499,7 @@
 		this.linkedDynamicAuthorizationConsultation = linkedDynamicAuthorizationConsultation;
 	}
 
-	@Override
-	public List<AccessControlPolicyEntity> getAccessControlPolicies() {
-		return new ArrayList<>();
-	}
-
-	@Override
-	public void setAccessControlPolicies(List<AccessControlPolicyEntity> accessControlPolicies) {
-	}
+	
 	
 	@Override
 	public List<DynamicAuthorizationConsultationEntity> getDynamicAuthorizationConsultations() {
@@ -520,6 +513,16 @@
 	public void setDynamicAuthorizationConsultations(List<DynamicAuthorizationConsultationEntity> list) {
 		dynamicConsultationAuthorizations = list;
 	}
+
+	@Override
+	public List<AccessControlPolicyEntity> getAccessControlPolicies() {
+		return null;
+	}
+
+	@Override
+	public void setAccessControlPolicies(
+			List<AccessControlPolicyEntity> accessControlPolicies) {
+	}
 	
 	
 	
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/LabelEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/LabelEntity.java
index e6623a0..6cee036 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/LabelEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/LabelEntity.java
@@ -191,6 +191,7 @@
 		return linkedAe;
 	}
 
+
 	/**
 	 * @param linkedAe the linkedAe to set
 	 */
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/RequestPrimitive.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/RequestPrimitive.java
index 48c60db..f593225 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/RequestPrimitive.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/RequestPrimitive.java
@@ -133,7 +133,15 @@
 	protected String requestContentType;
 	@XmlTransient
 	protected Map<String,List<String>> queryStrings;
-	
+	@XmlTransient
+	protected String targetId;
+	@XmlTransient
+	protected String mqttTopic;
+	@XmlTransient
+	protected String mqttUri;
+	@XmlTransient
+	protected boolean mqttResponseExpected = true;
+
 	/**
 	 * @return the queryStrings
 	 */
@@ -536,7 +544,7 @@
 	 * @return the targetId
 	 */
 	public String getTargetId() {
-		return this.getTo();
+		return this.targetId;
 	}
 
 	/**
@@ -544,7 +552,7 @@
 	 *            the targetId to set
 	 */
 	public void setTargetId(String targetId) {
-		this.setTo(targetId);
+		this.targetId= targetId;
 	}
 
 	/**
@@ -575,6 +583,38 @@
 		this.requestContentType = requestContentType;
 	}
 
+	public PrimitiveContent getPrimitiveContent() {
+		return primitiveContent;
+	}
+
+	public void setPrimitiveContent(PrimitiveContent primitiveContent) {
+		this.primitiveContent = primitiveContent;
+	}
+
+	public String getMqttTopic() {
+		return mqttTopic;
+	}
+
+	public void setMqttTopic(String mqttTopic) {
+		this.mqttTopic = mqttTopic;
+	}
+
+	public String getMqttUri() {
+		return mqttUri;
+	}
+
+	public void setMqttUri(String mqttUri) {
+		this.mqttUri = mqttUri;
+	}
+	
+	public boolean isMqttResponseExpected() {
+		return mqttResponseExpected;
+	}
+
+	public void setMqttResponseExpected(boolean mqttResponseExpected) {
+		this.mqttResponseExpected = mqttResponseExpected;
+	}
+
 	/* (non-Javadoc)
 	 * @see java.lang.Object#toString()
 	 */
@@ -651,5 +691,5 @@
 		result.to = this.to;
 		return result;
 	}
-	
+
 }
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/ResponsePrimitive.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/ResponsePrimitive.java
index 93b6b1b..d6ad846 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/ResponsePrimitive.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/ResponsePrimitive.java
@@ -331,7 +331,7 @@
 		this.content = content;
 	}
 	
-	public PrimitiveContent getPritimitiveContent(){
+	public PrimitiveContent getPrimitiveContent(){
 		return content;
 	}
 	
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/ContentInstanceController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/ContentInstanceController.java
index 246d7c3..a8e5505 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/ContentInstanceController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/ContentInstanceController.java
@@ -216,9 +216,11 @@
 			if (container.getMaxNrOfInstances() != null && (cinList.size() == container.getMaxNrOfInstances().intValue())) {
 				LOGGER.info("Deleting oldest content instance due to container size limit: " + 
 						container.getChildContentInstances().get(0).getHierarchicalURI());
+				String hierarchicalUriToDelete = container.getChildContentInstances().get(0).getHierarchicalURI();
 				dbs.getDAOFactory().getContentInstanceDAO().delete(transaction, container.getChildContentInstances().get(0));
 				transaction.commit();
 				transaction.close();
+				UriMapper.deleteUri(hierarchicalUriToDelete);
 				transaction = dbs.getDbTransaction();
 				transaction.open();
 				container = (ContainerEntity)dao.find(transaction, request.getTargetId());
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FanOutPointController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FanOutPointController.java
index 1fc142a..424ea3f 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FanOutPointController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FanOutPointController.java
@@ -158,7 +158,7 @@
 		public ResponsePrimitive call() throws Exception {
 			ResponsePrimitive resp = new Router().doRequest(request);
 			resp.setPrimitiveContent(new PrimitiveContent());
-			resp.getPritimitiveContent().getAny().add(resp.getContent());
+			resp.getPrimitiveContent().getAny().add(resp.getContent());
 			return resp;
 		}
 		
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/notifier/Notifier.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/notifier/Notifier.java
index e20b7ba..4a909c2 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/notifier/Notifier.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/notifier/Notifier.java
@@ -1,83 +1,86 @@
-/*******************************************************************************

- * Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)

- * 7 Colonel Roche 31077 Toulouse - France

- *

- * 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

- *

- * Initial Contributors:

- *     Thierry Monteil : Project manager, technical co-manager

- *     Mahdi Ben Alaya : Technical co-manager

- *     Samir Medjiah : Technical co-manager

- *     Khalil Drira : Strategy expert

- *     Guillaume Garzone : Developer

- *     François Aïssaoui : Developer

- *

- * New contributors :

- *******************************************************************************/

-package org.eclipse.om2m.core.notifier;

-

-import java.math.BigInteger;

-import java.util.ArrayList;

-import java.util.List;

-

-import org.apache.commons.logging.Log;

-import org.apache.commons.logging.LogFactory;

-import org.eclipse.om2m.commons.constants.Constants;

-import org.eclipse.om2m.commons.constants.MimeMediaType;

-import org.eclipse.om2m.commons.constants.NotificationContentType;

-import org.eclipse.om2m.commons.constants.Operation;

-import org.eclipse.om2m.commons.constants.ResourceStatus;

-import org.eclipse.om2m.commons.constants.ResourceType;

-import org.eclipse.om2m.commons.constants.ResponseStatusCode;

-import org.eclipse.om2m.commons.constants.ResultContent;

-import org.eclipse.om2m.commons.entities.AccessControlPolicyEntity;

-import org.eclipse.om2m.commons.entities.AeEntity;

-import org.eclipse.om2m.commons.entities.CSEBaseEntity;

-import org.eclipse.om2m.commons.entities.ContainerEntity;

-import org.eclipse.om2m.commons.entities.GroupEntity;

-import org.eclipse.om2m.commons.entities.MgmtObjEntity;

-import org.eclipse.om2m.commons.entities.RemoteCSEEntity;

-import org.eclipse.om2m.commons.entities.ResourceEntity;

-import org.eclipse.om2m.commons.entities.ScheduleEntity;

-import org.eclipse.om2m.commons.entities.SubscriptionEntity;

-import org.eclipse.om2m.commons.exceptions.Om2mException;

-import org.eclipse.om2m.commons.resource.Notification;

-import org.eclipse.om2m.commons.resource.Notification.NotificationEvent;

+/*******************************************************************************
+ * Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ * 7 Colonel Roche 31077 Toulouse - France
+ *
+ * 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
+ *
+ * Initial Contributors:
+ *     Thierry Monteil : Project manager, technical co-manager
+ *     Mahdi Ben Alaya : Technical co-manager
+ *     Samir Medjiah : Technical co-manager
+ *     Khalil Drira : Strategy expert
+ *     Guillaume Garzone : Developer
+ *     François Aïssaoui : Developer
+ *
+ * New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.core.notifier;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.eclipse.om2m.commons.constants.Constants;
+import org.eclipse.om2m.commons.constants.MimeMediaType;
+import org.eclipse.om2m.commons.constants.NotificationContentType;
+import org.eclipse.om2m.commons.constants.Operation;
+import org.eclipse.om2m.commons.constants.ResourceStatus;
+import org.eclipse.om2m.commons.constants.ResourceType;
+import org.eclipse.om2m.commons.constants.ResponseStatusCode;
+import org.eclipse.om2m.commons.constants.ResultContent;
+import org.eclipse.om2m.commons.entities.AccessControlPolicyEntity;
+import org.eclipse.om2m.commons.entities.AeEntity;
+import org.eclipse.om2m.commons.entities.CSEBaseEntity;
+import org.eclipse.om2m.commons.entities.ContainerEntity;
+import org.eclipse.om2m.commons.entities.GroupEntity;
+import org.eclipse.om2m.commons.entities.MgmtObjEntity;
+import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
+import org.eclipse.om2m.commons.entities.ResourceEntity;
+import org.eclipse.om2m.commons.entities.ScheduleEntity;
+import org.eclipse.om2m.commons.entities.SubscriptionEntity;
+import org.eclipse.om2m.commons.exceptions.Om2mException;
+import org.eclipse.om2m.commons.resource.Notification;
+import org.eclipse.om2m.commons.resource.Notification.NotificationEvent;
 import org.eclipse.om2m.commons.resource.Notification.NotificationEvent.Representation;
-import org.eclipse.om2m.commons.resource.RequestPrimitive;

-import org.eclipse.om2m.commons.resource.Resource;

-import org.eclipse.om2m.commons.resource.ResponsePrimitive;

-import org.eclipse.om2m.core.comm.RestClient;

-import org.eclipse.om2m.core.datamapper.DataMapperSelector;

-import org.eclipse.om2m.core.entitymapper.EntityMapper;

-import org.eclipse.om2m.core.entitymapper.EntityMapperFactory;

-import org.eclipse.om2m.core.persistence.PersistenceService;

-import org.eclipse.om2m.core.router.Patterns;

-import org.eclipse.om2m.core.router.Router;

-import org.eclipse.om2m.core.thread.CoreExecutor;

-import org.eclipse.om2m.core.urimapper.UriMapper;

-import org.eclipse.om2m.persistence.service.DAO;

-import org.eclipse.om2m.persistence.service.DBService;

-import org.eclipse.om2m.persistence.service.DBTransaction;

-

-/**

- * Notifies subscribers when a change occurs on a resource according to their subscriptions.

- */

-public class Notifier {

-	/** Logger */

-	private static Log LOGGER = LogFactory.getLog(Notifier.class);

-	

-	private static final Integer NB_OF_FAILED_NOTIFS_BEFORE_DELETION = Integer.valueOf(System.getProperty("org.eclipse.om2m.subscriptions.nbOfFailedNotificationsBeforeDeletion", "5"));

-

-	/**

-	 * Finds all resource subscribers and notifies them.

-	 * @param statusCode - Notification status code

-	 * @param resource - Notification resource

-	 */

-	public static void notify(List<SubscriptionEntity> listSubscription, ResourceEntity resource, int resourceStatus) {

+import org.eclipse.om2m.commons.resource.RequestPrimitive;
+import org.eclipse.om2m.commons.resource.Resource;
+import org.eclipse.om2m.commons.resource.ResponsePrimitive;
+import org.eclipse.om2m.core.comm.RestClient;
+import org.eclipse.om2m.core.datamapper.DataMapperSelector;
+import org.eclipse.om2m.core.entitymapper.EntityMapper;
+import org.eclipse.om2m.core.entitymapper.EntityMapperFactory;
+import org.eclipse.om2m.core.persistence.PersistenceService;
+import org.eclipse.om2m.core.router.Patterns;
+import org.eclipse.om2m.core.router.Router;
+import org.eclipse.om2m.core.thread.CoreExecutor;
+import org.eclipse.om2m.core.urimapper.UriMapper;
+import org.eclipse.om2m.persistence.service.DAO;
+import org.eclipse.om2m.persistence.service.DBService;
+import org.eclipse.om2m.persistence.service.DBTransaction;
+
+/**
+ * Notifies subscribers when a change occurs on a resource according to their subscriptions.
+ */
+public class Notifier {
+	/** Logger */
+	private static Log LOGGER = LogFactory.getLog(Notifier.class);
+	
+	private static final Integer NB_OF_FAILED_NOTIFS_BEFORE_DELETION = Integer.valueOf(System.getProperty("org.eclipse.om2m.subscriptions.nbOfFailedNotificationsBeforeDeletion", "5"));
+
+	/**
+	 * Finds all resource subscribers and notifies them.
+	 * @param statusCode - Notification status code
+	 * @param resource - Notification resource
+	 */
+	public static void notify(List<SubscriptionEntity> listSubscription, ResourceEntity resource, int resourceStatus) {
+
 		notify(listSubscription, resource, null, resourceStatus);
 	}
 	
@@ -89,265 +92,265 @@
 	 * @param resourceStatus
 	 */
 	public static void notify(List<SubscriptionEntity> listSubscription, ResourceEntity resource, Resource modifiedOnlyResource, int resourceStatus) {
-		if (listSubscription != null){

-			for(SubscriptionEntity sub : listSubscription){

+		if (listSubscription != null){
+			for(SubscriptionEntity sub : listSubscription){
 				NotificationWorker worker = new NotificationWorker(sub, resourceStatus, resource, modifiedOnlyResource);
-				CoreExecutor.postThread(worker);

-			}

-		}

-	}

-

-	/**

-	 * Used in DELETE procedure when a resource is deleted. It notifies the subscribed resource

-	 * and the parent resource subscribed entities. 

-	 * @param listSubs

-	 * @param resourceDeleted

-	 */

-	public static void notifyDeletion(List<SubscriptionEntity> listSubs, ResourceEntity resourceDeleted){

-		List<SubscriptionEntity> parentSubscriptions = getParentSubscriptions(resourceDeleted);

-		if(parentSubscriptions != null){

-			notify(parentSubscriptions, resourceDeleted, ResourceStatus.CHILD_DELETED);			

-		}

-		if(listSubs != null){

-			notify(listSubs, resourceDeleted, ResourceStatus.DELETED);			

-		}

-	}

-

-	public static void performVerificationRequest(RequestPrimitive request,

-			SubscriptionEntity subscriptionEntity) {

-		String notificationPayloadContentType = subscriptionEntity.getNotificationPayloadContentType();

-		for(String uri : subscriptionEntity.getNotificationURI()){

-			if(!uri.equals(request.getFrom())){

-				Notification notification = new Notification();

-				notification.setCreator(subscriptionEntity.getCreator());

-				notification.setVerificationRequest(true);

-				notification.setSubscriptionReference(subscriptionEntity.getHierarchicalURI());

-				notification.setSubscriptionDeletion(false);

-				RequestPrimitive notifRequest = new RequestPrimitive();

-				if (!MimeMediaType.OBJ.equals(notificationPayloadContentType)) {

-					notifRequest.setContent(DataMapperSelector.getDataMapperList().get(notificationPayloadContentType).objToString(notification));

-				} else {

-					notifRequest.setContent(notification);

-				}

-				notifRequest.setFrom("/" + Constants.CSE_ID);

-				notifRequest.setTo(uri);

-				notifRequest.setOperation(Operation.NOTIFY);

-				notifRequest.setRequestContentType(notificationPayloadContentType);

-				notifRequest.setReturnContentType(notificationPayloadContentType);

-				ResponsePrimitive resp = notify(notifRequest, uri);

-				if(resp.getResponseStatusCode().equals(ResponseStatusCode.TARGET_NOT_REACHABLE)){

-					throw new Om2mException("Error during the verification request", 

-							ResponseStatusCode.SUBSCRIPTION_VERIFICATION_INITIATION_FAILED);

-				}

-				if(resp.getResponseStatusCode().equals(ResponseStatusCode.SUBSCRIPTION_CREATOR_HAS_NO_PRIVILEGE)

-						|| resp.getResponseStatusCode().equals(ResponseStatusCode.SUBSCRIPTION_HOST_HAS_NO_PRIVILEGE)){

-					throw new Om2mException(resp.getResponseStatusCode());

-				}

-			}

-		}

-	}

-

-	public static ResponsePrimitive notify(RequestPrimitive request, String contact){

-		// Check whether the subscription contact is protocol-dependent or not.

-		LOGGER.info("Sending notify request to: " + contact);

-		if(contact.matches(".*://.*")){ 

-			// Contact = protocol-dependent -> direct notification using the rest client.

-			request.setTo(contact);

-			return RestClient.sendRequest(request);

-		}else{

-			request.setTargetId(contact);

-			request.setFrom(Constants.ADMIN_REQUESTING_ENTITY);

-			LOGGER.info("Sending notify request...");

-			return new Router().doRequest(request);

-		}

-	}

-

-	/**

-	 * Used to retrieve the subscription list of the parent resource

-	 * @param resource 

-	 * @return

-	 */

-	private static List<SubscriptionEntity> getParentSubscriptions(

-			ResourceEntity resourceDeleted) {

-		List<SubscriptionEntity> result;

-		// Get parent id

-		String[] ids = resourceDeleted.getHierarchicalURI().split("/");

-		String parentHierarchicalId = resourceDeleted.getHierarchicalURI().replace("/" + ids[ids.length - 1], "");

-		String parentId = UriMapper.getNonHierarchicalUri(parentHierarchicalId);

-		// get parent entity

-		DBService dbs = PersistenceService.getInstance().getDbService();

-

-		DAO<?> dao = Patterns.getDAO(parentId, dbs);

-		DBTransaction transaction = dbs.getDbTransaction();

-		transaction.open();

-		ResourceEntity parentEntity = (ResourceEntity) dao.find(transaction, parentId);

-		// get the sub list from parent

-		switch(parentEntity.getResourceType().intValue()){

-		case ResourceType.ACCESS_CONTROL_POLICY:

-			AccessControlPolicyEntity acp = (AccessControlPolicyEntity) parentEntity;

-			result = acp.getChildSubscriptions();

-			break;

-		case ResourceType.AE:

-			AeEntity ae = (AeEntity) parentEntity;

-			result = ae.getSubscriptions();

-			break;

-		case ResourceType.CONTAINER:

-			ContainerEntity cnt = (ContainerEntity) parentEntity;

-			result = cnt.getSubscriptions();

-			break;

-		case ResourceType.CSE_BASE:

-			CSEBaseEntity csb = (CSEBaseEntity) parentEntity;

-			result = csb.getSubscriptions();

-			break;

-		case ResourceType.GROUP:

-			GroupEntity group = (GroupEntity) parentEntity;

-			result = group.getSubscriptions();

-			break;

-		case ResourceType.REMOTE_CSE:

-			RemoteCSEEntity csr = (RemoteCSEEntity) parentEntity;

-			result = csr.getSubscriptions();

-			break;

-		case ResourceType.SCHEDULE:

-			ScheduleEntity schedule = (ScheduleEntity) parentEntity;

-			result = schedule.getSubscriptions();

-			break;

-		default:

-			result = new ArrayList<SubscriptionEntity>();

-		}

-		transaction.close();

-		return result;

-	}

-

-	/**

-	 * Worker that perform the notification task for a subscription

-	 *

-	 */

-	static class NotificationWorker implements Runnable {

-		/** resource status of the notification */

-		private int resourceStatus;

-		/** the subscription to handle */

-		private SubscriptionEntity sub;

-		/** the resource to be sent */

-		private ResourceEntity resource;

+				CoreExecutor.postThread(worker);
+			}
+		}
+	}
+
+	/**
+	 * Used in DELETE procedure when a resource is deleted. It notifies the subscribed resource
+	 * and the parent resource subscribed entities. 
+	 * @param listSubs
+	 * @param resourceDeleted
+	 */
+	public static void notifyDeletion(List<SubscriptionEntity> listSubs, ResourceEntity resourceDeleted){
+		List<SubscriptionEntity> parentSubscriptions = getParentSubscriptions(resourceDeleted);
+		if(parentSubscriptions != null){
+			notify(parentSubscriptions, resourceDeleted, ResourceStatus.CHILD_DELETED);			
+		}
+		if(listSubs != null){
+			notify(listSubs, resourceDeleted, ResourceStatus.DELETED);			
+		}
+	}
+
+	public static void performVerificationRequest(RequestPrimitive request,
+			SubscriptionEntity subscriptionEntity) {
+		String notificationPayloadContentType = subscriptionEntity.getNotificationPayloadContentType();
+		for(String uri : subscriptionEntity.getNotificationURI()){
+			if(!uri.equals(request.getFrom())){
+				Notification notification = new Notification();
+				notification.setCreator(subscriptionEntity.getCreator());
+				notification.setVerificationRequest(true);
+				notification.setSubscriptionReference(subscriptionEntity.getHierarchicalURI());
+				notification.setSubscriptionDeletion(false);
+				RequestPrimitive notifRequest = new RequestPrimitive();
+				if (!MimeMediaType.OBJ.equals(notificationPayloadContentType)) {
+					notifRequest.setContent(DataMapperSelector.getDataMapperList().get(notificationPayloadContentType).objToString(notification));
+				} else {
+					notifRequest.setContent(notification);
+				}
+				notifRequest.setFrom("/" + Constants.CSE_ID);
+				notifRequest.setTo(uri);
+				notifRequest.setOperation(Operation.NOTIFY);
+				notifRequest.setRequestContentType(notificationPayloadContentType);
+				notifRequest.setReturnContentType(notificationPayloadContentType);
+				ResponsePrimitive resp = notify(notifRequest, uri);
+				if(resp.getResponseStatusCode().equals(ResponseStatusCode.TARGET_NOT_REACHABLE)){
+					throw new Om2mException("Error during the verification request", 
+							ResponseStatusCode.SUBSCRIPTION_VERIFICATION_INITIATION_FAILED);
+				}
+				if(resp.getResponseStatusCode().equals(ResponseStatusCode.SUBSCRIPTION_CREATOR_HAS_NO_PRIVILEGE)
+						|| resp.getResponseStatusCode().equals(ResponseStatusCode.SUBSCRIPTION_HOST_HAS_NO_PRIVILEGE)){
+					throw new Om2mException(resp.getResponseStatusCode());
+				}
+			}
+		}
+	}
+
+	public static ResponsePrimitive notify(RequestPrimitive request, String contact){
+		// Check whether the subscription contact is protocol-dependent or not.
+		LOGGER.info("Sending notify request to: " + contact);
+		if(contact.matches(".*://.*")){ 
+			// Contact = protocol-dependent -> direct notification using the rest client.
+			request.setTo(contact);
+			return RestClient.sendRequest(request);
+		}else{
+			request.setTargetId(contact);
+			request.setFrom(Constants.ADMIN_REQUESTING_ENTITY);
+			LOGGER.info("Sending notify request...");
+			return new Router().doRequest(request);
+		}
+	}
+
+	/**
+	 * Used to retrieve the subscription list of the parent resource
+	 * @param resource 
+	 * @return
+	 */
+	private static List<SubscriptionEntity> getParentSubscriptions(
+			ResourceEntity resourceDeleted) {
+		List<SubscriptionEntity> result;
+		// Get parent id
+		String[] ids = resourceDeleted.getHierarchicalURI().split("/");
+		String parentHierarchicalId = resourceDeleted.getHierarchicalURI().replace("/" + ids[ids.length - 1], "");
+		String parentId = UriMapper.getNonHierarchicalUri(parentHierarchicalId);
+		// get parent entity
+		DBService dbs = PersistenceService.getInstance().getDbService();
+
+		DAO<?> dao = Patterns.getDAO(parentId, dbs);
+		DBTransaction transaction = dbs.getDbTransaction();
+		transaction.open();
+		ResourceEntity parentEntity = (ResourceEntity) dao.find(transaction, parentId);
+		// get the sub list from parent
+		switch(parentEntity.getResourceType().intValue()){
+		case ResourceType.ACCESS_CONTROL_POLICY:
+			AccessControlPolicyEntity acp = (AccessControlPolicyEntity) parentEntity;
+			result = acp.getChildSubscriptions();
+			break;
+		case ResourceType.AE:
+			AeEntity ae = (AeEntity) parentEntity;
+			result = ae.getSubscriptions();
+			break;
+		case ResourceType.CONTAINER:
+			ContainerEntity cnt = (ContainerEntity) parentEntity;
+			result = cnt.getSubscriptions();
+			break;
+		case ResourceType.CSE_BASE:
+			CSEBaseEntity csb = (CSEBaseEntity) parentEntity;
+			result = csb.getSubscriptions();
+			break;
+		case ResourceType.GROUP:
+			GroupEntity group = (GroupEntity) parentEntity;
+			result = group.getSubscriptions();
+			break;
+		case ResourceType.REMOTE_CSE:
+			RemoteCSEEntity csr = (RemoteCSEEntity) parentEntity;
+			result = csr.getSubscriptions();
+			break;
+		case ResourceType.SCHEDULE:
+			ScheduleEntity schedule = (ScheduleEntity) parentEntity;
+			result = schedule.getSubscriptions();
+			break;
+		default:
+			result = new ArrayList<SubscriptionEntity>();
+		}
+		transaction.close();
+		return result;
+	}
+
+	/**
+	 * Worker that perform the notification task for a subscription
+	 *
+	 */
+	static class NotificationWorker implements Runnable {
+		/** resource status of the notification */
+		private int resourceStatus;
+		/** the subscription to handle */
+		private SubscriptionEntity sub;
+		/** the resource to be sent */
+		private ResourceEntity resource;
 		/** the resource to be sent - modified attribute */
 		private Resource modifiedOnlyResource;
-

+
 		public NotificationWorker(SubscriptionEntity sub, int resourceStatus, ResourceEntity resource, Resource modifiedOnlyResource) {
-			this.resourceStatus = resourceStatus;

-			this.sub = sub;

-			this.resource = resource;

+			this.resourceStatus = resourceStatus;
+			this.sub = sub;
+			this.resource = resource;
 			this.modifiedOnlyResource = modifiedOnlyResource;
-		}

-

-		@SuppressWarnings("unchecked")

-		@Override

-		public void run() {

-			final RequestPrimitive request = new RequestPrimitive();

-			Notification notification = new Notification();

-			NotificationEvent notifEvent = new NotificationEvent();

-			notification.setNotificationEvent(notifEvent);

-

-			// Set attributes of notification object

-			notifEvent.setResourceStatus(BigInteger.valueOf(resourceStatus));

-			notification.setCreator(sub.getCreator());

-

-			// Set request parameters

-			request.setOperation(Operation.NOTIFY);

-			request.setFrom("/" + Constants.CSE_ID);

-

-			if(resourceStatus == ResourceStatus.DELETED){

-				notification.setSubscriptionDeletion(true);

-			} else {

-				notification.setSubscriptionDeletion(false);

-			}

-

-			notification.setSubscriptionReference(sub.getResourceID());

-

-			// Get the representation of the content

-			Resource serializableResource;

-			EntityMapper mapper ;

-			if (sub.getNotificationContentType() != null){

-				if (resource.getResourceType().equals(ResourceType.MGMT_OBJ)) {

-					mapper = EntityMapperFactory.getMapperForMgmtObj((MgmtObjEntity) resource);

-				} else {

-					mapper = EntityMapperFactory.

-							getMapperFromResourceType(resource.getResourceType().intValue());

-				}

-				if(sub.getNotificationContentType().equals(NotificationContentType.MODIFIED_ATTRIBUTES)){

-					Representation representation = new Representation();

-					if (modifiedOnlyResource != null) {

-						// Gregory BONNARDEL - 26 Avril 2016

-						// as all Controllers have not been modified

-						// for modified controllers, use the resource provided by the controller

-						representation.setResource(modifiedOnlyResource);

-					} else {

-						// for non modified controllers, send the ResourceEntity 

-						// but it is not compliant with the specs

-						serializableResource  = (Resource) mapper

-								.mapEntityToResource(resource, ResultContent.ATTRIBUTES, 0, 0);

-						representation.setResource(serializableResource);

-					}

-					notification.getNotificationEvent().setRepresentation(representation);

-					request.setRequestContentType(sub.getNotificationPayloadContentType());

-				} else if(sub.getNotificationContentType().equals(NotificationContentType.WHOLE_RESOURCE)){

-					serializableResource = (Resource) mapper.mapEntityToResource(resource, ResultContent.ATTRIBUTES, 0, 0);

+		}
+
+		@SuppressWarnings("unchecked")
+		@Override
+		public void run() {
+			final RequestPrimitive request = new RequestPrimitive();
+			Notification notification = new Notification();
+			NotificationEvent notifEvent = new NotificationEvent();
+			notification.setNotificationEvent(notifEvent);
+
+			// Set attributes of notification object
+			notifEvent.setResourceStatus(BigInteger.valueOf(resourceStatus));
+			notification.setCreator(sub.getCreator());
+
+			// Set request parameters
+			request.setOperation(Operation.NOTIFY);
+			request.setFrom("/" + Constants.CSE_ID);
+
+			if(resourceStatus == ResourceStatus.DELETED){
+				notification.setSubscriptionDeletion(true);
+			} else {
+				notification.setSubscriptionDeletion(false);
+			}
+
+			notification.setSubscriptionReference(sub.getResourceID());
+
+			// Get the representation of the content
+			Resource serializableResource;
+			EntityMapper mapper ;
+			if (sub.getNotificationContentType() != null){
+				if (resource.getResourceType().equals(ResourceType.MGMT_OBJ)) {
+					mapper = EntityMapperFactory.getMapperForMgmtObj((MgmtObjEntity) resource);
+				} else {
+					mapper = EntityMapperFactory.
+							getMapperFromResourceType(resource.getResourceType().intValue());
+				}
+				if(sub.getNotificationContentType().equals(NotificationContentType.MODIFIED_ATTRIBUTES)){
+					Representation representation = new Representation();
+					if (modifiedOnlyResource != null) {
+						// Gregory BONNARDEL - 26 Avril 2016
+						// as all Controllers have not been modified
+						// for modified controllers, use the resource provided by the controller
+						representation.setResource(modifiedOnlyResource);
+					} else {
+						// for non modified controllers, send the ResourceEntity 
+						// but it is not compliant with the specs
+						serializableResource  = (Resource) mapper
+								.mapEntityToResource(resource, ResultContent.ATTRIBUTES, 0, 0);
+						representation.setResource(serializableResource);
+					}
+					notification.getNotificationEvent().setRepresentation(representation);
+					request.setRequestContentType(sub.getNotificationPayloadContentType());
+				} else if(sub.getNotificationContentType().equals(NotificationContentType.WHOLE_RESOURCE)){
+					serializableResource = (Resource) mapper.mapEntityToResource(resource, ResultContent.ATTRIBUTES, 0, 0);
 					Representation representation = new Representation();
 					representation.setResource(serializableResource);
 					notification.getNotificationEvent().setRepresentation(representation);
-					request.setRequestContentType(sub.getNotificationPayloadContentType());

-				} 

-			} 

-			// Set the content

-			request.setContent(DataMapperSelector.getDataMapperList().get(sub.getNotificationPayloadContentType()).objToString(notification));

-			// For each notification URI: send the notify request

-			for(final String uri : sub.getNotificationURI()){

-				CoreExecutor.postThread(new Runnable(){

-					public void run() {

-						ResponsePrimitive response = Notifier.notify(request, uri);  

-						if (ResponseStatusCode.OK.equals(response.getResponseStatusCode())) {

-							// notify ok

-							updateSubscription(sub.getResourceID(), 0);

-							LOGGER.debug("notify OK for subscription " + sub.getResourceID());

-						} else {

-							// notify KO

-							Integer nbOfFailed = sub.getNbOfFailedNotifications();

-							if (nbOfFailed == null) {

-								nbOfFailed = 0;

-							}

-							if (nbOfFailed > NB_OF_FAILED_NOTIFS_BEFORE_DELETION) {

-								// delete notification

-								deleteSubscription(sub.getResourceID());

-								LOGGER.error("Reach the limit of failed notifs --> delete subscription " + sub.getResourceID());

-							} else {

-								updateSubscription(sub.getResourceID(), nbOfFailed+1);

-								LOGGER.warn("unable to notify, increase failed notifs(" + nbOfFailed +") for subscription " + sub.getResourceID());

-							}

-						}

-					};

-				});

-			}

-		}

-	}

-	

-	private static void deleteSubscription(String resourceId) {

-		DBService dbs = PersistenceService.getInstance().getDbService();

-		DBTransaction dbTransaction = dbs.getDbTransaction();

-		dbTransaction.open();

-		SubscriptionEntity subscriptionEntityToBeDeleted = dbs.getDAOFactory().getSubsciptionDAO().find(dbTransaction, resourceId);

-		dbs.getDAOFactory().getSubsciptionDAO().delete(dbTransaction, subscriptionEntityToBeDeleted);

-		dbTransaction.commit();

-		dbTransaction.close();

-	}

-	

-	private static void updateSubscription(String resourceId, Integer nbOfFailedNotification) {

-		DBService dbs = PersistenceService.getInstance().getDbService();

-		DBTransaction dbTransaction = dbs.getDbTransaction();

-		dbTransaction.open();

-		SubscriptionEntity subscriptionEntityToBeUpdated = dbs.getDAOFactory().getSubsciptionDAO().find(dbTransaction, resourceId);

-		subscriptionEntityToBeUpdated.setNbOfFailedNotifications(nbOfFailedNotification);

-		dbs.getDAOFactory().getSubsciptionDAO().update(dbTransaction, subscriptionEntityToBeUpdated);

-		dbTransaction.commit();

-		dbTransaction.close();

-	}

-

-}

+					request.setRequestContentType(sub.getNotificationPayloadContentType());
+				} 
+			} 
+			// Set the content
+			request.setContent(DataMapperSelector.getDataMapperList().get(sub.getNotificationPayloadContentType()).objToString(notification));
+			// For each notification URI: send the notify request
+			for(final String uri : sub.getNotificationURI()){
+				CoreExecutor.postThread(new Runnable(){
+					public void run() {
+						ResponsePrimitive response = Notifier.notify(request, uri);  
+						if (ResponseStatusCode.OK.equals(response.getResponseStatusCode())) {
+							// notify ok
+							updateSubscription(sub.getResourceID(), 0);
+							LOGGER.debug("notify OK for subscription " + sub.getResourceID());
+						} else {
+							// notify KO
+							Integer nbOfFailed = sub.getNbOfFailedNotifications();
+							if (nbOfFailed == null) {
+								nbOfFailed = 0;
+							}
+							if (nbOfFailed > NB_OF_FAILED_NOTIFS_BEFORE_DELETION) {
+								// delete notification
+								deleteSubscription(sub.getResourceID());
+								LOGGER.error("Reach the limit of failed notifs --> delete subscription " + sub.getResourceID());
+							} else {
+								updateSubscription(sub.getResourceID(), nbOfFailed+1);
+								LOGGER.warn("unable to notify, increase failed notifs(" + nbOfFailed +") for subscription " + sub.getResourceID());
+							}
+						}
+					};
+				});
+			}
+		}
+	}
+	
+	private static void deleteSubscription(String resourceId) {
+		DBService dbs = PersistenceService.getInstance().getDbService();
+		DBTransaction dbTransaction = dbs.getDbTransaction();
+		dbTransaction.open();
+		SubscriptionEntity subscriptionEntityToBeDeleted = dbs.getDAOFactory().getSubsciptionDAO().find(dbTransaction, resourceId);
+		dbs.getDAOFactory().getSubsciptionDAO().delete(dbTransaction, subscriptionEntityToBeDeleted);
+		dbTransaction.commit();
+		dbTransaction.close();
+	}
+	
+	private static void updateSubscription(String resourceId, Integer nbOfFailedNotification) {
+		DBService dbs = PersistenceService.getInstance().getDbService();
+		DBTransaction dbTransaction = dbs.getDbTransaction();
+		dbTransaction.open();
+		SubscriptionEntity subscriptionEntityToBeUpdated = dbs.getDAOFactory().getSubsciptionDAO().find(dbTransaction, resourceId);
+		subscriptionEntityToBeUpdated.setNbOfFailedNotifications(nbOfFailedNotification);
+		dbs.getDAOFactory().getSubsciptionDAO().update(dbTransaction, subscriptionEntityToBeUpdated);
+		dbTransaction.commit();
+		dbTransaction.close();
+	}
+
+}
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/redirector/Redirector.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/redirector/Redirector.java
index 1c1fa86..e469550 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/redirector/Redirector.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/redirector/Redirector.java
@@ -19,6 +19,9 @@
  *******************************************************************************/

 package org.eclipse.om2m.core.redirector;

 

+import java.util.regex.Matcher;

+import java.util.regex.Pattern;

+

 import org.apache.commons.logging.Log;

 import org.apache.commons.logging.LogFactory;

 import org.eclipse.om2m.commons.constants.CSEType;

@@ -120,16 +123,34 @@
 				if (url.endsWith("/")) {

 					LOGGER.debug("Removing / at the end of poa: " + url);

 					url = url.substring(0, url.length() - 1);

-				}

+				}
 

-				if (request.getTo().startsWith("//")) {

-					url += request.getTo().replaceFirst("//", "/_/");

-				} else if (request.getTo().startsWith("/")) {

-					url += request.getTo().replaceFirst("/", "/~/");

+				if(url.startsWith("mqtt://")){

+					url += request.getTo();

+					Pattern mqttUriPattern = Pattern.compile("(mqtt://[^:/]*(:[0-9]{1,5})?)(/.*)");

+					Matcher matcher = mqttUriPattern.matcher(url);

+					if(matcher.matches()){

+						// FIXME we need a response but not yet implemented in MQTT binding

+						request.setMqttResponseExpected(true);

+						// TODO Format type can be enhanced

+						request.setMqttTopic("/oneM2M/req/" + Constants.CSE_ID + "/" + csrEntity.getRemoteCseId().replaceAll("/", "") + "/xml");

+						request.setMqttUri(matcher.group(1));

+					} else {

+						LOGGER.warn("Incorrect MQTT URI specified in remoteCSE: " + url);

+						i++;

+						continue;

+					}

 				} else {

-					url += "/" + request.getTo();

+					if(request.getTo().startsWith("//")){

+						url += request.getTo().replaceFirst("//", "/_/");

+					} else if(request.getTo().startsWith("/")){

+						url += request.getTo().replaceFirst("/", "/~/");

+					} else {

+						url+= "/" + request.getTo();

+					}

 				}

-

+				

+				
 				request.setTo(url);

 

 				// modify the request if content type is OBJ.

@@ -230,6 +251,26 @@
 					done = true;

 				} else {

 					request.setTo(poa);

+					if(poa.startsWith("mqtt://")){

+						Pattern mqttUriPattern = Pattern.compile("(mqtt://[^:/]*(:[0-9]{1,5})?)(/.*)?");

+						Matcher matcher = mqttUriPattern.matcher(poa);

+						if(matcher.matches()){

+							String topic = matcher.group(3);

+							String aeId = ae.getAeid();

+							if(topic != null){

+								request.setMqttTopic(topic);

+								request.setMqttResponseExpected(false);

+							} else {

+								request.setMqttTopic("/oneM2M/req/" + Constants.CSE_ID + "/" + aeId + "/xml");

+								request.setMqttResponseExpected(true);

+							}

+							request.setMqttUri(matcher.group(1));

+						} else {

+							LOGGER.warn("POA is incorrect for MQTT: " + poa);

+							i++;

+							continue;

+						}

+					}

 					response = RestClient.sendRequest(request);

 					if (!response.getResponseStatusCode().equals(ResponseStatusCode.TARGET_NOT_REACHABLE)) {

 						done = true;

diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Router.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Router.java
index 96e3b5f..9fcc97d 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Router.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Router.java
@@ -132,6 +132,10 @@
 			}
 
 			// URI Handling
+			if(request.getTo() == null && request.getTargetId() == null){
+				throw new BadRequestException("No To parameter provided provided");
+			}
+			
 			if(request.getTargetId() == null){
 				request.setTargetId(request.getTo());
 			}
@@ -400,8 +404,10 @@
 			
 			if(request.getTo() == null){
 				request.setTo(request.getTargetId().split("\\?")[0]);
-				request.setTargetId(request.getTo());
+			} else {
+				request.setTo(request.getTo().split("\\?")[0]);
 			}
+			request.setTargetId(request.getTo());
 		}
 
 	}
diff --git a/org.eclipse.om2m.das.testsuite/.project b/org.eclipse.om2m.das.testsuite/.project
index 1ec250b..42c8752 100644
--- a/org.eclipse.om2m.das.testsuite/.project
+++ b/org.eclipse.om2m.das.testsuite/.project
@@ -11,11 +11,6 @@
 			</arguments>

 		</buildCommand>

 		<buildCommand>

-			<name>org.eclipse.m2e.core.maven2Builder</name>

-			<arguments>

-			</arguments>

-		</buildCommand>

-		<buildCommand>

 			<name>org.eclipse.pde.ManifestBuilder</name>

 			<arguments>

 			</arguments>

@@ -25,6 +20,11 @@
 			<arguments>

 			</arguments>

 		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.m2e.core.maven2Builder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

 	</buildSpec>

 	<natures>

 		<nature>org.eclipse.m2e.core.maven2Nature</nature>

diff --git a/org.eclipse.om2m.datamapping.jaxb/src/main/resources/xml-binding.xml b/org.eclipse.om2m.datamapping.jaxb/src/main/resources/xml-binding.xml
index 86c1e3d..af99631 100644
--- a/org.eclipse.om2m.datamapping.jaxb/src/main/resources/xml-binding.xml
+++ b/org.eclipse.om2m.datamapping.jaxb/src/main/resources/xml-binding.xml
@@ -46,6 +46,19 @@
 			</java-attributes>
 		</java-type>
 
+        <!--  Request and Response Descriptions -->
+        <java-type name="RequestPrimitive">
+            <xml-root-element name="m2m:rqp"/>
+        </java-type>
+        
+        <java-type name="PrimitiveContent">
+            <xml-root-element name="pc"/>
+        </java-type>
+        
+        <java-type name="ResponsePrimitive">
+            <xml-root-element name="m2m:rsp"/>
+        </java-type>
+
 		<!-- CSE Descriptions -->
 		<java-type name="CSEBase">
 			<java-attributes>
diff --git a/org.eclipse.om2m.persistence.mongodb/.classpath b/org.eclipse.om2m.persistence.mongodb/.classpath
index d0ee0e3..00834bc 100644
--- a/org.eclipse.om2m.persistence.mongodb/.classpath
+++ b/org.eclipse.om2m.persistence.mongodb/.classpath
@@ -1,9 +1,9 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<classpath>

-	<classpathentry kind="src" path="src/main/java"/>

-	<classpathentry exported="true" kind="lib" path="libs/gson-2.2.4.jar"/>

-	<classpathentry exported="true" kind="lib" path="libs/mongo-java-driver-3.4.2.jar"/>

-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7"/>

-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

-	<classpathentry kind="output" path="target/classes"/>

-</classpath>

+<?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.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry exported="true" kind="lib" path="libs/gson-2.2.4.jar"/>
+	<classpathentry exported="true" kind="lib" path="libs/mongo-java-driver-3.4.2.jar"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.om2m.persistence.mongodb/.project b/org.eclipse.om2m.persistence.mongodb/.project
index 5d1ce52..0ff3133 100644
--- a/org.eclipse.om2m.persistence.mongodb/.project
+++ b/org.eclipse.om2m.persistence.mongodb/.project
@@ -11,11 +11,6 @@
 			</arguments>

 		</buildCommand>

 		<buildCommand>

-			<name>org.eclipse.m2e.core.maven2Builder</name>

-			<arguments>

-			</arguments>

-		</buildCommand>

-		<buildCommand>

 			<name>org.eclipse.pde.ManifestBuilder</name>

 			<arguments>

 			</arguments>

@@ -25,6 +20,11 @@
 			<arguments>

 			</arguments>

 		</buildCommand>

+		<buildCommand>

+			<name>org.eclipse.m2e.core.maven2Builder</name>

+			<arguments>

+			</arguments>

+		</buildCommand>

 	</buildSpec>

 	<natures>

 		<nature>org.eclipse.m2e.core.maven2Nature</nature>

diff --git a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.lifx/.classpath b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.lifx/.classpath
index 4b1a019..b82e582 100644
--- a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.lifx/.classpath
+++ b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.lifx/.classpath
@@ -1,14 +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.7">

-		<attributes>

-			<attribute name="maven.pomderived" value="true"/>

-		</attributes>

-	</classpathentry>

-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

-	<classpathentry kind="src" path="src/main/java"/>

-	<classpathentry kind="src" path="src/test/java"/>

-	<classpathentry exported="true" kind="lib" path="lib/json-simple-1.1.1.jar"/>

-	<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.2/junit-3.8.2.jar"/>

-	<classpathentry kind="output" path="target/classes"/>

-</classpath>

+<?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.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry exported="true" kind="lib" path="lib/json-simple-1.1.1.jar"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.netatmo/.classpath b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.netatmo/.classpath
index 4b1a019..b82e582 100644
--- a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.netatmo/.classpath
+++ b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.netatmo/.classpath
@@ -1,14 +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.7">

-		<attributes>

-			<attribute name="maven.pomderived" value="true"/>

-		</attributes>

-	</classpathentry>

-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

-	<classpathentry kind="src" path="src/main/java"/>

-	<classpathentry kind="src" path="src/test/java"/>

-	<classpathentry exported="true" kind="lib" path="lib/json-simple-1.1.1.jar"/>

-	<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.2/junit-3.8.2.jar"/>

-	<classpathentry kind="output" path="target/classes"/>

-</classpath>

+<?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.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry exported="true" kind="lib" path="lib/json-simple-1.1.1.jar"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.smartercoffee/.classpath b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.smartercoffee/.classpath
index 99516b1..98ddc48 100644
--- a/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.smartercoffee/.classpath
+++ b/org.eclipse.om2m.sdt/org.eclipse.om2m.sdt.home.smartercoffee/.classpath
@@ -1,13 +1,7 @@
-<?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.7">

-		<attributes>

-			<attribute name="maven.pomderived" value="true"/>

-		</attributes>

-	</classpathentry>

-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>

-	<classpathentry kind="src" path="src/main/java"/>

-	<classpathentry kind="src" path="src/test/java"/>

-	<classpathentry kind="var" path="M2_REPO/junit/junit/3.8.2/junit-3.8.2.jar"/>

-	<classpathentry kind="output" path="target/classes"/>

-</classpath>

+<?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.7"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src/main/java/"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.om2m.site.in-cse/om2m.product b/org.eclipse.om2m.site.in-cse/om2m.product
index 86997e9..8970d53 100644
--- a/org.eclipse.om2m.site.in-cse/om2m.product
+++ b/org.eclipse.om2m.site.in-cse/om2m.product
@@ -1,135 +1,135 @@
-<?xml version="1.0" encoding="UTF-8"?>

-<?pde version="3.5"?>

-

-<product uid="in-cse" version="1.0.0" useFeatures="false" includeLaunchers="false">

-

-   <configIni use="default">

-   </configIni>

-

-   <launcherArgs>

-      <programArgs>-console -noExit --launcher.secondThread

-      </programArgs>

-      <vmArgs>-ea  -Declipse.ignoreApp=true -Dosgi.clean=true -Ddebug=true

-      </vmArgs>

-      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts

-      </vmArgsMac>

-   </launcherArgs>

-

-   <windowImages/>

-

-   <launcher name="in-cse">

-      <win useIco="false">

-         <bmp/>

-      </win>

-   </launcher>

-

-   <vm>

-      <linux include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7</linux>

-      <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7</windows>

-   </vm>

-

-   <plugins>

-      <plugin id="javax.servlet"/>

-      <plugin id="javax.xml"/>

-      <plugin id="org.apache.commons.codec"/>

-      <plugin id="org.apache.commons.logging"/>

-      <plugin id="org.apache.felix.gogo.command"/>

-      <plugin id="org.apache.felix.gogo.runtime"/>

-      <plugin id="org.apache.felix.gogo.shell"/>

-      <plugin id="org.apache.httpcomponents.httpclient"/>

-      <plugin id="org.apache.httpcomponents.httpcore"/>

-      <plugin id="org.eclipse.equinox.cm"/>

-      <plugin id="org.eclipse.equinox.console"/>

-      <plugin id="org.eclipse.equinox.ds"/>

-      <plugin id="org.eclipse.equinox.event"/>

-      <plugin id="org.eclipse.equinox.http.jetty"/>

-      <plugin id="org.eclipse.equinox.http.servlet"/>

-      <plugin id="org.eclipse.equinox.launcher"/>

-      <plugin id="org.eclipse.jetty.continuation"/>

-      <plugin id="org.eclipse.jetty.http"/>

-      <plugin id="org.eclipse.jetty.io"/>

-      <plugin id="org.eclipse.jetty.security"/>

-      <plugin id="org.eclipse.jetty.server"/>

-      <plugin id="org.eclipse.jetty.servlet"/>

-      <plugin id="org.eclipse.jetty.util"/>

-      <plugin id="org.eclipse.om2m.binding.coap"/>

-      <plugin id="org.eclipse.om2m.binding.http"/>

-      <plugin id="org.eclipse.om2m.binding.service"/>

-      <plugin id="org.eclipse.om2m.commons"/>

-      <plugin id="org.eclipse.om2m.commons.logging" fragment="true"/>

-      <plugin id="org.eclipse.om2m.core"/>

-      <plugin id="org.eclipse.om2m.core.service"/>

-      <plugin id="org.eclipse.om2m.das.testsuite"/>

-      <plugin id="org.eclipse.om2m.datamapping.jaxb"/>

-      <plugin id="org.eclipse.om2m.datamapping.service"/>

-      <plugin id="org.eclipse.om2m.ipe.sdt"/>

-      <!--plugin id="org.eclipse.om2m.ipe.sdt.testsuite"/-->

-      <plugin id="org.eclipse.om2m.persistence.eclipselink"/>

-      <plugin id="org.eclipse.om2m.persistence.mongodb"/>

-      <plugin id="org.eclipse.om2m.persistence.service"/>

-      <plugin id="org.eclipse.om2m.sdt.api"/>

-      <plugin id="org.eclipse.om2m.sdt.home"/>

-      <plugin id="org.eclipse.om2m.sdt.home.driver"/>

-      <plugin id="org.eclipse.om2m.sdt.home.mocked.devices"/>

-      <plugin id="org.eclipse.om2m.sdt.home.monitoring"/>

-      <plugin id="org.eclipse.om2m.sdt.comparator.xml"/>

-      <!--plugin id="org.eclipse.om2m.testsuite.flexcontainer"/-->

-      <plugin id="org.eclipse.om2m.webapp.resourcesbrowser.json"/>

-      <plugin id="org.eclipse.om2m.webapp.resourcesbrowser.xml"/>

-      <plugin id="org.eclipse.osgi"/>

-      <plugin id="org.eclipse.osgi.services"/>

-   </plugins>

-

-   <configurations>

-      <plugin id="org.apache.felix.gogo.command" autoStart="true" startLevel="0" />

-      <plugin id="org.apache.felix.gogo.runtime" autoStart="true" startLevel="0" />

-      <plugin id="org.apache.felix.gogo.shell" autoStart="true" startLevel="0" />

-      <plugin id="org.eclipse.equinox.cm" autoStart="true" startLevel="1" />

-      <plugin id="org.eclipse.equinox.console" autoStart="true" startLevel="0" />

-      <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="1" />

-      <plugin id="org.eclipse.equinox.event" autoStart="true" startLevel="1" />

-      <plugin id="org.eclipse.equinox.http.jetty" autoStart="true" startLevel="1" />

-      <plugin id="org.eclipse.om2m.binding.coap" autoStart="true" startLevel="2" />

-      <plugin id="org.eclipse.om2m.binding.http" autoStart="true" startLevel="2" />

-      <plugin id="org.eclipse.om2m.core" autoStart="true" startLevel="3" />

-      <plugin id="org.eclipse.om2m.das.testsuite" autoStart="false" startLevel="6" />

-      <plugin id="org.eclipse.om2m.datamapping.jaxb" autoStart="true" startLevel="1" />

-      <plugin id="org.eclipse.om2m.ipe.sdt" autoStart="true" startLevel="6" />

-      <!--plugin id="org.eclipse.om2m.ipe.sdt.testsuite" autoStart="false" startLevel="6" /-->

-      <plugin id="org.eclipse.om2m.persistence.eclipselink" autoStart="true" startLevel="2" />

-      <plugin id="org.eclipse.om2m.persistence.mongodb" autoStart="false" startLevel="2" />

-      <plugin id="org.eclipse.om2m.sdt.api" autoStart="true" startLevel="5" />

-      <plugin id="org.eclipse.om2m.sdt.home" autoStart="true" startLevel="5" />

-      <plugin id="org.eclipse.om2m.sdt.home.driver" autoStart="true" startLevel="5" />

-      <plugin id="org.eclipse.om2m.sdt.home.mocked.devices" autoStart="false" startLevel="5" />

-      <plugin id="org.eclipse.om2m.sdt.home.monitoring" autoStart="false" startLevel="5" />

-      <plugin id="org.eclipse.om2m.sdt.comparator.xml" autoStart="false" startLevel="5"/>

-      <!--plugin id="org.eclipse.om2m.testsuite.flexcontainer" autoStart="false" startLevel="6" /-->

-      <plugin id="org.eclipse.om2m.webapp.resourcesbrowser.json" autoStart="true" startLevel="4" />

-      <plugin id="org.eclipse.om2m.webapp.resourcesbrowser.xml" autoStart="false" startLevel="4" />

-      <property name="log4j.configuration" value="file:./log4j.configuration" />

-      <property name="org.apache.commons.logging.Log" value="org.apache.commons.logging.impl.Log4JLogger" />

-      <property name="org.eclipse.equinox.http.jetty.http.port" value="8080" />

-      <property name="org.eclipse.om2m.adminRequestingEntity" value="admin:admin" />

-      <property name="org.eclipse.om2m.coap.port" value="5683" />

-      <property name="org.eclipse.om2m.cseBaseAddress" value="127.0.0.1" />

-      <property name="org.eclipse.om2m.cseBaseContext" value="/" />

-      <property name="org.eclipse.om2m.cseBaseId" value="in-cse" />

-      <property name="org.eclipse.om2m.cseBaseName" value="in-name" />

-      <property name="org.eclipse.om2m.cseBaseProtocol.default" value="http" />

-      <property name="org.eclipse.om2m.cseType" value="IN-CSE" />

-      <property name="org.eclipse.om2m.dbDriver" value="org.h2.Driver" />

-      <property name="org.eclipse.om2m.dbPassword" value="om2m" />

-      <property name="org.eclipse.om2m.dbReset" value="true" />

-      <property name="org.eclipse.om2m.dbUrl" value="jdbc:h2:./data/mndb" />

-      <property name="org.eclipse.om2m.dbUrl_mongodb" value="127.0.0.1" />

-      <property name="org.eclipse.om2m.dbUser" value="om2m" />

-      <property name="org.eclipse.om2m.globalContext" value="" />

-      <property name="org.eclipse.om2m.guestRequestingEntity" value="guest:guest" />

-      <property name="org.eclipse.om2m.m2mSpId" value="om2m.org" />

-      <property name="org.eclipse.om2m.resource.idseparator" value="-" />

-      <property name="org.eclipse.om2m.subscriptions.nbOfFailedNotificationsBeforeDeletion" value="3" />

-      <property name="org.eclipse.om2m.webInterfaceContext" value="/webpage" />

-   </configurations>

-

-</product>

+<?xml version="1.0" encoding="UTF-8"?>
+<?pde version="3.5"?>
+
+<product uid="in-cse" version="1.0.0" useFeatures="false" includeLaunchers="false">
+
+   <configIni use="default">
+   </configIni>
+
+   <launcherArgs>
+      <programArgs>-console -noExit --launcher.secondThread
+      </programArgs>
+      <vmArgs>-ea  -Declipse.ignoreApp=true -Dosgi.clean=true -Ddebug=true
+      </vmArgs>
+      <vmArgsMac>-XstartOnFirstThread -Dorg.eclipse.swt.internal.carbon.smallFonts
+      </vmArgsMac>
+   </launcherArgs>
+
+   <windowImages/>
+
+   <launcher name="in-cse">
+      <win useIco="false">
+         <bmp/>
+      </win>
+   </launcher>
+
+   <vm>
+      <linux include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7</linux>
+      <windows include="false">org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.7</windows>
+   </vm>
+
+   <plugins>
+      <plugin id="javax.servlet"/>
+      <plugin id="javax.xml"/>
+      <plugin id="org.apache.commons.codec"/>
+      <plugin id="org.apache.commons.logging"/>
+      <plugin id="org.apache.felix.gogo.command"/>
+      <plugin id="org.apache.felix.gogo.runtime"/>
+      <plugin id="org.apache.felix.gogo.shell"/>
+      <plugin id="org.apache.httpcomponents.httpclient"/>
+      <plugin id="org.apache.httpcomponents.httpcore"/>
+      <plugin id="org.eclipse.equinox.cm"/>
+      <plugin id="org.eclipse.equinox.console"/>
+      <plugin id="org.eclipse.equinox.ds"/>
+      <plugin id="org.eclipse.equinox.event"/>
+      <plugin id="org.eclipse.equinox.http.jetty"/>
+      <plugin id="org.eclipse.equinox.http.servlet"/>
+      <plugin id="org.eclipse.equinox.launcher"/>
+      <plugin id="org.eclipse.jetty.continuation"/>
+      <plugin id="org.eclipse.jetty.http"/>
+      <plugin id="org.eclipse.jetty.io"/>
+      <plugin id="org.eclipse.jetty.security"/>
+      <plugin id="org.eclipse.jetty.server"/>
+      <plugin id="org.eclipse.jetty.servlet"/>
+      <plugin id="org.eclipse.jetty.util"/>
+      <plugin id="org.eclipse.om2m.binding.coap"/>
+      <plugin id="org.eclipse.om2m.binding.http"/>
+      <plugin id="org.eclipse.om2m.binding.service"/>
+      <plugin id="org.eclipse.om2m.commons"/>
+      <plugin id="org.eclipse.om2m.commons.logging" fragment="true"/>
+      <plugin id="org.eclipse.om2m.core"/>
+      <plugin id="org.eclipse.om2m.core.service"/>
+      <plugin id="org.eclipse.om2m.das.testsuite"/>
+      <plugin id="org.eclipse.om2m.datamapping.jaxb"/>
+      <plugin id="org.eclipse.om2m.datamapping.service"/>
+      <plugin id="org.eclipse.om2m.ipe.sdt"/>
+      <!--plugin id="org.eclipse.om2m.ipe.sdt.testsuite"/-->
+      <plugin id="org.eclipse.om2m.persistence.eclipselink"/>
+      <plugin id="org.eclipse.om2m.persistence.mongodb"/>
+      <plugin id="org.eclipse.om2m.persistence.service"/>
+      <plugin id="org.eclipse.om2m.sdt.api"/>
+      <plugin id="org.eclipse.om2m.sdt.home"/>
+      <plugin id="org.eclipse.om2m.sdt.home.driver"/>
+      <plugin id="org.eclipse.om2m.sdt.home.mocked.devices"/>
+      <plugin id="org.eclipse.om2m.sdt.home.monitoring"/>
+      <plugin id="org.eclipse.om2m.sdt.comparator.xml"/>
+      <!--plugin id="org.eclipse.om2m.testsuite.flexcontainer"/-->
+      <plugin id="org.eclipse.om2m.webapp.resourcesbrowser.json"/>
+      <plugin id="org.eclipse.om2m.webapp.resourcesbrowser.xml"/>
+      <plugin id="org.eclipse.osgi"/>
+      <plugin id="org.eclipse.osgi.services"/>
+   </plugins>
+
+   <configurations>
+      <plugin id="org.apache.felix.gogo.command" autoStart="true" startLevel="0" />
+      <plugin id="org.apache.felix.gogo.runtime" autoStart="true" startLevel="0" />
+      <plugin id="org.apache.felix.gogo.shell" autoStart="true" startLevel="0" />
+      <plugin id="org.eclipse.equinox.cm" autoStart="true" startLevel="1" />
+      <plugin id="org.eclipse.equinox.console" autoStart="true" startLevel="0" />
+      <plugin id="org.eclipse.equinox.ds" autoStart="true" startLevel="1" />
+      <plugin id="org.eclipse.equinox.event" autoStart="true" startLevel="1" />
+      <plugin id="org.eclipse.equinox.http.jetty" autoStart="true" startLevel="1" />
+      <plugin id="org.eclipse.om2m.binding.coap" autoStart="true" startLevel="2" />
+      <plugin id="org.eclipse.om2m.binding.http" autoStart="true" startLevel="2" />
+      <plugin id="org.eclipse.om2m.core" autoStart="true" startLevel="3" />
+      <plugin id="org.eclipse.om2m.das.testsuite" autoStart="false" startLevel="6" />
+      <plugin id="org.eclipse.om2m.datamapping.jaxb" autoStart="true" startLevel="1" />
+      <plugin id="org.eclipse.om2m.ipe.sdt" autoStart="true" startLevel="6" />
+      <!--plugin id="org.eclipse.om2m.ipe.sdt.testsuite" autoStart="false" startLevel="6" /-->
+      <plugin id="org.eclipse.om2m.persistence.eclipselink" autoStart="true" startLevel="2" />
+      <plugin id="org.eclipse.om2m.persistence.mongodb" autoStart="false" startLevel="2" />
+      <plugin id="org.eclipse.om2m.sdt.api" autoStart="true" startLevel="5" />
+      <plugin id="org.eclipse.om2m.sdt.home" autoStart="true" startLevel="5" />
+      <plugin id="org.eclipse.om2m.sdt.home.driver" autoStart="true" startLevel="5" />
+      <plugin id="org.eclipse.om2m.sdt.home.mocked.devices" autoStart="false" startLevel="5" />
+      <plugin id="org.eclipse.om2m.sdt.home.monitoring" autoStart="false" startLevel="5" />
+      <plugin id="org.eclipse.om2m.sdt.comparator.xml" autoStart="false" startLevel="5"/>
+      <!--plugin id="org.eclipse.om2m.testsuite.flexcontainer" autoStart="false" startLevel="6" /-->
+      <plugin id="org.eclipse.om2m.webapp.resourcesbrowser.json" autoStart="true" startLevel="4" />
+      <plugin id="org.eclipse.om2m.webapp.resourcesbrowser.xml" autoStart="false" startLevel="4" />
+      <property name="log4j.configuration" value="file:./log4j.configuration" />
+      <property name="org.apache.commons.logging.Log" value="org.apache.commons.logging.impl.Log4JLogger" />
+      <property name="org.eclipse.equinox.http.jetty.http.port" value="8080" />
+      <property name="org.eclipse.om2m.adminRequestingEntity" value="admin:admin" />
+      <property name="org.eclipse.om2m.coap.port" value="5683" />
+      <property name="org.eclipse.om2m.cseBaseAddress" value="127.0.0.1" />
+      <property name="org.eclipse.om2m.cseBaseContext" value="/" />
+      <property name="org.eclipse.om2m.cseBaseId" value="in-cse" />
+      <property name="org.eclipse.om2m.cseBaseName" value="in-name" />
+      <property name="org.eclipse.om2m.cseBaseProtocol.default" value="http" />
+      <property name="org.eclipse.om2m.cseType" value="IN-CSE" />
+      <property name="org.eclipse.om2m.dbDriver" value="org.h2.Driver" />
+      <property name="org.eclipse.om2m.dbPassword" value="om2m" />
+      <property name="org.eclipse.om2m.dbReset" value="true" />
+      <property name="org.eclipse.om2m.dbUrl" value="jdbc:h2:./data/mndb" />
+      <property name="org.eclipse.om2m.dbUrl_mongodb" value="127.0.0.1" />
+      <property name="org.eclipse.om2m.dbUser" value="om2m" />
+      <property name="org.eclipse.om2m.globalContext" value="" />
+      <property name="org.eclipse.om2m.guestRequestingEntity" value="guest:guest" />
+      <property name="org.eclipse.om2m.m2mSpId" value="om2m.org" />
+      <property name="org.eclipse.om2m.resource.idseparator" value="-" />
+      <property name="org.eclipse.om2m.subscriptions.nbOfFailedNotificationsBeforeDeletion" value="3" />
+      <property name="org.eclipse.om2m.webInterfaceContext" value="/webpage" />
+   </configurations>
+
+</product>
diff --git a/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/AccessControlPolicyTest.java b/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/AccessControlPolicyTest.java
index 1bfd494..b35e332 100644
--- a/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/AccessControlPolicyTest.java
+++ b/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/AccessControlPolicyTest.java
@@ -1,269 +1,270 @@
-/*******************************************************************************

- * Copyright (c) 2014, 2016 Orange.

- * All rights reserved. This program and the accompanying materials

- * are made available under the terms of the Eclipse Public License v1.0

- * which accompanies this distribution, and is available at

- * http://www.eclipse.org/legal/epl-v10.html

- *******************************************************************************/

-package org.eclipse.om2m.testsuite.flexcontainer;

-

-import org.eclipse.om2m.commons.constants.AccessControl;

-import org.eclipse.om2m.commons.constants.Constants;

-import org.eclipse.om2m.commons.constants.ResponseStatusCode;

-import org.eclipse.om2m.commons.resource.AccessControlPolicy;

-import org.eclipse.om2m.commons.resource.AccessControlRule;

-import org.eclipse.om2m.commons.resource.CustomAttribute;

-import org.eclipse.om2m.commons.resource.ResponsePrimitive;

-import org.eclipse.om2m.commons.resource.SetOfAcrs;

-import org.eclipse.om2m.commons.resource.flexcontainerspec.BinarySwitchFlexContainer;

-import org.eclipse.om2m.core.service.CseService;

-import org.eclipse.om2m.testsuite.flexcontainer.TestReport.Status;

-

-public class AccessControlPolicyTest extends FlexContainerTestSuite {

-

-	public AccessControlPolicyTest(final CseService pCseService) {

-		super(pCseService);

-	}

-

-	@Override

-	protected String getTestSuiteName() {

-		return "AccessControlPolicyTest";

-	}

-

-	public void testCreateAccessControlPolicy() {

-

-		String acpName = "acp_" + System.currentTimeMillis();

-		AccessControlPolicy acp = new AccessControlPolicy();

-		acp.setName(acpName);

-		SetOfAcrs privileges = new SetOfAcrs();

-		AccessControlRule accessControlRule = new AccessControlRule();

-		accessControlRule.getAccessControlOriginators().add("greg:greg");

-		// accessControlRule.getAccessControlOriginators().add("admin:admin");

-		accessControlRule.setAccessControlOperations(AccessControl.ALL);

-		privileges.getAccessControlRule().add(accessControlRule);

-		acp.setPrivileges(privileges);

-

-		SetOfAcrs selfPrivileges = new SetOfAcrs();

-		AccessControlRule selfAccessControlRule = new AccessControlRule();

-		selfAccessControlRule.getAccessControlOriginators().add("admin:admin");

-		selfAccessControlRule.setAccessControlOperations(AccessControl.ALL);

-		selfPrivileges.getAccessControlRule().add(selfAccessControlRule);

-		acp.setSelfPrivileges(selfPrivileges);

-

-		String baseLocation = "/" + Constants.CSE_ID + "/" + Constants.CSE_NAME;

-		

-		String acpLocation = baseLocation + "/" + acpName;

-

-		ResponsePrimitive response = sendCreateAccessControlPolicyRequest(acp, baseLocation);

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {

-			// KO

-			createTestReport("testAccessControlPolicy", Status.KO, "unable to create a new acp", null);

-			return;

-		}

-		// here are sure the ACP has been created

-		AccessControlPolicy returnedAcp = (AccessControlPolicy) response.getContent();

-

-		// init a new FlexContainer

-		BinarySwitchFlexContainer flexContainer = new BinarySwitchFlexContainer();

-		CustomAttribute ca = new CustomAttribute();

-		ca.setCustomAttributeName("powSe");

-		ca.setCustomAttributeValue("false");

-		flexContainer.getCustomAttributes().add(ca);

-		String flexContainerName = "flexContainerACPTest_" + System.currentTimeMillis();

-		flexContainer.setName(flexContainerName);

-		String flexContainerLocation = baseLocation + "/" + flexContainerName;

-

-		// set acp

-		flexContainer.getAccessControlPolicyIDs().add(returnedAcp.getResourceID());

-

-		// send create FlexContainer request

-		response = sendCreateFlexContainerRequest(flexContainer, baseLocation, Constants.ADMIN_REQUESTING_ENTITY);

-		BinarySwitchFlexContainer createdFlexContainer = null;

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {

-			// KO

-			createTestReport("testAccessControlPolicy", Status.KO, "unable to create a FlexContainer", null);

-			return;

-		} else {

-			createdFlexContainer = (BinarySwitchFlexContainer) response.getContent();

-		}

-

-		// retrieve the flexContainer with greg:greg credentials

-		response = sendRetrieveRequest(flexContainerLocation, "greg:greg");

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.OK)) {

-			// KO

-			createTestReport("testAccessControlPolicy", Status.KO, "unable to retrieve the FlexContainer", null);

-			return;

-		} else {

-			BinarySwitchFlexContainer toBeRetrieved = (BinarySwitchFlexContainer) response.getContent();

-			try {

-				checkFlexContainer(createdFlexContainer, toBeRetrieved);

-			} catch (Exception e) {

-				// KO

-				createTestReport("testAccessControlPolicy", Status.KO, "flexContainer are differents", null);

-				return;

-			}

-		}

-

-		// retrieve the flexContainer with admin:admin, expected FORBIDDEN

-		response = sendRetrieveRequest(flexContainerLocation, Constants.ADMIN_REQUESTING_ENTITY);

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.ACCESS_DENIED)) {

-			// KO

-			createTestReport("testAccessControlPolicy", Status.KO,

-					"expected " + ResponseStatusCode.ACCESS_DENIED + ", received:" + response.getResponseStatusCode(),

-					null);

-			return;

-		}

-

-		createTestReport("testAccessControlPolicy", Status.OK, null, null);

-

-	}

-

-	public void testCreateFlexContainerWithNoRight() {

-		// create an ACP for greg:greg with RETRIEVE rights

-		String acpName = "acp_" + System.currentTimeMillis();

-		AccessControlPolicy acp = new AccessControlPolicy();

-		acp.setName(acpName);

-		SetOfAcrs privileges = new SetOfAcrs();

-		AccessControlRule accessControlRule = new AccessControlRule();

-		accessControlRule.getAccessControlOriginators().add("greg:greg");

-		// accessControlRule.getAccessControlOriginators().add("admin:admin");

-		accessControlRule.setAccessControlOperations(AccessControl.RETRIEVE);

-		privileges.getAccessControlRule().add(accessControlRule);

-		acp.setPrivileges(privileges);

-

-		SetOfAcrs selfPrivileges = new SetOfAcrs();

-		AccessControlRule selfAccessControlRule = new AccessControlRule();

-		selfAccessControlRule.getAccessControlOriginators().add("admin:admin");

-		selfAccessControlRule.setAccessControlOperations(AccessControl.ALL);

-		selfPrivileges.getAccessControlRule().add(selfAccessControlRule);

-		acp.setSelfPrivileges(selfPrivileges);

-

-		String baseLocation = "/" + Constants.CSE_ID + "/" + Constants.CSE_NAME;

-		

-		String acpLocation = baseLocation + "/" + acpName;

-

-		ResponsePrimitive response = sendCreateAccessControlPolicyRequest(acp, baseLocation);

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {

-			// KO

-			createTestReport("testCreateFlexContainerWithNoRight", Status.KO, "unable to create a new acp", null);

-			return;

-		}

-		// here are sure the ACP has been created

-		AccessControlPolicy returnedAcp = (AccessControlPolicy) response.getContent();

-

-		// init a new FlexContainer

-		String flexContainerName = "flexContainerACPTest_" + System.currentTimeMillis();

-		BinarySwitchFlexContainer flexContainer = new BinarySwitchFlexContainer();

-		flexContainer.setName(flexContainerName);

-		CustomAttribute ca = new CustomAttribute();

-		ca.setCustomAttributeName("powSe");

-		ca.setCustomAttributeValue("false");

-		flexContainer.getCustomAttributes().add(ca);

-		

-		String flexContainerLocation = baseLocation + "/" + flexContainerName;

-

-		// try to create a FlexContainer using greg:greg credentials => expect

-		// ACCESS DENIED

-		response = sendCreateFlexContainerRequest(flexContainer, baseLocation, "greg:greg");

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.ACCESS_DENIED)) {

-			// KO

-			createTestReport(

-					"testCreateFlexContainerWithNoRight", Status.KO, "error : expected "

-							+ ResponseStatusCode.ACCESS_DENIED + ", received:" + response.getResponseStatusCode(),

-					null);

-			return;

-		}

-

-		createTestReport("testCreateFlexContainerWithNoRight", Status.OK, null, null);

-	}

-

-	public void testDeleteFlexContainerWithNoRight() {

-		// create an ACP for greg:greg with RETRIEVE rights

-		String acpName = "acp_" + System.currentTimeMillis();

-		AccessControlPolicy acp = new AccessControlPolicy();

-		acp.setName(acpName);

-		SetOfAcrs privileges = new SetOfAcrs();

-		AccessControlRule accessControlRule = new AccessControlRule();

-		accessControlRule.getAccessControlOriginators().add("greg:greg");

-		// accessControlRule.getAccessControlOriginators().add("admin:admin");

-		accessControlRule.setAccessControlOperations(AccessControl.RETRIEVE);

-		privileges.getAccessControlRule().add(accessControlRule);

-		acp.setPrivileges(privileges);

-

-		SetOfAcrs selfPrivileges = new SetOfAcrs();

-		AccessControlRule selfAccessControlRule = new AccessControlRule();

-		selfAccessControlRule.getAccessControlOriginators().add("admin:admin");

-		selfAccessControlRule.setAccessControlOperations(AccessControl.ALL);

-		selfPrivileges.getAccessControlRule().add(selfAccessControlRule);

-		acp.setSelfPrivileges(selfPrivileges);

-

-		String baseLocation = "/" + Constants.CSE_ID + "/" + Constants.CSE_NAME;

-		

-		String acpLocation = baseLocation + "/" + acpName;

-

-		ResponsePrimitive response = sendCreateAccessControlPolicyRequest(acp, baseLocation);

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {

-			// KO

-			createTestReport("testDeleteFlexContainerWithNoRight", Status.KO, "unable to create a new acp", null);

-			return;

-		} 

-		// here are sure the ACP has been created

-		AccessControlPolicy returnedAcp = (AccessControlPolicy) response.getContent();

-

-		// init a new FlexContainer

-		String flexContainerName = "flexContainerACPTest_" + System.currentTimeMillis();

-		BinarySwitchFlexContainer flexContainer = new BinarySwitchFlexContainer();

-		flexContainer.setName(flexContainerName);

-		flexContainer.setContainerDefinition("org.onem2m.home.moduleclass.binaryswitch");

-		CustomAttribute ca = new CustomAttribute();

-		ca.setCustomAttributeName("powSe");

-		ca.setCustomAttributeValue("false");

-		flexContainer.getCustomAttributes().add(ca);

-		

-		String flexContainerLocation = baseLocation + "/" + flexContainerName;

-

-		// try to create a FlexContainer using admin:admin credentials

-		BinarySwitchFlexContainer createdFlexContainer = null;

-		response = sendCreateFlexContainerRequest(flexContainer, baseLocation,

-				Constants.ADMIN_REQUESTING_ENTITY);

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {

-			// KO

-			createTestReport("testDeleteFlexContainerWithNoRight", Status.KO,

-					"error : expected " + ResponseStatusCode.CREATED + ", received:" + response.getResponseStatusCode(),

-					null);

-			return;

-		} else {

-			createdFlexContainer = (BinarySwitchFlexContainer) response.getContent();

-		}

-

-		// try to delete the flexContainer with greg:greg ==> expect

-		// ACCESS_DENIED

-		response = sendDeleteRequest(flexContainerLocation, "greg:greg");

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.ACCESS_DENIED)) {

-			createTestReport(

-					"testDeleteFlexContainerWithNoRight", Status.KO, "error : expected "

-							+ ResponseStatusCode.ACCESS_DENIED + ", received:" + response.getResponseStatusCode(),

-					null);

-			return;

-		}

-

-		// try to retrieve the FlexContainer using greg:greg credentials ==> ok

-		response = sendRetrieveRequest(flexContainerLocation, "greg:greg");

-		if (!response.getResponseStatusCode().equals(ResponseStatusCode.OK)) {

-			createTestReport("testDeleteFlexContainerWithNoRight", Status.KO, 

-					"error : expected " + ResponseStatusCode.OK + ", received:" + response.getResponseStatusCode(),

-					null);

-			return;

-		} else {

-			try {

-				checkFlexContainer(createdFlexContainer, (BinarySwitchFlexContainer) response.getContent());

-			} catch (Exception e) {

-				// KO

-				createTestReport("testDeleteFlexContainerWithNoRight", Status.KO,

-						"flexContainers are differents:" + e.getMessage(), e);

-			}

-		}

-

-		createTestReport("testDeleteFlexContainerWithNoRight", Status.OK, null, null);

-	}

-}

+/*******************************************************************************
+ * Copyright (c) 2014, 2016 Orange.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.om2m.testsuite.flexcontainer;
+
+import org.eclipse.om2m.commons.constants.AccessControl;
+import org.eclipse.om2m.commons.constants.Constants;
+import org.eclipse.om2m.commons.constants.ResponseStatusCode;
+import org.eclipse.om2m.commons.resource.AccessControlPolicy;
+import org.eclipse.om2m.commons.resource.AccessControlRule;
+import org.eclipse.om2m.commons.resource.CustomAttribute;
+import org.eclipse.om2m.commons.resource.ResponsePrimitive;
+import org.eclipse.om2m.commons.resource.SetOfAcrs;
+import org.eclipse.om2m.commons.resource.flexcontainerspec.BinarySwitchFlexContainer;
+import org.eclipse.om2m.core.service.CseService;
+import org.eclipse.om2m.testsuite.flexcontainer.TestReport.Status;
+
+public class AccessControlPolicyTest extends FlexContainerTestSuite {
+
+	public AccessControlPolicyTest(final CseService pCseService) {
+		super(pCseService);
+	}
+
+	@Override
+	protected String getTestSuiteName() {
+		return "AccessControlPolicyTest";
+	}
+
+	public void testCreateAccessControlPolicy() {
+
+		String acpName = "acp_" + System.currentTimeMillis();
+		AccessControlPolicy acp = new AccessControlPolicy();
+		acp.setName(acpName);
+		SetOfAcrs privileges = new SetOfAcrs();
+		AccessControlRule accessControlRule = new AccessControlRule();
+		accessControlRule.getAccessControlOriginators().add("greg:greg");
+		// accessControlRule.getAccessControlOriginators().add("admin:admin");
+		accessControlRule.setAccessControlOperations(AccessControl.ALL);
+		privileges.getAccessControlRule().add(accessControlRule);
+		acp.setPrivileges(privileges);
+
+		SetOfAcrs selfPrivileges = new SetOfAcrs();
+		AccessControlRule selfAccessControlRule = new AccessControlRule();
+		selfAccessControlRule.getAccessControlOriginators().add("admin:admin");
+		selfAccessControlRule.setAccessControlOperations(AccessControl.ALL);
+		selfPrivileges.getAccessControlRule().add(selfAccessControlRule);
+		acp.setSelfPrivileges(selfPrivileges);
+
+		String baseLocation = "/" + Constants.CSE_ID + "/" + Constants.CSE_NAME;
+		
+		String acpLocation = baseLocation + "/" + acpName;
+
+		ResponsePrimitive response = sendCreateAccessControlPolicyRequest(acp, baseLocation);
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {
+			// KO
+			createTestReport("testAccessControlPolicy", Status.KO, "unable to create a new acp", null);
+			return;
+		}
+		// here are sure the ACP has been created
+		AccessControlPolicy returnedAcp = (AccessControlPolicy) response.getContent();
+
+		// init a new FlexContainer
+		BinarySwitchFlexContainer flexContainer = new BinarySwitchFlexContainer();
+		CustomAttribute ca = new CustomAttribute();
+		ca.setCustomAttributeName("powSe");
+		ca.setCustomAttributeValue("false");
+		flexContainer.getCustomAttributes().add(ca);
+		String flexContainerName = "flexContainerACPTest_" + System.currentTimeMillis();
+		flexContainer.setName(flexContainerName);
+		String flexContainerLocation = baseLocation + "/" + flexContainerName;
+
+		// set acp
+		flexContainer.getAccessControlPolicyIDs().add(returnedAcp.getResourceID());
+
+		// send create FlexContainer request
+		response = sendCreateFlexContainerRequest(flexContainer, baseLocation, Constants.ADMIN_REQUESTING_ENTITY);
+		BinarySwitchFlexContainer createdFlexContainer = null;
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {
+			// KO
+			createTestReport("testAccessControlPolicy", Status.KO, "unable to create a FlexContainer", null);
+			return;
+		} else {
+			createdFlexContainer = (BinarySwitchFlexContainer) response.getContent();
+		}
+
+		// retrieve the flexContainer with greg:greg credentials
+		response = sendRetrieveRequest(flexContainerLocation, "greg:greg");
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.OK)) {
+			// KO
+			createTestReport("testAccessControlPolicy", Status.KO, "unable to retrieve the FlexContainer", null);
+			return;
+		} else {
+			BinarySwitchFlexContainer toBeRetrieved = (BinarySwitchFlexContainer) response.getContent();
+			try {
+				checkFlexContainer(createdFlexContainer, toBeRetrieved);
+			} catch (Exception e) {
+				// KO
+				createTestReport("testAccessControlPolicy", Status.KO, "flexContainer are differents", null);
+				return;
+			}
+		}
+
+		// retrieve the flexContainer with admin:admin, expected FORBIDDEN
+		response = sendRetrieveRequest(flexContainerLocation, Constants.ADMIN_REQUESTING_ENTITY);
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.ACCESS_DENIED)) {
+			// KO
+			createTestReport("testAccessControlPolicy", Status.KO,
+					"expected " + ResponseStatusCode.ACCESS_DENIED + ", received:" + response.getResponseStatusCode(),
+					null);
+			return;
+		}
+
+		createTestReport("testAccessControlPolicy", Status.OK, null, null);
+
+	}
+
+	public void testCreateFlexContainerWithNoRight() {
+		// create an ACP for greg:greg with RETRIEVE rights
+		String acpName = "acp_" + System.currentTimeMillis();
+		AccessControlPolicy acp = new AccessControlPolicy();
+		acp.setName(acpName);
+		SetOfAcrs privileges = new SetOfAcrs();
+		AccessControlRule accessControlRule = new AccessControlRule();
+		accessControlRule.getAccessControlOriginators().add("greg:greg");
+		// accessControlRule.getAccessControlOriginators().add("admin:admin");
+		accessControlRule.setAccessControlOperations(AccessControl.RETRIEVE);
+		privileges.getAccessControlRule().add(accessControlRule);
+		acp.setPrivileges(privileges);
+
+		SetOfAcrs selfPrivileges = new SetOfAcrs();
+		AccessControlRule selfAccessControlRule = new AccessControlRule();
+		selfAccessControlRule.getAccessControlOriginators().add("admin:admin");
+		selfAccessControlRule.setAccessControlOperations(AccessControl.ALL);
+		selfPrivileges.getAccessControlRule().add(selfAccessControlRule);
+		acp.setSelfPrivileges(selfPrivileges);
+
+		String baseLocation = "/" + Constants.CSE_ID + "/" + Constants.CSE_NAME;
+		
+		String acpLocation = baseLocation + "/" + acpName;
+
+		ResponsePrimitive response = sendCreateAccessControlPolicyRequest(acp, baseLocation);
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {
+			// KO
+			createTestReport("testCreateFlexContainerWithNoRight", Status.KO, "unable to create a new acp", null);
+			return;
+		}
+		// here are sure the ACP has been created
+		AccessControlPolicy returnedAcp = (AccessControlPolicy) response.getContent();
+
+		// init a new FlexContainer
+		String flexContainerName = "flexContainerACPTest_" + System.currentTimeMillis();
+		BinarySwitchFlexContainer flexContainer = new BinarySwitchFlexContainer();
+		flexContainer.setName(flexContainerName);
+		CustomAttribute ca = new CustomAttribute();
+		ca.setCustomAttributeName("powSe");
+		ca.setCustomAttributeValue("false");
+		flexContainer.getCustomAttributes().add(ca);
+		
+		String flexContainerLocation = baseLocation + "/" + flexContainerName;
+
+		// try to create a FlexContainer using greg:greg credentials => expect
+		// ACCESS DENIED
+		response = sendCreateFlexContainerRequest(flexContainer, baseLocation, "greg:greg");
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.ACCESS_DENIED)) {
+			// KO
+			createTestReport(
+					"testCreateFlexContainerWithNoRight", Status.KO, "error : expected "
+							+ ResponseStatusCode.ACCESS_DENIED + ", received:" + response.getResponseStatusCode(),
+					null);
+			return;
+		}
+
+		createTestReport("testCreateFlexContainerWithNoRight", Status.OK, null, null);
+	}
+
+	public void testDeleteFlexContainerWithNoRight() {
+		// create an ACP for greg:greg with RETRIEVE rights
+		String acpName = "acp_" + System.currentTimeMillis();
+		AccessControlPolicy acp = new AccessControlPolicy();
+		acp.setName(acpName);
+		SetOfAcrs privileges = new SetOfAcrs();
+		AccessControlRule accessControlRule = new AccessControlRule();
+		accessControlRule.getAccessControlOriginators().add("greg:greg");
+		// accessControlRule.getAccessControlOriginators().add("admin:admin");
+		accessControlRule.setAccessControlOperations(AccessControl.RETRIEVE);
+		privileges.getAccessControlRule().add(accessControlRule);
+		acp.setPrivileges(privileges);
+
+		SetOfAcrs selfPrivileges = new SetOfAcrs();
+		AccessControlRule selfAccessControlRule = new AccessControlRule();
+		selfAccessControlRule.getAccessControlOriginators().add("admin:admin");
+		selfAccessControlRule.setAccessControlOperations(AccessControl.ALL);
+		selfPrivileges.getAccessControlRule().add(selfAccessControlRule);
+		acp.setSelfPrivileges(selfPrivileges);
+
+		String baseLocation = "/" + Constants.CSE_ID + "/" + Constants.CSE_NAME;
+		
+		String acpLocation = baseLocation + "/" + acpName;
+
+		ResponsePrimitive response = sendCreateAccessControlPolicyRequest(acp, baseLocation);
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {
+			// KO
+			createTestReport("testDeleteFlexContainerWithNoRight", Status.KO, "unable to create a new acp", null);
+			return;
+		} 
+		// here are sure the ACP has been created
+		AccessControlPolicy returnedAcp = (AccessControlPolicy) response.getContent();
+
+		// init a new FlexContainer
+		String flexContainerName = "flexContainerACPTest_" + System.currentTimeMillis();
+		BinarySwitchFlexContainer flexContainer = new BinarySwitchFlexContainer();
+		flexContainer.setName(flexContainerName);
+		flexContainer.setContainerDefinition("org.onem2m.home.moduleclass.binaryswitch");
+		CustomAttribute ca = new CustomAttribute();
+		ca.setCustomAttributeName("powSe");
+		ca.setCustomAttributeValue("false");
+		flexContainer.getCustomAttributes().add(ca);
+		
+		String flexContainerLocation = baseLocation + "/" + flexContainerName;
+
+		// try to create a FlexContainer using admin:admin credentials
+		BinarySwitchFlexContainer createdFlexContainer = null;
+		response = sendCreateFlexContainerRequest(flexContainer, baseLocation,
+				Constants.ADMIN_REQUESTING_ENTITY);
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {
+			// KO
+			createTestReport("testDeleteFlexContainerWithNoRight", Status.KO,
+					"error : expected " + ResponseStatusCode.CREATED + ", received:" + response.getResponseStatusCode(),
+					null);
+			return;
+		} else {
+			createdFlexContainer = (BinarySwitchFlexContainer) response.getContent();
+		}
+
+		// try to delete the flexContainer with greg:greg ==> expect
+		// ACCESS_DENIED
+		response = sendDeleteRequest(flexContainerLocation, "greg:greg");
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.ACCESS_DENIED)) {
+			createTestReport(
+					"testDeleteFlexContainerWithNoRight", Status.KO, "error : expected "
+							+ ResponseStatusCode.ACCESS_DENIED + ", received:" + response.getResponseStatusCode(),
+					null);
+			return;
+		}
+
+		// try to retrieve the FlexContainer using greg:greg credentials ==> ok
+		response = sendRetrieveRequest(flexContainerLocation, "greg:greg");
+		if (!response.getResponseStatusCode().equals(ResponseStatusCode.OK)) {
+			createTestReport("testDeleteFlexContainerWithNoRight", Status.KO, 
+					"error : expected " + ResponseStatusCode.OK + ", received:" + response.getResponseStatusCode(),
+					null);
+			return;
+		} else {
+			try {
+				checkFlexContainer(createdFlexContainer, (BinarySwitchFlexContainer) response.getContent());
+			} catch (Exception e) {
+				// KO
+				createTestReport("testDeleteFlexContainerWithNoRight", Status.KO,
+						"flexContainers are differents:" + e.getMessage(), e);
+			}
+		}
+
+		createTestReport("testDeleteFlexContainerWithNoRight", Status.OK, null, null);
+	}
+}
+
diff --git a/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/Activator.java b/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/Activator.java
index 696101b..415794d 100644
--- a/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/Activator.java
+++ b/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/Activator.java
@@ -169,6 +169,7 @@
 			subscriptionTest.executeTestsAndPrintReports();

 		}

 		

+		

 		AccessControlPolicyTest acpTest = new AccessControlPolicyTest(currentCseService);

 		acpTest.executeTestsAndPrintReports();

 		tests.add(acpTest);

diff --git a/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/SubscriptionTest.java b/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/SubscriptionTest.java
index 9cfab53..99ccffe 100644
--- a/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/SubscriptionTest.java
+++ b/org.eclipse.om2m.testsuite.flexcontainer/src/main/java/org/eclipse/om2m/testsuite/flexcontainer/SubscriptionTest.java
@@ -9,7 +9,6 @@
 

 import java.util.List;

 

-import javax.servlet.ServletException;

 

 import org.eclipse.om2m.commons.constants.Constants;

 import org.eclipse.om2m.commons.constants.NotificationContentType;

@@ -26,6 +25,8 @@
 import org.eclipse.om2m.testsuite.flexcontainer.TestReport.Status;

 import org.osgi.service.http.HttpService;

 import org.osgi.service.http.NamespaceException;

+import javax.servlet.ServletException;

+

 

 public class SubscriptionTest extends FlexContainerTestSuite {

 

diff --git a/pom.xml b/pom.xml
index 8a6f4aa..acd3cbc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -127,6 +127,7 @@
 		<module>org.eclipse.om2m.commons.logging</module>
 		<module>org.eclipse.om2m.binding.http</module>
 		<module>org.eclipse.om2m.binding.coap</module>
+		<module>org.eclipse.om2m.binding.mqtt</module>
 		<module>org.eclipse.om2m.binding.service</module>
 		<module>org.eclipse.om2m.core.service</module>
 		<module>org.eclipse.om2m.datamapping.jaxb</module>