diff --git a/LibOneM2M/OneM2M_Functions.ttcn b/LibOneM2M/OneM2M_Functions.ttcn
index f142472958a71e0da9d90aaf9e7674bec23bf18f..8023039b6534dea12765e1717b9d402264181249 100644
--- a/LibOneM2M/OneM2M_Functions.ttcn
+++ b/LibOneM2M/OneM2M_Functions.ttcn
@@ -1761,12 +1761,12 @@ module OneM2M_Functions {
 			 * @return PrimitiveContent parameter of the RETRIEVE response
 			 * @verdict 
 			 */
-			function f_cse_retrieveResourceWithRoleToken(integer p_resourceIndex, XSD.ID p_roleResourceID, XSD.ID p_tokenResourceID) runs on AeSimu return PrimitiveContent{
+			function f_cse_retrieveResourceWithRoleToken(integer p_resourceIndex, template (omit) XSD.ID p_roleResourceID := omit, template (omit) XSD.ID p_tokenResourceID) runs on AeSimu return PrimitiveContent{
 
 				var RequestPrimitive v_retrieveRequest;
 				v_retrieveRequest := m_retrieve(f_getResourceAddress(p_resourceIndex), f_getOriginator(p_resourceIndex));
-				if (p_roleResourceID!= null) {v_retrieveRequest.roleIDs := {p_roleResourceID};}
-				if (p_tokenResourceID!= null) {v_retrieveRequest.tokenIDs := {p_tokenResourceID};}
+				if (ispresent(p_roleResourceID)) {v_retrieveRequest.roleIDs := {p_roleResourceID};}
+				if (ispresent(p_tokenResourceID)) {v_retrieveRequest.tokenIDs := {p_tokenResourceID};}
 				f_send(e_mca_port, m_request(v_retrieveRequest));
 				
 				tc_ac.start;
diff --git a/LibOneM2M/OneM2M_Templates.ttcn b/LibOneM2M/OneM2M_Templates.ttcn
index f28e037d87e72c1665f75ae69858e3d3414b6902..23fa7ff8ae05156050f2b35c435b8278158976b3 100644
--- a/LibOneM2M/OneM2M_Templates.ttcn
+++ b/LibOneM2M/OneM2M_Templates.ttcn
@@ -1522,6 +1522,15 @@ module OneM2M_Templates {
 				resourceType := int10030,
 				primitiveContent := {timeSeriesInstanceAnnc := mw_contentCreateTimeSeriesInstanceAnncBase}
 			};  
+
+			/**
+			 * @desc Base CREATE request primitive for role resource
+			 */
+			template (value) RequestPrimitive m_createRoleBase modifies m_create := {
+				requestIdentifier := testcasename() & "-m_createRole",
+				resourceType := int31,
+				primitiveContent := {role := m_contentCreateRole()}
+			};
 			
 			/**
 			 * @desc Reception template for CREATE DeviceAirConditioner
@@ -2136,8 +2145,6 @@ module OneM2M_Templates {
 			container := p_container
 		}
 		
-		
-		
 		template PrimitiveContent m_primitiveContentContentInstance(template ContentInstance_optional p_contentInstance) := {
 			contentInstance := p_contentInstance
 		}
@@ -2154,8 +2161,6 @@ module OneM2M_Templates {
 			responsePrimitive := p_responsePrimitive
 		}		
 				
-		
-				
 		template (value) PrimitiveContent m_primitiveContentGroup(template Group_optional p_group) := {
 			group_ := valueof(p_group)
 		}
@@ -3947,6 +3952,31 @@ module OneM2M_Templates {
 			duration := p_duration
 		};
 
+		/**
+		 * @desc Base primitiveContent for CREATE operation for Role resource
+		 * @param p_name Resource name
+		 */
+		template (value) Role_optional m_contentCreateRole (in template (omit) XSD.String p_name := c_defaultRoleResourceName):= {
+			resourceName := p_name,//O
+			resourceType := omit,//NP
+			resourceID := omit,//NP
+			parentID := omit,//NP
+			creationTime := omit,//NP
+			lastModifiedTime := omit,//NP
+			labels := omit,//O
+			accessControlPolicyIDs := omit, //O
+			expirationTime := omit,//O
+			dynamicAuthorizationConsultationIDs := omit, //O
+			roleID := "roleID@a.b", //M
+			issuer := "issuer", //M
+			holder := "holder", //M
+			notBefore := fx_generateTimestamp(),//M
+			notAfter := fx_generateTimestamp(),//M
+			roleName := omit, //O
+			tokenLink := omit, //O
+			choice := omit//O
+		};
+	
 		/**
 		 * @desc Base primitiveContent for CREATE operation for BinarySwitch resource
 		 * @param 
@@ -6528,7 +6558,7 @@ module OneM2M_Templates {
 		template TimeSeries_optional mw_contentTimeSeries_rc8 modifies mw_contentTimeSeries_allOmit := {
 			choice := {choice_list := ?}	//O
 		}
-		
+
 		template FlexContainerResource_optional m_contentFlexContainer_allOmit := {
 			resourceName := omit,//O
 			resourceType := omit,//NP
@@ -6836,7 +6866,7 @@ module OneM2M_Templates {
 			choice := omit //NP
 		}
 		
-		
+
 	}//end group responseContent
 	
 	group SpecialContents {
@@ -7310,7 +7340,7 @@ module OneM2M_Templates {
 			releaseVersionIndicator := ?,
 			vendorInformation := *
 		};
-    	
+		
 		template ResponsePrimitive mw_responseNotifySecurityInfo(ResponseStatusCode p_statusCode, template SecurityInfo p_securityInfo) := {
 			responseStatusCode := p_statusCode,
 			requestIdentifier := ?,
diff --git a/LibOneM2M/OneM2M_Types.ttcn b/LibOneM2M/OneM2M_Types.ttcn
index a2a3088d83189f8fae44a9b41ae5be3a9340370f..64a391e8ed5f3b561de4a3c5ecf59d490ef74904 100644
--- a/LibOneM2M/OneM2M_Types.ttcn
+++ b/LibOneM2M/OneM2M_Types.ttcn
@@ -2094,6 +2094,7 @@ type union PrimitiveContent {
 	GenericInterworkingService_optional genericInterworkingService,
 	DynamicAuthorizationConsultation_optional dynamicAuthorizationConsultation,
 	GenericInterworkingOperationInstance_optional genericInterworkingOperationInstance,
+	Role_optional role,
 	//HAIM 
 	DeviceAirConditioner_optional deviceAirConditioner,
 	DeviceClothesWasherDryer_optional deviceClothesWasherDryer,
@@ -2159,7 +2160,6 @@ type union PrimitiveContent {
 	Subscription_update_invalid subscription_update_invalid,
 	LocationPolicy_update_invalid locationPolicy_update_invalid,
 	TimeSeries_update_invalid timeSeries_update_invalid
-	
 }
 
 
@@ -4025,9 +4025,6 @@ with {
 };
 
 
-
-
-
 type enumerated ResourceType
 {
 	int1(1),
@@ -25193,7 +25190,6 @@ with {
 		AttributeAux_list forcedFields optional
 	}
 	
-	
 	/**
 	 * @desc Type for the oneM2M primitives exchange
 	 * @member primitive oneM2M primitive
@@ -27060,6 +27056,45 @@ group OptionalResourceTypes {
 	  variant (choice.choice_list) "untagged";
 	  variant (choice.choice_list[-]) "untagged";
 	};
+
+	type record Role_optional
+	{
+		ResourceName resourceName optional,
+		ResourceType resourceType optional,
+		XSD.ID resourceID optional,
+		NhURI parentID optional,
+		Timestamp creationTime optional,
+		Timestamp lastModifiedTime optional,
+		Labels labels optional,
+		AcpType accessControlPolicyIDs optional,
+		Timestamp expirationTime optional,
+		ListOfURIs dynamicAuthorizationConsultationIDs optional,
+		RoleID roleID optional,
+		XSD.ID issuer optional,
+		XSD.ID holder optional,
+		Timestamp notBefore optional,
+		Timestamp notAfter optional,
+		XSD.String roleName optional,
+		XSD.AnyURI tokenLink optional,
+		union {
+			record length(1 .. infinity) of ChildResourceRef childResource_list,
+			record length(1 .. infinity) of union {
+				Subscription subscription,
+				Transaction transaction
+			} choice_list 
+		} choice optional
+	}
+	with {
+	  variant "name as uncapitalized";
+	  variant "element";
+	  variant (resourceName) "attribute";
+	  variant (choice) "untagged";
+	  variant (choice.childResource_list) "untagged";
+	  variant (choice.childResource_list[-]) "name as 'childResource'";
+	  variant (choice.choice_list) "untagged";
+	  variant (choice.choice_list[-]) "untagged";
+	};
+
 	type record DeviceAirConditioner_optional
 	{
 		ResourceName resourceName optional,
@@ -28429,10 +28464,10 @@ group OptionalResourceTypes {
 	  variant (choice.subscription_list) "untagged";
 	  variant (choice.subscription_list[-]) "name as 'subscription'";
 	};
-	
+
 }//end group OptionalResourceTypes
 	
-
+	
 	
 group InvalidTypes {
 		
diff --git a/LibOneM2M/OneM2M_TypesAndValues.ttcn b/LibOneM2M/OneM2M_TypesAndValues.ttcn
index acf1c11ad8ccb067bf1a20355ed31b4afadb3250..b57c8df15140963d7853eaefcca07632b038cec1 100644
--- a/LibOneM2M/OneM2M_TypesAndValues.ttcn
+++ b/LibOneM2M/OneM2M_TypesAndValues.ttcn
@@ -42,6 +42,7 @@ module OneM2M_TypesAndValues {
 	const XSD.String c_defaultTimeSeriesResourceName := "MyTimeSeriesResource";
 	const XSD.String c_defaultTimeSeriesAnncResourceName := "MyTimeSeriesAnncResource";
 	const XSD.String c_defaultTimeSeriesInstanceResourceName := "MyTimeSeriesInstanceResource";
+	const XSD.String c_defaultRoleResourceName := "MyRoleResource";
 	const XSD.String c_defaultGenericInterworkingServiceResourceName := "MyGenericInterworkingServiceResource"; //<genericInterworkingService>
 	const XSD.ID c_aeAuxName := "MyAe";
 	const XSD.String c_defaultAE2Name := "MyAe2";
diff --git a/OneM2M_Testcases_AE_Release_1.ttcn b/OneM2M_Testcases_AE_Release_1.ttcn
index ced59c4fe0a64173ddf4246c7a3c63cdefb47e26..360deb63cf91b6049b3a89d853078af5aa3fbb1f 100644
--- a/OneM2M_Testcases_AE_Release_1.ttcn
+++ b/OneM2M_Testcases_AE_Release_1.ttcn
@@ -648,7 +648,7 @@ module OneM2M_Testcases_AE_Release_1 {
 						var template UtTriggerPrimitive v_utRequest := m_utCreateAe;
 						var template RequestPrimitive v_createAe := mw_createAe;
 						var universal charstring v_action :=  __SCOPE__ & ": Please, send a valid AE CREATE Registration Request containing attribute SupportedReleaseVersions";
-						v_utRequest.requestPrimitive.primitiveContent.aE.supportedReleaseVersions := {"2a"};
+						v_utRequest.requestPrimitive.primitiveContent.aE.supportedReleaseVersions := {"3"};
 						v_utRequest.forcedFields := {{name := "supportedReleaseVersions", value_ := "UNINITIALIZED"}};
 						v_createAe.primitiveContent.aE.supportedReleaseVersions := ?;//Check value other than UNINITIALIZED, done by typing
 						v_cse1.start(f_AE_REG_CRE_002(v_utRequest,v_createAe,v_action));
diff --git a/OneM2M_Testcases_CSE_Release_3.ttcn b/OneM2M_Testcases_CSE_Release_3.ttcn
index f1e5a1110679f2fe7eb5b75f1df5c8bfdee2bb48..ce68a58c6c0b845673a18d19e55ca1b2b7d89567 100644
--- a/OneM2M_Testcases_CSE_Release_3.ttcn
+++ b/OneM2M_Testcases_CSE_Release_3.ttcn
@@ -7543,6 +7543,75 @@ module OneM2M_Testcases_CSE_Release_3 {
 			
 			group Roles {
 				
+				group Create{
+						
+					/**
+					 * @desc Check that the IUT successfully creates the <role> resource requested by the Authorization Authority
+					 * 
+					 */						
+					testcase TC_CSE_SEC_ROL_CRE_002() runs on Tester system CseSystem {
+						//Local variables
+						var CseSimu v_cse1 := CseSimu.create("CSE1") alive;
+								
+						v_cse1.start(f_CSE_SEC_ROL_CRE_002()); 	
+						v_cse1.done;																			
+					}	
+					
+					function f_CSE_SEC_ROL_CRE_002() runs on CseSimu system CseSystem {
+						// Local variables
+						var MsgIn v_response;
+						var integer v_aeIndex := -1;
+						var XSD.ID v_targetResourceAddress;
+		    										   
+						// Test control
+						if(not(PICS_ROL_SUPPORT)) {
+							setverdict(inconc, __SCOPE__ & ": Role Based Access Control Procedure support is required to run this test case");
+							stop;
+						}
+	
+						// Test component configuration
+						f_cf04Up();
+	
+						// Test adapter configuration
+	
+						// Preamble 	
+						vc_remoteCseIndex := f_cse_registerRemoteCse(m_createRemoteCSEBase);
+				
+//						Test Body
+						var RequestPrimitive v_createRequest := f_getCreateRequestPrimitive(int31, m_createRoleBase, -1);
+						f_send(e_mcc_port, m_request(v_createRequest));
+
+						tc_ac.start;
+						alt {
+							[] mccPort.receive(mw_response(mw_responsePrimitive(int2001))) {
+								tc_ac.stop;
+								setverdict(pass, __SCOPE__ & ": Role resource successfully created");
+							}
+							[] mccPort.receive(mw_response(mw_responsePrimitiveOK)) {
+								tc_ac.stop;
+								setverdict(fail, __SCOPE__ & ": Wrong response status code in the response");
+							}
+							[] mccPort.receive(mw_response(mw_responsePrimitiveKO)) {
+								tc_ac.stop;
+								setverdict(fail, __SCOPE__ & ": Error while creating role resource");
+							}
+							[] tc_ac.timeout {
+								setverdict(fail, __SCOPE__ & ": No answer while creating the resource");
+							}
+						}	
+					
+						// Postamble
+						f_cse_postamble_deleteResourcesCSE();
+		
+						// Tear down
+						f_cf04Down();
+
+					}//end f_CSE_SEC_ROL_CRE_002						
+					
+									
+				}//end group Create
+				
+				
 				group Retrieve {
 					
 					/**
@@ -7715,7 +7784,7 @@ module OneM2M_Testcases_CSE_Release_3 {
 						v_roleResourceID := fx_assign_originatorRole(); // external function, may require additional paremeters
 
 						//Test Body
-						vc_ae1.start(f_cse_retrieveResourceWithRoleToken(v_resourceIndex, v_roleResourceID, null)); 
+						vc_ae1.start(f_cse_retrieveResourceWithRoleToken(v_resourceIndex, v_roleResourceID, omit)); 
 											
 						tc_ac.start;
 						alt{
@@ -7782,7 +7851,7 @@ module OneM2M_Testcases_CSE_Release_3 {
 						 v_tokenResourceID := fx_assign_originatorToken(); // external function, may require additional paremeters
 
 						 //Test Body
-						 vc_ae1.start(f_cse_retrieveResourceWithRoleToken(v_resourceIndex, null, v_tokenResourceID)); 
+						 vc_ae1.start(f_cse_retrieveResourceWithRoleToken(v_resourceIndex, -, v_tokenResourceID)); 
 											
 						 tc_ac.start;
 						 alt{