diff --git a/LibOneM2M/OneM2M_Functions.ttcn b/LibOneM2M/OneM2M_Functions.ttcn
index 281e102ffc3f34e31358401cc2a1c7a46fb97040..b5d0cc3f1554f8eb0f5229405cb38f7864112044 100644
--- a/LibOneM2M/OneM2M_Functions.ttcn
+++ b/LibOneM2M/OneM2M_Functions.ttcn
@@ -14,7 +14,7 @@ module OneM2M_Functions {
 	import from XSD all;
 	import from OneM2M_Templates all;
 	import from OneM2M_Types all;
-    import from OneM2M_Ports all;
+  import from OneM2M_Ports all;
 	import from OneM2M_TypesAndValues all;
 	import from OneM2M_TestSystem all;
 	import from OneM2M_Pixits all;
@@ -578,7 +578,48 @@ module OneM2M_Functions {
 
 			// Connect
 		}			
+
+		function f_cf07Up(in CseTypeID p_cseType := int2)  runs on CseSimu system AeSystem {
+    
+			// Variables
+			var charstring v_binding;
+			var charstring v_binding_in;
+			var PrimitiveContent v_cSEBaseResource;
+			var charstring v_host;
+			vc_cseSimuDesc := PX_TS_CSE1;	
+		
+			//Initialization of component variables
+			vc_config := e_cf07;
+			vc_testSystemRole := e_cse; 
+			vc_cseType := p_cseType;
+			
+			//Creation of CSEBase
+			v_cSEBaseResource := f_generateLocalResource(-, -1, int5);
+			vc_cSEBaseIndex := f_setLocalResource(v_cSEBaseResource, int5, -1);
+			
+			// Map
+			map(self:mcaPort, system:mcaPort) param (vc_cseSimuDesc.mcaPort);//TODO To be consistent, we should use mcaPortIn for AE testing
+			map(self:mcaPortIn, system:mcaPortIn) param (vc_cseSimuDesc.mcaPortIn);//TODO To be consistent, we should use mcaPortIn for AE testing
+			map(self:acPort, system:acPort);
+			
+
+			f_setProtocolBinding(vc_cseSimuDesc.mcaPort, vc_cseSimuDesc.mcaPortIn, v_binding, v_host, v_binding_in);
+     	 	
+			vc_myInterfaces[enum2int(valueof(InterfaceIds:e_mcaPort))] := { mcaPort, v_host, v_binding, vc_cseSimuDesc.mcaPort.serialization };
+      		vc_myInterfaces[enum2int(valueof(InterfaceIds:e_mcaPortIn))] := { mcaPortIn, v_host, v_binding_in, vc_cseSimuDesc.mcaPortIn.serialization };
+
+			if(PX_UT_IMPLEMENTED) {
+			  map(self:utPort, system:utPort) param (PX_TS_UT);
+			}
+			activate(a_default());
+			vc_cseSimu := activate(a_cse_cf07());
 			
+			// Connect
+          
+			//Initialze the IUT
+          
+		} // End of function f_cf07Up
+		
 		/**
 		 * @desc Ports unmapping
 		 */
@@ -730,6 +771,18 @@ module OneM2M_Functions {
 			unmap(vc_ae2:acPort, system:acPort);
 		}// end f_cf06DownCseSimuMaster
 		
+		
+		function f_cf07Down()  runs on CseSimu system AeSystem {
+			
+			unmap(self:mcaPort, system:mcaPort);
+			unmap(self:mcaPortIn, system:mcaPortIn);
+			unmap(self:acPort, system:acPort);
+			if(PX_UT_IMPLEMENTED){
+			  unmap(self:utPort, system:utPort);
+			}
+			
+		} // End of function f_cfDown
+		
 	}//end group configFunctions
 	
 	group InfoPortCommunication {
@@ -4044,9 +4097,15 @@ module OneM2M_Functions {
 			 */
 			altstep a_cse_cf06_das() runs on AeSimu {
 			   [] a_cse_aeSimu();
-			}		
- 
- 
+			}
+			
+			 /**
+			 * @desc	Cse altstep for config 07
+			 */
+			 altstep a_cse_cf07() runs on CseSimu {
+			   [] a_ae_cseSimu();
+			 }	
+			
 			/**
 			  * @desc	Altstep for CseSimu
 			  */
@@ -7060,6 +7119,11 @@ module OneM2M_Functions {
 		 */		
 		external function fx_validateESCertKEMessage(XSD.Base64Binary incomingMessage, integer stage) return boolean;			
 
+		/**
+		 * @desc Retrieve the specified ontology description. 
+		 * @param p_ontology_description The ontology description (e.g. /saref).
+		 */
+		external function fx_retrieve_formal_ontology(in charstring p_ontology_description) return charstring;
 
 	} // end externalFunctions
 	
diff --git a/LibOneM2M/OneM2M_Pics.ttcn b/LibOneM2M/OneM2M_Pics.ttcn
index ddde51f09735477fe5fd97c0f8270fe723b27fcc..00d8b2f7df1cbb57c985043c9e0d8c6b8eebf22c 100644
--- a/LibOneM2M/OneM2M_Pics.ttcn
+++ b/LibOneM2M/OneM2M_Pics.ttcn
@@ -6,7 +6,7 @@
  *  All rights reserved.
  *  
  *  @author     oneM2M/ETSI
- *  @desc       Module containing Pixits for oneM2M
+ *  @desc			 Module containing Pixits for oneM2M
  *
  */
 module OneM2M_Pics {
@@ -47,7 +47,8 @@ module OneM2M_Pics {
 	 */
 	modulepar boolean PICS_IN_CSE := true;
 	modulepar boolean PICS_MN_CSE := true;
-	modulepar boolean PICS_ASN_CSE := true;		
+	modulepar boolean PICS_ASN_CSE := true;
+	modulepar boolean PICS_AE_IPE := false;
 	
 	/**
 	 * @desc Resource Addressing methods 
@@ -189,6 +190,46 @@ module OneM2M_Pics {
 			modulepar boolean PICS_SERVICE_SUBSCRIBED_NODE := true;	
 			modulepar boolean PICS_REMOTE_PROVISIONING := true;	
 		}
+
+		group Onthology_based_interworking {
+			
+			/**
+			 * @desc Does the Test System provide an ontology server?
+			 */
+			modulepar boolean PICS_TS_ONTOLOGY_SERVER := true;
+			
+			/**
+			 * @desc Does the SUT support RESTfull API?
+			 */
+			modulepar boolean PICS_RESTFULL_API := true;
+			
+			/**
+			 * @desc Does the SUT support Discovery?
+			 */
+			modulepar boolean PICS_AE_IPE_DISCOVERY := true;
+			
+			/**
+			 * @desc The expected HTTP Content-type header value
+			 */
+			modulepar charstring PICS_HEADER_CONTENT_TYPE := "application/xml";
+			
+			/**
+			 * @desc The expected HTTP server where to retrieve the formal description of the ontology
+			 */
+			modulepar charstring PICS_HEADER_HOST := "www.someOrganization.org";
+			
+			/**
+			 * @desc HTTP Authorization if required
+			 */
+			modulepar boolean PICS_USE_TOKEN_HEADER := false;
+			modulepar charstring PICS_TOKEN_HEADER := "";
+			
+			/**
+			 * @desc HTTP GET Uri to retrieve the formal description of the ontology
+			 */
+			modulepar charstring PICS_OBI_URI := "/someOntology"; // TODO Could it be a Pixit?
+		}
+		
 	}
 	
 	group SecurityAttributes {
diff --git a/LibOneM2M/OneM2M_Pixits.ttcn b/LibOneM2M/OneM2M_Pixits.ttcn
index 3034d38df7eb25803a10b93ce0cf3daef11a53b6..b8d678351797d9840e533a2f7e8bcfd79358999f 100644
--- a/LibOneM2M/OneM2M_Pixits.ttcn
+++ b/LibOneM2M/OneM2M_Pixits.ttcn
@@ -105,14 +105,6 @@ module OneM2M_Pixits {
 			 */			
 			modulepar PrimitiveScope PX_PRIMITIVE_SCOPE 	:= e_cseRelative;
 	
-			//WebSocket parameters
-			modulepar charstring PX_WS_PROTOCOL    := "oneM2M.R2.0.xml";
-			modulepar charstring PX_REQUEST_URI    := "/";
-			//MQTT parameters
-			modulepar charstring PX_HOSTING_CSE_ID := "CSE-ID";
-			modulepar charstring PX_CREDENTIAL_ID  := "admin:admin";
-	
-			
 			/**
 			 * @desc Protocol binding to use during test execution 
 			 */			
@@ -364,7 +356,8 @@ module OneM2M_Pixits {
 					serialization := "json"
 				}
 			};
-			modulepar UtDesc PX_TS_UT := { url := "http://127.0.0.1:43000/" };
+
+			modulepar UrlDesc PX_TS_UT := { url := "http://127.0.0.1:43000/" };
 	
 			modulepar AeSimuComponentDesc PX_TS_DAS := { // DAS component settings
 				aeIdStem := "",
@@ -400,7 +393,12 @@ module OneM2M_Pixits {
 					serialization := "xml"
 				}
 			};
-				
+							
+			/**
+			 * @desc Simulated Ontology Server IP address and listening port 
+			 */
+			modulepar UrlDesc PX_TS_ONTOLOGY_SERVER := { url := "http://127.0.0.1:80/" };
+	
 		}
 		
 		group ExecutionParameters {
diff --git a/LibOneM2M/OneM2M_Ports.ttcn b/LibOneM2M/OneM2M_Ports.ttcn
index 4a404f7c81c47547b0a5b9abb7963e605d3e300f..dad32616c3f7422906e0d8a999f5f30843e1268a 100644
--- a/LibOneM2M/OneM2M_Ports.ttcn
+++ b/LibOneM2M/OneM2M_Ports.ttcn
@@ -64,7 +64,7 @@ module OneM2M_Ports {
 			UtTriggerAckPrimitive;
 		out 
 			UtTriggerPrimitive; 
-		map param (in UtDesc p_utDesc)
+		map param (in UrlDesc p_utDesc)
 	}
 	
 }//end module
diff --git a/LibOneM2M/OneM2M_Templates.ttcn b/LibOneM2M/OneM2M_Templates.ttcn
index 89e6f9547fb5dec80806e60db335dc74121d4121..01de67d7f01bcbf24be6ee128dc81bd188a0bcb7 100644
--- a/LibOneM2M/OneM2M_Templates.ttcn
+++ b/LibOneM2M/OneM2M_Templates.ttcn
@@ -209,6 +209,13 @@ module OneM2M_Templates {
 				vendorInformation := *
 			};
         	
+			template RequestPrimitive mw_retrieveFormalOntology(template XSD.ID p_targetResourceAddress := ?, template XSD.ID p_originator := ?, template XSD.AnyURI p_ontologyServerUri := ?) modifies mw_retrieve := {
+    		from_ := p_originator,
+				requestIdentifier := ?,
+				primitiveContent := { flexContainer := mw_contentFlexContainer(p_ontologyServerUri) },
+				releaseVersionIndicator := "3"
+			};
+        	
 			/**
 			 * @desc RETRIEVE request primitive for a single attribute in To field ("targetResourceAddress#AttributeName")
 			 * @param p_targetResourceAddress Target resource address (including "#AttributeName")
@@ -2360,6 +2367,10 @@ module OneM2M_Templates {
 			notification := p_notification
 		};
 		 
+		template (present) PrimitiveContent mw_primitiveContentFlexContainer(template (present) FlexContainerResource_optional p_flexContainer := ?) := {
+			flexContainer := p_flexContainer
+		};
+		 
 		 
 		/**
 		 * @desc Base primitiveContent for CREATE operation for AEAnnc resource
@@ -7264,7 +7275,30 @@ module OneM2M_Templates {
 			nodeLink := omit //O
 		}
 		
-		template (value) DeviceAirConditioner_optional m_contentDeviceAirConditioner_allOmit := {
+		template (present) FlexContainerResource_optional mw_contentFlexContainer(
+																																							template (present) XSD.AnyURI p_ontologyRef := ?
+		) := {
+			resourceName := *,//O
+			resourceType := *,//NP
+			resourceID := *,//NP
+			parentID := *,//NP
+			creationTime := *,//NP
+			lastModifiedTime := *,//NP
+			labels := *,//O
+			accessControlPolicyIDs := *,//O
+			expirationTime := *,//O
+			dynamicAuthorizationConsultationIDs := *, //O
+			announceTo := *,//O
+			announcedAttribute := *,//O
+			stateTag := *,//NP
+			creator := *,//O
+			containerDefinition := *, //M
+			ontologyRef := *, //O
+			contentSize := *, //NP
+			nodeLink := * //O
+		}
+		
+		template DeviceAirConditioner_optional m_contentDeviceAirConditioner_allOmit := {
 			resourceName := omit,//O
 			resourceType := omit,//NP
 			resourceID := omit,//NP
diff --git a/LibOneM2M/OneM2M_TypesAndValues.ttcn b/LibOneM2M/OneM2M_TypesAndValues.ttcn
index 4ea88fdefaf5106c0416debb122ab652f23c7f4d..3aa24eaebf17ea847c1e83e8d67c41cb80746714 100644
--- a/LibOneM2M/OneM2M_TypesAndValues.ttcn
+++ b/LibOneM2M/OneM2M_TypesAndValues.ttcn
@@ -4100,13 +4100,17 @@ group OtherTypes {
 		e_cf03,
 		e_cf04,
 		e_cf06,
-		e_cf06DasSimuMaster
+		e_cf06DasSimuMaster,
+		e_cf07,
+		e_cf07OSSimuMaster
 	};
 	
 	type enumerated TestSystemRole {
 		e_cse,
 		e_ae,
-		e_das
+		e_ae_ipe,
+		e_das,
+		e_os
 	};
 		
 	type NhURI ParentID;
@@ -4395,7 +4399,7 @@ group OtherTypes {
 	 * @member requestId    
 	 * @member url     Test System IP address
 	 */
-	type record UtDesc {
+	type record UrlDesc {
 		charstring url
 	}
     
diff --git a/OneM2M_PermutationFunctions.ttcn b/OneM2M_PermutationFunctions.ttcn
index 75d1e3978a390b730065d0d5651d8989ce721cd6..55f249009b4c694dd3f3475de86dda84f55e3b09 100644
--- a/OneM2M_PermutationFunctions.ttcn
+++ b/OneM2M_PermutationFunctions.ttcn
@@ -727,6 +727,346 @@ module OneM2M_PermutationFunctions {
 
 		}//end SUB subgroup
 
+		group Onthology_Based_Interworking {
+			
+			group Registration {
+				
+				function f_AE_OBI_REG_001() runs on CseSimu {
+					var template UtTriggerPrimitive v_utRequest := m_utCreateAe;
+					var template RequestPrimitive v_requestPrimitive := mw_createAe;
+					var universal charstring v_action :=  __SCOPE__ & ": Please, start AE-IPE device";
+					//primitives for mcaPortIn
+					var MsgIn v_request;
+					var integer v_parentIndex := -1;
+					var integer v_resourceIndex := -1;
+					var PrimitiveContent v_resource;
+					var ResponsePrimitive v_responsePrimitive;
+					
+					// Test control
+					if (not(PICS_AE_IPE)) {
+						setverdict(inconc, "PICS_AE_IPE shall be set");
+						return;
+					}
+		
+					f_cf07Up();
+		
+					//Send Trigger Message
+					v_utRequest.requestPrimitive.primitiveContent.aE.resourceName := "UNINITIALIZED";
+					v_requestPrimitive.primitiveContent.aE.resourceName := complement("UNINITIALIZED");
+					v_utRequest.requestPrimitive.to_ := f_getLocalResourceAddress(-, -, -);
+					f_ae_sendUtPrimitive(v_utRequest, v_action & f_getLocalResourceAddress(-, -, -));
+		
+					//Test behavior
+					tc_ac.start;
+					alt {
+					  [] mcaPortIn.receive(mw_request(mw_createAe)) -> value v_request {
+						tc_ac.stop;
+							setverdict(pass, __SCOPE__ & " : AE-IPE registration request is accepted!!");
+							v_resourceIndex := f_processCreateRequestPrimitive(v_request.primitive.requestPrimitive);  
+							
+							//send back responsePrimitive
+							f_send(e_mcaPortIn, m_response(vc_response.primitive.responsePrimitive));
+					  }
+					  [] tc_ac.timeout{
+							setverdict(fail, __SCOPE__ & " : Timeout due to no response received from requested SUT!");
+					  }
+					}
+					// Postamble
+					f_cf07Down();
+				}
+				
+			}
+			
+			group Initialization {
+				
+				function f_AE_OBI_INI_001() runs on CseSimu {
+					var template UtTriggerPrimitive v_utRequest := m_utCreateAe;
+					var template RequestPrimitive v_requestPrimitive := mw_createAe;
+					var universal charstring v_action :=  __SCOPE__ & ": Please, start AE-IPE device";
+					
+					// Test control
+					if (not(PICS_AE_IPE) or (not(PICS_TS_ONTOLOGY_SERVER))) {
+						setverdict(inconc, "PICS_AE_IPE and PICS_TS_ONTOLOGY_SERVER shall be set");
+						return;
+					}
+				
+					f_cf07Up();
+					
+					//Send Trigger Message
+					v_utRequest.requestPrimitive.to_ := f_getLocalResourceAddress(-, -, -);
+					v_utRequest.requestPrimitive.primitiveContent.aE.resourceName := "UNINITIALIZED";
+					f_ae_sendUtPrimitive(v_utRequest,v_action & f_getLocalResourceAddress(-, -, -));
+					
+					//Test behavior
+					tc_ac.start;
+					alt {
+						[] mcaPortIn.receive(mw_request(mw_retrieveFormalOntology(v_utRequest.requestPrimitive.to_, v_utRequest.requestPrimitive.from_, PICS_OBI_URI))) -> value vc_request {
+							tc_ac.stop;
+							// Retrieve the formal description of the ontology
+							f_prepare_formal_description_ontology(vc_request.primitive.requestPrimitive);
+							// And send it to the IUT
+							mcaPortIn.send(m_response(vc_response.primitive.responsePrimitive));
+							
+							// And the final verdict
+							setverdict(pass, __SCOPE__ & "SUT requests at least one of the formal description of the ontology required by none-oneM2M devices");
+						}
+						[] mcaPortIn.receive { // Any other message is unexpected
+							
+							tc_ac.stop;
+							// Send error
+							f_prepare_formal_description_ontology(vc_request.primitive.requestPrimitive, int4000);
+							mcaPortIn.send(m_response(vc_request.primitive.responsePrimitive));
+							setverdict(fail, __SCOPE__ & " : Unexpected Retrieve message received from requested SUT!");
+						}
+						[] tc_ac.timeout{
+							setverdict(fail, __SCOPE__ & " : Timeout due to no response received from requested SUT!");
+						}
+					}
+					
+					// Postamble
+					f_cf07Down();
+				}
+				
+				function f_prepare_formal_description_ontology(in RequestPrimitive p_request, in ResponseStatusCode p_responseStatusCode := int2000) runs on CseSimu {
+					vc_response.primitive.responsePrimitive := valueof(m_responsePrimitive(p_responseStatusCode, p_request.requestIdentifier));
+					if(p_responseStatusCode == int2000) {
+						var charstring v_ontology := fx_retrieve_formal_ontology(p_request.primitiveContent.flexContainer.ontologyRef);
+						// FIXME How to return the formal ontoilogu, this is an OWL file in string foramt
+						//vc_response.primitive.responsePrimitive.primitiveContent := ???;
+					}
+					
+					vc_response.primitive.responsePrimitive.from_ := PX_TS_CSE1.cseId;
+					vc_response.primitive.responsePrimitive.to_ := p_request.from_;
+				}
+				
+			}
+			
+			group Discovery {
+				
+				function f_await_ipe_registration(
+				                                  template UtTriggerPrimitive p_utRequest, 
+				                                  in universal charstring p_action,
+				                                  template RequestPrimitive p_request := mw_create, 
+				                                  in ResponseStatusCode p_responseStatusCode := int2001
+				                                  ) runs on CseSimu return integer {
+					var integer v_localResourceIndex := -1;
+					
+					//Send Trigger Message
+					p_utRequest.requestPrimitive.to_ := f_getLocalResourceAddress(-, -, -);
+					p_request.to_ := p_utRequest.requestPrimitive.to_;
+					f_ae_sendUtPrimitive(p_utRequest,p_action & f_getLocalResourceAddress(-, -, -));
+					
+					tc_ac.start;
+					alt {
+					  [] mcaPortIn.receive(mw_request(p_request)) -> value vc_request {
+							tc_ac.stop;
+							v_localResourceIndex := f_processCreateRequestPrimitive(vc_request.primitive.requestPrimitive, p_responseStatusCode);
+							f_send(e_mcaPortIn, m_response(vc_response.primitive.responsePrimitive));
+					  }
+					  [] tc_ac.timeout{
+							setverdict(inconc, __SCOPE__&":INFO: No creation for resource received");
+						}
+					}
+					
+					return v_localResourceIndex;
+				}
+				
+				function f_AE_OBI_DIS_001() runs on CseSimu {
+					var template UtTriggerPrimitive v_utRequest := m_utCreateAe;
+					var template RequestPrimitive v_requestPrimitive := mw_createAe;
+					var universal charstring v_action :=  __SCOPE__ & ": Please, start AE-IPE device";
+					
+					// Test control
+					if (not(PICS_AE_IPE) or not(PICS_AE_IPE_DISCOVERY)) {
+					  setverdict(inconc, "PICS_AE_IPE and PICS_AE_IPE_DISCOVERY shall be set");
+					  return;
+					}
+					
+					f_cf07Up();
+					
+					// Preamble
+					// Await for AE-IPE registration
+					v_utRequest.requestPrimitive.primitiveContent.aE.resourceName := "UNINITIALIZED";
+					v_requestPrimitive.primitiveContent.aE.resourceName := complement("UNINITIALIZED");
+					f_await_ipe_registration(v_utRequest, v_action);
+					// Give time to the AE-IPE to achieve the initial discovery
+					f_sleepIgnoreDef(5.0);
+					
+					// Test body
+					// Request for a non-oneM2M device description
+					f_send(e_mcaPortIn, m_request(m_retrieve(vc_request.primitive.requestPrimitive.from_, vc_request.primitive.requestPrimitive.to_)));
+					tc_ac.start;
+					alt {
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) {
+							tc_ac.stop;
+							setverdict(pass,__SCOPE__&":INFO: AE-IPE initial discovery successfuly done");
+						}
+						[] tc_ac.timeout {
+							setverdict(fail, __SCOPE__ & " : Timeout due to no required request received from SUT");
+						}
+					}
+					
+				}
+				
+				function f_AE_OBI_DIS_002() runs on CseSimu {
+					var template UtTriggerPrimitive v_utRequest := m_utCreateAe;
+					var template RequestPrimitive v_requestPrimitive := mw_createAe;
+					var universal charstring v_action :=  __SCOPE__ & ": Please, switch on a new none-oneM2M device";
+					
+					// Test control
+					if (not(PICS_AE_IPE) or not(PICS_AE_IPE_DISCOVERY)) {
+					  setverdict(inconc, "PICS_AE_IPE and PICS_AE_IPE_DISCOVERY shall be set");
+					  return;
+					}
+					
+					f_cf07Up();
+					
+					// Preamble
+					// Await for AE-IPE registration
+					v_utRequest.requestPrimitive.primitiveContent.aE.resourceName := "UNINITIALIZED";
+					v_requestPrimitive.primitiveContent.aE.resourceName := complement("UNINITIALIZED");
+					f_await_ipe_registration(v_utRequest, v_action);
+					// Give time to the AE-IPE to achieve the discovery of the new device
+					f_sleepIgnoreDef(5.0);
+					
+					// Test body
+					// Request for a non-oneM2M device description
+					f_send(e_mcaPortIn, m_request(m_retrieve(vc_request.primitive.requestPrimitive.from_, vc_request.primitive.requestPrimitive.to_)));
+					tc_ac.start;
+					alt {
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) {
+							tc_ac.stop;
+							setverdict(pass,__SCOPE__&":INFO: AE-IP successfuly discovered new device");
+						}
+						[] tc_ac.timeout {
+							setverdict(fail, __SCOPE__ & " : Timeout due to no required request received from SUT");
+						}
+					}
+					
+				}
+				
+				function f_AE_OBI_DIS_003() runs on CseSimu {
+					var template UtTriggerPrimitive v_utRequest := m_utCreateAe;
+					var template RequestPrimitive v_requestPrimitive := mw_createAe;
+					var universal charstring v_action :=  __SCOPE__ & ": Please, switch off the new none-oneM2M device";
+					
+					// Test control
+					if (not(PICS_AE_IPE) or not(PICS_AE_IPE_DISCOVERY)) {
+					  setverdict(inconc, "PICS_AE_IPE and PICS_AE_IPE_DISCOVERY shall be set");
+					  return;
+					}
+					
+					f_cf07Up();
+					
+					// Preamble
+					// Await for AE-IPE registration
+					v_utRequest.requestPrimitive.primitiveContent.aE.resourceName := "UNINITIALIZED";
+					v_requestPrimitive.primitiveContent.aE.resourceName := complement("UNINITIALIZED");
+					f_await_ipe_registration(v_utRequest, v_action);
+					// Give time to the AE-IPE to achieve the discovery of the new device
+					f_sleepIgnoreDef(5.0);
+					
+					// Test body
+					// Request for a non-oneM2M device description
+					f_send(e_mcaPortIn, m_request(m_retrieve(vc_request.primitive.requestPrimitive.from_, vc_request.primitive.requestPrimitive.to_)));
+					tc_ac.start;
+					alt {
+						[] mcaPort.receive(mw_response(mw_responsePrimitive(int4004))) {
+							tc_ac.stop;
+							setverdict(pass,__SCOPE__&":INFO: AE-IP successfuly discovered switched off device");
+						}
+						[] tc_ac.timeout {
+							setverdict(fail, __SCOPE__ & " : Timeout due to no required request received from SUT");
+						}
+					}
+					
+				}
+				
+				function f_AE_OBI_DIS_004() runs on CseSimu {
+					var template UtTriggerPrimitive v_utRequest := m_utCreateAe;
+					var template RequestPrimitive v_requestPrimitive := mw_createAe;
+					var universal charstring v_action :=  __SCOPE__ & ": Please, start AE-IPE device";
+					var RequestPrimitive v_request;
+					
+					// Test control
+					if (not(PICS_AE_IPE) or not(PICS_AE_IPE_DISCOVERY)) {
+					  setverdict(inconc, "PICS_AE_IPE and PICS_AE_IPE_DISCOVERY shall be set");
+					  return;
+					}
+					
+					f_cf07Up();
+					
+					// Preamble
+					// Await for AE-IPE registration
+					v_utRequest.requestPrimitive.primitiveContent.aE.resourceName := "UNINITIALIZED";
+					v_requestPrimitive.primitiveContent.aE.resourceName := complement("UNINITIALIZED");
+					f_await_ipe_registration(v_utRequest, v_action);
+					// Give time to the AE-IPE to achieve the discovery of the new device
+					f_sleepIgnoreDef(5.0);
+					
+					// Test body
+					v_request := valueof(m_retrieveFilterUsageOption(vc_request.primitive.requestPrimitive.from_, vc_request.primitive.requestPrimitive.to_, int1));
+					f_send(e_mcaPortIn, m_request(v_request));
+					tc_ac.start;
+					alt {
+						[] mcaPort.receive(mw_response(mw_responseDiscovery)) {
+							tc_ac.stop;
+							setverdict(pass,__SCOPE__&":INFO: AE-IP successfuly discovered switched off device");
+						}
+						[] tc_ac.timeout {
+							setverdict(fail, __SCOPE__ & " : Timeout due to no required request received from SUT");
+						}
+					}
+					
+				}
+				
+			}
+			
+			group Retrieve {
+				
+				function f_AE_OBI_RET_001() runs on CseSimu {
+					var template UtTriggerPrimitive v_utRequest := m_utCreateAe;
+					var template RequestPrimitive v_requestPrimitive := mw_createAe;
+					var universal charstring v_action :=  __SCOPE__ & ": Please, start AE-IPE device";
+					
+					// Test control
+					if (not(PICS_AE_IPE)) {
+					  setverdict(inconc, "PICS_AE_IPE shall be set");
+					  return;
+					}
+					
+					f_cf07Up();
+					
+					// Preamble
+					// Await for AE-IPE registration
+					v_utRequest.requestPrimitive.primitiveContent.aE.resourceName := "UNINITIALIZED";
+					v_requestPrimitive.primitiveContent.aE.resourceName := complement("UNINITIALIZED");
+					f_await_ipe_registration(v_utRequest, v_action);
+					// Give time to the AE-IPE to achieve the discovery of the new device
+					f_sleepIgnoreDef(5.0);
+					
+					// Test body
+					// Request for a non-oneM2M device description
+					// TODO Add more details
+					f_send(e_mcaPortIn, m_request(m_retrieve(vc_request.primitive.requestPrimitive.from_, vc_request.primitive.requestPrimitive.to_)));
+					tc_ac.start;
+					alt {
+						[] mcaPort.receive(mw_response(mw_responsePrimitive(int2001, mw_primitiveContentFlexContainer(mw_contentFlexContainer)))) {
+							tc_ac.stop;
+							setverdict(pass,__SCOPE__&":INFO: Response OK for retrieving");
+						}
+						[] tc_ac.timeout {
+							setverdict(fail, __SCOPE__ & " : Timeout due to no required request received from SUT");
+						}
+					}
+					
+				}
+				
+				
+			}
+			
+		}
+		
 		group Home_Appliance_Information_Model {
 			
 			group Create {
diff --git a/OneM2M_Testcases_AE_Release_3.ttcn b/OneM2M_Testcases_AE_Release_3.ttcn
index d5d5a2e4f9cf37368691b8df173dd1943a25e3bb..44786d2d7130c321fe2266f5b6514a3e95f062c3 100644
--- a/OneM2M_Testcases_AE_Release_3.ttcn
+++ b/OneM2M_Testcases_AE_Release_3.ttcn
@@ -24,6 +24,105 @@ module OneM2M_Testcases_AE_Release_3 {
 
 	group AE {
 		
+		group OBI {
+			
+			group Registration {
+				
+				/**
+				 * @desc  Check that the IUT sends an AE initial registration request when it is started
+				 */
+				testcase TC_AE_OBI_REG_001() runs on Tester system AeSystem {
+					
+					var CseSimu v_cse1Simu := CseSimu.create("CSE1") alive;
+					
+					v_cse1Simu.start(f_AE_OBI_REG_001());
+					v_cse1Simu.done;
+				}
+				
+			}
+			
+			group Initialization {
+				
+				/**
+				 * @desc  Check that the IUT starts the Initialization sequence of an Ontology based Interworking 
+				 *        IPE and retrieves the formal description of the ontology
+				 */
+				testcase TC_AE_OBI_INI_001() runs on Tester system AeSystem {
+					
+					var CseSimu v_os1 := CseSimu.create("OS1") alive;
+					
+					v_os1.start(f_AE_OBI_INI_001());
+					v_os1.done;
+				}
+				
+			}
+			
+			group Discovery {
+				
+				/**
+				 * @desc  Check that the IUT starts the Initialization sequence of an Ontology based Interworking 
+				 *        IPE and retrieves the formal description of the ontology
+				 */
+				testcase TC_AE_OBI_DIS_001() runs on Tester system AeSystem {
+					
+					var CseSimu v_cse1Simu := CseSimu.create("CSE1") alive;
+					
+					v_cse1Simu.start(f_AE_OBI_DIS_001());
+					v_cse1Simu.done;
+				}
+				
+				/**
+				 * @desc  Check that the IUT continues to discover the devices in the non-oneM2M area
+				 */
+				testcase TC_AE_OBI_DIS_002() runs on Tester system AeSystem {
+					
+					var CseSimu v_cse1Simu := CseSimu.create("CSE1") alive;
+					
+					v_cse1Simu.start(f_AE_OBI_DIS_002());
+					v_cse1Simu.done;
+				}
+				
+				/**
+				 * @desc  Check that the IUT continues to discover the devices in the non-oneM2M area
+				 */
+				testcase TC_AE_OBI_DIS_003() runs on Tester system AeSystem {
+					
+					var CseSimu v_cse1Simu := CseSimu.create("CSE1") alive;
+					
+					v_cse1Simu.start(f_AE_OBI_DIS_003());
+					v_cse1Simu.done;
+				}
+				
+				/**
+				 * @desc  Check that the IUT accepts "on demand" discovery
+				 */
+				testcase TC_AE_OBI_DIS_004() runs on Tester system AeSystem {
+					
+					var CseSimu v_cse1Simu := CseSimu.create("CSE1") alive;
+					
+					v_cse1Simu.start(f_AE_OBI_DIS_004());
+					v_cse1Simu.done;
+				}
+				
+			}
+			
+			group Retrieve {
+				
+				/**
+				 * @desc  Check that the IUT accepts a retrieval request resource and responds 2000 (OK) status
+				 */
+				testcase TC_AE_OBI_RET_001() runs on Tester system AeSystem {
+					
+					var CseSimu v_cse1Simu := CseSimu.create("CSE1") alive;
+					
+					v_cse1Simu.start(f_AE_OBI_RET_001());
+					v_cse1Simu.done;
+				}
+				
+			}
+			
+		}
+		
 		group HAIM {
 			
 			group Create {
@@ -33,21 +132,6 @@ module OneM2M_Testcases_AE_Release_3 {
 				*/
 				group g_AE_HAIM_CRE_001 {
 							
-					testcase TC_AE_HAIM_CRE_001_AIR() runs on Tester system AeSystem {
-						
-						var CseSimu v_cse1 := CseSimu.create("CSE1") alive;
-						var template UtTriggerPrimitive v_utRequest := m_utCreateDeviceAirConditioner;
-						var template RequestPrimitive v_requestPrimitive := mw_createDeviceAirConditioner;
-
-						var universal charstring v_action :=  __SCOPE__ & ": Please, send a valid CREATE Request for deviceAirConditioner device model to ";
-						var XSD.AnyURI v_containerDefinition := "org.onem2m.home.device.deviceAirConditioner";
-						
-						v_utRequest.requestPrimitive.primitiveContent.deviceAirConditioner.containerDefinition := v_containerDefinition;
-						v_requestPrimitive.primitiveContent.deviceAirConditioner.containerDefinition := v_containerDefinition;
-						
-						v_cse1.start(f_AE_HAIM_CRE_001(v_action, v_utRequest, v_requestPrimitive));
-						v_cse1.done;
-					}
 					
 					testcase TC_AE_HAIM_CRE_001_CLO() runs on Tester system AeSystem {