diff --git a/LibOneM2M/OneM2M_Functions.ttcn b/LibOneM2M/OneM2M_Functions.ttcn
index 6f6351081e5980c332467b78ed35c78df2d18db2..a1c13986abaf3170769ca61a8a61ede3d2303358 100644
--- a/LibOneM2M/OneM2M_Functions.ttcn
+++ b/LibOneM2M/OneM2M_Functions.ttcn
@@ -867,7 +867,97 @@ module OneM2M_Functions {
     			unmap(self:acPort, system:acPort); 
     	
     		} //end f_cse_notifyProcedure
+    		
+    		/**
+    		 * @desc It determines whether the addressing method of the given address is non-hierarchical. Not valid for CSE-Base as target
+    		 * @param p_resourceAddress
+    		 * @return boolean
+    		 */
+    		function f_isNonHierarchical(XSD.ID p_resourceAddress) runs on Tester return boolean {	
+    			var integer i;
+    			var integer v_nbOfSlashes:= 0;
+    			
+				for (i := 0; i < lengthof(p_resourceAddress); i:= i+1){
+					if(match (p_resourceAddress[i], "/")){
+						v_nbOfSlashes:= v_nbOfSlashes+1;
+					}
+				}
+				
+    			if(f_isScopeCseRelative(p_resourceAddress)) {
+    				if(v_nbOfSlashes == 0 ) {
+    					return true;
+    				} else {
+    					return false;
+    				}
+    				
+    			} else if (f_isScopeSpRelative(p_resourceAddress)){	
+					if(v_nbOfSlashes == 2 ) {
+						return true;
+					} else {
+						return false;
+					}
+    			} else if (f_isScopeAbsolute(p_resourceAddress)){
+					if(v_nbOfSlashes == 4 ) {
+						return true;
+					} else {
+						return false;
+					}
+    			} else {
+    			   return false;
+    			}
+    		}
+    		
+			/**
+			 * @desc It determines whether the addressing method of the given address is hierarchical. Not valid for CSE-Base as target
+			 * @param p_resourceAddress
+			 * @return boolean
+			 */
+			 function f_isHierarchical(XSD.ID p_resourceAddress) runs on Tester return boolean {
+				if(f_isNonHierarchical(p_resourceAddress)) {
+					return false;
+				} else {
+					return true;
+				}	
+    		} 
 			
+			/**
+			 * @desc It determines whether the primitive scope of the given address is CSE-Relative
+			 * @param p_resourceAddress
+			 * @return boolean
+			 */
+			function f_isScopeCseRelative(XSD.ID p_resourceAddress) runs on Tester return boolean { 
+			  if (p_resourceAddress[0] != "/") {
+				return true;
+			  } else {
+			  	return false;
+			  }
+			}
+			
+			/**
+			 * @desc It determines whether the primitive scope of the given address is SP-Relative
+			 * @param p_resourceAddress
+			 * @return boolean
+			 */
+			function f_isScopeSpRelative(XSD.ID p_resourceAddress) runs on Tester return boolean {	
+			  	if ((p_resourceAddress[0] == "/") and (p_resourceAddress[1] != "/")){
+				  return true;
+				} else {
+				  return false;
+				}
+			}
+			
+			/**
+			 * @desc It determines whether the primitive scope of the given address is Absolute
+			 * @param p_resourceAddress
+			 * @return boolean
+			 */
+			function f_isScopeAbsolute(XSD.ID p_resourceAddress) runs on Tester return boolean {
+				if ((p_resourceAddress[0] == "/") and (p_resourceAddress[1] == "/")) {
+				  return true;
+				} else {
+				  return false;
+				}
+			}
 	
 		}//end group helpingFunctions
 		
diff --git a/LibOneM2M/OneM2M_Templates.ttcn b/LibOneM2M/OneM2M_Templates.ttcn
index 3a7681e8c549b95d77ea53a99ccb1963a57b19ba..6f9cf9217e447d88c893fd4989ca9331c5b13205 100644
--- a/LibOneM2M/OneM2M_Templates.ttcn
+++ b/LibOneM2M/OneM2M_Templates.ttcn
@@ -188,6 +188,110 @@ module OneM2M_Templates {
 				localTokenIDs := omit,
 				tokenRequestIndicator := omit
 			};
+			
+			/**
+			  * @desc RETRIEVE request primtive containing the Filter Criteria in the filterCriteria field
+			  * @param p_targetResourceAddress Target resource address 
+			  * @param p_filterCriteria FilterCriteria
+			  * @param p_originator Originator (from)
+		     */
+			template (value) RequestPrimitive m_retrieveResourceFilterUsageOption(XSD.ID p_targetResourceAddress, in XSD.ID p_originator, in template (value) FilterUsage p_filterUsage) modifies m_retrieveResource := {
+				requestIdentifier := "m_retrieveResourceFilterUsageOption" & f_rnd(1, 1000000),
+				filterCriteria := {
+					createdBefore := omit,
+					createdAfter := omit,
+					modifiedSince := omit,
+					unmodifiedSince := omit,
+					stateTagSmaller := omit,
+					stateTagBigger := omit,
+					expireBefore := omit,
+					expireAfter := omit,
+					labels := omit,
+					resourceType := omit,
+					sizeAbove := omit,
+					sizeBelow := omit,
+					contentType_list := {},
+					attribute_list := {},
+					filterUsage := p_filterUsage,
+					limit := omit,
+					semanticsFilter_list := {},
+					filterOperation := omit,
+					contentFilterSyntax := omit,
+					contentFilterQuery := omit,
+					level := omit,
+					offset := omit
+				}
+			};
+			
+			/**
+			  * @desc RETRIEVE request primtive containing the Discovery Type in the discoveryResultType field and Filter Criteria in the filterCriteria field
+			  * @param p_targetResourceAddress Target resource address 
+			  * @param p_filterCriteria FilterCriteria
+			  * @param p_originator Originator (from)
+			 */
+			template (value) RequestPrimitive m_retrieveResourceDiscResTypeFilterUsageOption(XSD.ID p_targetResourceAddress, in XSD.ID p_originator, in template (value) DiscResType p_discResType, in template (value) FilterUsage p_filterUsage) modifies m_retrieveResource := {
+				requestIdentifier := "m_retrieveResourceFilterUsageOption" & f_rnd(1, 1000000),
+				filterCriteria := {
+					createdBefore := omit,
+					createdAfter := omit,
+					modifiedSince := omit,
+					unmodifiedSince := omit,
+					stateTagSmaller := omit,
+					stateTagBigger := omit,
+					expireBefore := omit,
+					expireAfter := omit,
+					labels := omit,
+					resourceType := omit,
+					sizeAbove := omit,
+					sizeBelow := omit,
+					contentType_list := {},
+					attribute_list := {},
+					filterUsage := p_filterUsage,
+					limit := omit,
+					semanticsFilter_list := {},
+					filterOperation := omit,
+					contentFilterSyntax := omit,
+					contentFilterQuery := omit,
+					level := omit,
+					offset := omit
+				},
+				discoveryResultType := p_discResType
+			};
+			
+			/**
+				  * @desc RETRIEVE request primtive containing the Discovery Type in the discoveryResultType field and Filter Criteria in the filterCriteria field
+				  * @param p_targetResourceAddress Target resource address 
+				  * @param p_filterCriteria FilterCriteria
+				  * @param p_originator Originator (from)
+				 */
+				template (value) RequestPrimitive m_retrieveResourceInvalidFormatOption(XSD.ID p_targetResourceAddress, in XSD.ID p_originator) modifies m_retrieveResource := {
+					requestIdentifier := "m_retrieveResourceFilterUsageOption" & f_rnd(1, 1000000),
+					filterCriteria := {
+						createdBefore := omit,
+						createdAfter := omit,
+						modifiedSince := omit,
+						unmodifiedSince := omit,
+						stateTagSmaller := omit,
+						stateTagBigger := omit,
+						expireBefore := omit,
+						expireAfter := omit,
+						labels := omit,
+						resourceType := omit,
+						sizeAbove := omit,
+						sizeBelow := omit,
+						contentType_list := {},
+						attribute_list := {},
+						filterUsage := omit,
+						limit := omit,
+						semanticsFilter_list := {},
+						filterOperation := omit,
+						contentFilterSyntax := omit,
+						contentFilterQuery := omit,
+						level := omit,
+						offset := omit
+					}
+				};
+			
     	}//end group Retrieve
 
     	group Update {
@@ -2735,6 +2839,21 @@ module OneM2M_Templates {
 			tokenRequestInformation := *
     	};
     	
+		template ResponsePrimitive mw_responseDiscovery := {
+			responseStatusCode := int2000,
+			requestIdentifier := ?,
+			primitiveContent := {uRIList := ?},
+			to_ := *,
+			from_ := *,
+			originatingTimestamp := *,
+			resultExpirationTimestamp := *,
+			eventCategory := *,
+			contentStatus := *,
+			contentOffset := *,
+			assignedTokenIdentifiers := *,
+			tokenRequestInformation := *
+		};
+    	
 		template ResponsePrimitive m_responseNotification(ResponseStatusCode p_statusCode, in template(omit) PrimitiveContent p_notification := omit) := {
 			responseStatusCode := p_statusCode,
 			requestIdentifier := testcasename() & "-m_responseNotification" & f_rnd(1, 1000000),
diff --git a/OneM2M_TestControl.ttcn b/OneM2M_TestControl.ttcn
index c8cd60067cb33f1eabbc6328aca1521d026553de..5f23afed323e688ea103e21f31833b867a77ce55 100644
--- a/OneM2M_TestControl.ttcn
+++ b/OneM2M_TestControl.ttcn
@@ -243,6 +243,7 @@ module OneM2M_TestControl {
 		execute(TC_CSE_GMG_BV_022_02());
 		execute(TC_CSE_GMG_BV_022_03());
 		execute(TC_CSE_GMG_BV_022_04());
+		execute(TC_CSE_DIS_BV_001());
 		execute(TC_CSE_SUB_BV_001_01());
 		execute(TC_CSE_SUB_BV_001_02());
 		execute(TC_CSE_SUB_BV_002());
diff --git a/OneM2M_Testcases.ttcn b/OneM2M_Testcases.ttcn
index 84282e355e2b6856782991bb5a0f01a07cd60abd..8b4afe91d3ed1340f3590a152bb0eaf06abbfcb4 100644
--- a/OneM2M_Testcases.ttcn
+++ b/OneM2M_Testcases.ttcn
@@ -10318,6 +10318,349 @@ module OneM2M_Testcases {
 			} // end group g_CSE_GMG_BV_024
             
         } // end group Group_Managment
+        
+        group Discovery {
+        	
+        	group g_CSE_DIS_BV_001{
+        		testcase TC_CSE_DIS_BV_001() runs on CseTester system CseSystem {
+        			// Local variables
+					var integer v_aeIndex := -1;
+					var integer v_resourceIndex := -1;
+					var RequestPrimitive v_request;
+					var integer v_childResourceIndex := -1;
+					const ResourceType c_containerResourceType := int3; 
+					
+					// Test control
+
+					// Test component configuration
+					f_cf01Up();
+
+					// Test adapter configuration
+
+					// Preamble
+					v_aeIndex := f_cse_preamble_registerAe();//AE1 is registred;
+					
+					v_resourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_aeIndex);
+					v_childResourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_resourceIndex);
+					v_request := valueof(m_retrieveResourceFilterUsageOption(f_getResourceAddress(v_resourceIndex), f_getOriginator(v_resourceIndex), int1));
+					mcaPort.send(m_request(v_request));
+					tc_ac.start;
+					alt {
+						
+						[] mcaPort.receive(mw_response(mw_responseDiscovery)){
+							tc_ac.stop;
+							setverdict(pass, testcasename() & ": URI List Representation available");
+						}
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) { 
+							tc_ac.stop;
+							setverdict(fail, testcasename() & ": Wrong responseStatusCode while retrieving resource");
+						}
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { 
+							tc_ac.stop;
+							setverdict(fail, testcasename() & ": Error while retrieving resource");
+						}
+						[] tc_ac.timeout {
+							setverdict(fail, testcasename() & ": No answer while retrieving resource");
+						}
+					 }	
+    								
+					// Postamble
+					f_cse_postamble_deleteResources();
+					
+					// Tear down
+					f_cf01Down();
+        		} // end TC_CSE_DIS_BV_001
+        		
+        	} //end group g_CSE_DIS_BV_001
+        	
+        	group g_CSE_DIS_BV_003
+        	{
+        		testcase TC_CSE_DIS_BV_003() runs on CseTester system CseSystem {
+					// Local variables
+					var MsgIn v_response;
+					var integer v_aeIndex := -1;
+					var integer v_resourceIndex := -1;
+					var RequestPrimitive v_request;
+					var integer v_childResourceIndex := -1;
+					const ResourceType c_containerResourceType := int3; 
+				
+					// Test control
+
+					// Test component configuration
+					f_cf01Up();
+
+					// Test adapter configuration
+
+					// Preamble
+					v_aeIndex := f_cse_preamble_registerAe();//AE1 is registred;
+				
+					v_resourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_aeIndex);
+					v_childResourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_resourceIndex);
+					v_request := valueof(m_retrieveResourceFilterUsageOption(f_getResourceAddress(v_resourceIndex), f_getOriginator(v_resourceIndex), int1));
+					mcaPort.send(m_request(v_request));
+					tc_ac.start;
+					alt {
+					
+						[] mcaPort.receive(mw_response(mw_responseDiscovery)) -> value v_response {
+							tc_ac.stop;
+							if(sizeof(v_response.primitive.responsePrimitive.primitiveContent.uRIList) == 0){
+							  setverdict(pass, testcasename() & ": No Content is present");	
+							}
+							else
+							{
+							  setverdict(fail, testcasename() & ": Wrong content available in URIList element");
+							}
+						}
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) { 
+							tc_ac.stop;
+							setverdict(fail, testcasename() & ": Wrong responseStatusCode while retrieving resource");
+						}
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { 
+							tc_ac.stop;
+							setverdict(fail, testcasename() & ": Error while retrieving resource");
+						}
+						[] tc_ac.timeout {
+							setverdict(fail, testcasename() & ": No answer while retrieving resource");
+						}
+					 }	
+								
+					// Postamble
+					f_cse_postamble_deleteResources();
+				
+					// Tear down
+					f_cf01Down();
+				} // end TC_CSE_DIS_BV_003
+        	} //end group g_CSE_DIS_BV_003
+        	
+        	group g_CSE_DIS_BV_004
+        	{
+				testcase TC_CSE_DIS_BV_004() runs on CseTester system CseSystem {
+					// Local variables
+					var MsgIn v_response;
+					var integer v_aeIndex := -1;
+					var integer v_resourceIndex := -1;
+					var RequestPrimitive v_request;
+					var integer v_childResourceIndex := -1;
+					const ResourceType c_containerResourceType := int3; 
+					
+					// Test control
+
+					// Test component configuration
+					f_cf01Up();
+
+					// Test adapter configuration
+
+					// Preamble
+					v_aeIndex := f_cse_preamble_registerAe();//AE1 is registred;
+					
+					v_resourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_aeIndex);
+					v_childResourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_resourceIndex);
+					v_request := valueof(m_retrieveResourceDiscResTypeFilterUsageOption(f_getResourceAddress(v_resourceIndex), f_getOriginator(v_resourceIndex), int2, int1));
+					mcaPort.send(m_request(v_request));
+					tc_ac.start;
+					alt {
+						
+						[] mcaPort.receive(mw_response(mw_responseDiscovery)) -> value v_response {
+							tc_ac.stop;
+							if (f_isNonHierarchical(v_response.primitive.responsePrimitive.primitiveContent.uRIList[0])) {
+							  setverdict(pass, testcasename() & ": Non-hierarchical address form present in URIList element");
+							} else {
+							  setverdict(fail, testcasename() & ": Non-hierarchical address form absent in URIList representation"); 
+							}
+						}
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) { 
+							tc_ac.stop;
+							setverdict(fail, testcasename() & ": Wrong responseStatusCode while retrieving resource");
+						}
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { 
+							tc_ac.stop;
+							setverdict(fail, testcasename() & ": Error while retrieving resource");
+						}
+						[] tc_ac.timeout {
+							setverdict(fail, testcasename() & ": No answer while retrieving resource");
+						}
+					 }	
+    								
+					// Postamble
+					f_cse_postamble_deleteResources();
+					
+					// Tear down
+					f_cf01Down();
+				} // end TC_CSE_DIS_BV_004
+				
+        	} //end group g_CSE_DIS_BV_004
+        	
+			group g_CSE_DIS_BO_005{
+				testcase TC_CSE_DIS_BO_005() runs on CseTester system CseSystem {
+					// Local variables
+					var integer v_aeIndex := -1;
+					var integer v_resourceIndex := -1;
+					var RequestPrimitive v_request;
+					var integer v_childResourceIndex := -1;
+					var integer v_acpAuxIndex := -1;
+					const ResourceType c_containerResourceType := int3; 
+					
+					// Test control
+					if(not(PICS_ACP_SUPPORT)) {
+						log(testcasename() & ":AccessControlPolicy support is required for executing this test case");
+						stop;
+					}
+
+					// Test component configuration
+					f_cf01Up();
+
+					// Test adapter configuration
+
+					// Preamble
+					v_acpAuxIndex := f_cse_preamble_createAcpAux(-, int31);//c_CRUDN)
+					
+					v_aeIndex := f_cse_preamble_registerAe({f_getResourceId(vc_resourcesList[v_acpAuxIndex].resource)});//AE1 is registred;
+					
+					v_resourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_aeIndex);
+					v_childResourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_resourceIndex);
+					v_request := valueof(m_retrieveResourceFilterUsageOption(f_getResourceAddress(v_resourceIndex), f_getOriginator(v_resourceIndex), int1));
+					mcaPort.send(m_request(v_request));
+					tc_ac.start;
+					alt {
+						[] mcaPort.receive(mw_response(mw_responsePrimitive(int4103))) {
+							tc_ac.stop;
+							setverdict(pass, testcasename() & ": Access denied to discovery operation for resource " & f_getResourceAddress(v_resourceIndex));
+						}
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) {
+							tc_ac.stop;
+							setverdict(fail, testcasename() & ": Wrong response status code while discovering " & f_getResourceAddress(v_resourceIndex) & " without having privileges");
+						}
+						[] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) {
+							tc_ac.stop;
+							setverdict(fail, testcasename() & ": Discovering " & f_getResourceAddress(v_resourceIndex) & " without having privileges");
+						}
+						[] tc_ac.timeout {
+							setverdict(fail, testcasename() & ": No answer while discovering resource");
+						}
+					 }	
+    								
+					// Postamble
+					f_cse_postamble_deleteResources();
+					
+					// Tear down
+					f_cf01Down();
+				} // end TC_CSE_DIS_BO_005
+        		
+			} //end group g_CSE_DIS_BO_005
+        	
+			group g_CSE_DIS_BO_006
+			{
+					testcase TC_CSE_DIS_BO_006() runs on CseTester system CseSystem {
+						// Local variables
+						var MsgIn v_response;
+						var integer v_aeIndex := -1;
+						var integer v_resourceIndex := -1;
+						var RequestPrimitive v_request;
+						const ResourceType c_containerResourceType := int3; 
+						var XSD.ID v_resourceId := "nonexisting";
+					
+						// Test control
+
+						// Test component configuration
+						f_cf01Up();
+
+						// Test adapter configuration
+
+						// Preamble
+						v_aeIndex := f_cse_preamble_registerAe();//AE1 is registred;
+						
+						if(PX_UNSTRUCTURED and (PX_ADDRESSING_FORMAT == e_cseRelative)) {
+							v_request := valueof(m_retrieveResourceFilterUsageOption(v_resourceId, f_getOriginator(v_aeIndex), int1));
+						} else {
+							v_request := valueof(m_retrieveResourceFilterUsageOption(f_getResourceAddress(v_aeIndex) & "/" & v_resourceId, f_getOriginator(v_resourceIndex), int1));
+						}
+					
+						mcaPort.send(m_request(v_request));
+						tc_ac.start;
+						alt {
+						
+							[] mcaPort.receive(mw_response(mw_responsePrimitive(int4004))) -> value v_response {
+								tc_ac.stop;
+								setverdict(pass, testcasename() & ": Resource not found");
+							}
+							[] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { 
+								tc_ac.stop;
+								setverdict(fail, testcasename() & ": Wrong response status code while retrieving resource");
+							}
+							[] mcaPort.receive(mw_response(mw_responsePrimitiveOK)) { 
+								tc_ac.stop;
+								setverdict(fail, testcasename() & ": Wrong response while retrieving resource");
+							}
+							[] tc_ac.timeout {
+								setverdict(fail, testcasename() & ": No answer while retrieving resource");
+							}
+						 }	
+    								
+						// Postamble
+						f_cse_postamble_deleteResources();
+					
+						// Tear down
+						f_cf01Down();
+					} // end TC_CSE_DIS_BO_006
+				
+			} //end group g_CSE_DIS_BO_006
+			
+			group g_CSE_DIS_BI_007
+			{
+					testcase TC_CSE_DIS_BI_007() runs on CseTester system CseSystem {
+						// Local variables
+						var MsgIn v_response;
+						var integer v_aeIndex := -1;
+						var integer v_resourceIndex := -1;
+						var RequestPrimitive v_request;
+						var CseTester v_notifyHandler;
+						var integer v_ae2Index := -1;
+						var integer v_childResourceIndex := -1;
+						const ResourceType c_containerResourceType := int3; 
+					
+						// Test control
+
+						// Test component configuration
+						f_cf01Up();
+
+						// Test adapter configuration
+
+						// Preamble
+						v_aeIndex := f_cse_preamble_registerAe();//AE1 is registred;
+					    
+						v_resourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_aeIndex);
+						v_childResourceIndex := f_cse_createResource(c_containerResourceType, m_createContainerBase, v_resourceIndex); 
+						v_request := valueof(m_retrieveResourceInvalidFormatOption(f_getResourceAddress(v_resourceIndex), f_getOriginator(v_resourceIndex)));
+						mcaPort.send(m_request(v_request));
+						tc_ac.start;
+						alt {
+						
+							[] mcaPort.receive(mw_response(mw_responsePrimitive(int4102))) -> value v_response {
+								tc_ac.stop;
+								setverdict(pass, testcasename() & ": Contents Unacceptable");
+							}
+							[] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { 
+								tc_ac.stop;
+								setverdict(fail, testcasename() & ": Wrong response status code while retrieving resource");
+							}
+							[] mcaPort.receive(mw_response(mw_responsePrimitiveKO)) { 
+								tc_ac.stop;
+								setverdict(fail, testcasename() & ": Wrong response while retrieving resource");
+							}
+							[] tc_ac.timeout {
+								setverdict(fail, testcasename() & ": No answer while retrieving resource");
+							}
+						 }	
+    								
+						// Postamble
+						f_cse_postamble_deleteResources();
+					
+						// Tear down
+						f_cf01Down();
+					} // end TC_CSE_DIS_BI_007	
+			} //end group g_CSE_DIS_BI_007
+				
+        } //end group Group Discovery
 		
 		group Subscription_And_Notification {