diff --git a/IOT_LGen_Definitions.ttcn b/IOT_LGen_Definitions.ttcn
index 173fe42..f84cea5 100644
--- a/IOT_LGen_Definitions.ttcn
+++ b/IOT_LGen_Definitions.ttcn
@@ -18,7 +18,7 @@
 {
   import from EPTF_MQTT_LGen_Definitions all;
   import from EPTF_MQTT_LocalTransport_Definitions all;
-  import from EPTF_COAP_LGen_Definitions all;
+  import from EPTF_COAP_LGen_Definitions all;  
   import from EPTF_COAP_LocalTransport_Definitions all;
   import from EPTF_LwM2M_LGen_Definitions all;
   import from EPTF_LwM2M_CoapApplibTransport_Definitions all;
@@ -29,12 +29,12 @@
   import from EPTF_CLL_LGenBase_ConfigDefinitions all;
   import from EPTF_CLL_ExecCtrl_Definitions all;
   import from InfluxDB_Definitions all;
-
+  
   modulepar EPTF_LGenBase_FsmTableDeclaratorList tsp_IOT_LGen_FSMs := {}
 
   const charstring c_IOT_entityType := "IOT_Entity";
   const charstring c_IOT_behaviorType := "IOT_Behavior";
-
+  
   const integer c_IOT_LGen_Logging_WARNING := 0;
   const integer c_IOT_LGen_Logging_DEBUG := 1;
   const integer c_IOT_LGen_Logging_DEBUGV := 2;
@@ -45,8 +45,8 @@
   const integer c_FSM_fail := 2;
   const integer c_FSM_timeout := 3;
 
-  type component IOT_LGen_CT
-  extends EPTF_LGenBase_CT, EPTF_ExecCtrlClient_CT,
+  type component IOT_LGen_CT 
+  extends EPTF_LGenBase_CT, EPTF_ExecCtrlClient_CT, 
   		EPTF_MQTT_LGen_CT, EPTF_MQTT_LocalTransport_CT,
   		EPTF_COAP_LGen_CT, EPTF_COAP_LocalTransport_CT,
   		EPTF_LwM2M_LGen_CT, EPTF_LwM2M_CoapApplibTransport_CT,
@@ -55,19 +55,19 @@
   {
     var charstring v_IOT_LGen_name;
     var integer v_IOT_LGen_idx;
-
+    
     var integer v_IOT_bIdx;
     var integer v_IOT_LGen_loggingMaskId;
 
     var integer v_IOT_LGen_localAddressIdx;
     var integer v_IOT_LGen_remoteAddressIdx;
-
+    
     var integer v_HTTP_portGroupConnectionHandle := -1;
-
+    
     var LwM2M_DataSamples_DB v_IOT_LGen_DataSamples_DB := c_LwM2M_DataSamples_DB_init;
   }
-
-    const LwM2M_DataSamples c_DataSamples_Latitude :=
+  
+  const LwM2M_DataSamples c_DataSamples_Latitude :=
   {
     name := "Latitude",
     values :=
diff --git a/IOT_LGen_Functions.ttcn b/IOT_LGen_Functions.ttcn
index 18b6b86..e8909da 100644
--- a/IOT_LGen_Functions.ttcn
+++ b/IOT_LGen_Functions.ttcn
@@ -18,14 +18,13 @@
 {
   import from IOT_LGen_Definitions all;
   import from IOT_LGen_Steps all;
-
+  
   import from EPTF_MQTT_LGen_Definitions all;
   import from EPTF_MQTT_LGen_Functions all;
   import from EPTF_MQTT_LocalTransport_Functions all;
   import from EPTF_COAP_LGen_Definitions all;
   import from EPTF_COAP_LGen_Functions all;
   import from EPTF_COAP_Transport_Definitions all;
-  import from EPTF_COAP_LocalTransport_Definitions all;
   import from EPTF_COAP_LocalTransport_Functions all;
   import from EPTF_LwM2M_LGen_Definitions all;
   import from EPTF_LwM2M_LGen_Functions all;
@@ -44,39 +43,41 @@
   import from EPTF_CLL_LGenBase_ConfigFunctions all;
   import from EPTF_CLL_Logging_Definitions all;
   import from EPTF_CLL_Logging_Functions all;
-
+  
   import from InfluxDB_Definitions all;
-  import from InfluxDB_Functions all;
+  //import from InfluxDB_Functions all;
 
   function f_IOT_LGen_behavior(in charstring pl_selfName, in integer p_idx, in EPTF_ExecCtrl_CT pl_ExecCtrlRef)
   runs on IOT_LGen_CT
   {
     log(%definitionId,": started...");
 
-    f_IOT_LGen_init(pl_selfName, p_idx, pl_ExecCtrlRef);
+    f_IOT_LGen_init(pl_selfName, p_idx, pl_ExecCtrlRef); 
 
     f_EPTF_Base_wait4Shutdown();
-
+    
+    f_LwM2M_DataSamples_DB_cleanUp(v_IOT_LGen_DataSamples_DB);
+    
     f_EPTF_Base_cleanup_CT();
   }
-
+    
   function f_IOT_LGen_init(in charstring pl_selfName, in integer p_idx, in EPTF_ExecCtrl_CT pl_ExecCtrlRef)
-  runs on IOT_LGen_CT
+  runs on IOT_LGen_CT 
   {
     v_IOT_LGen_name := pl_selfName;
     v_IOT_LGen_idx := p_idx;
-
+    
     f_EPTF_Logging_init_CT(pl_selfName);
-
-    v_IOT_LGen_loggingMaskId :=
+    
+    v_IOT_LGen_loggingMaskId := 
       f_EPTF_Logging_registerComponentMasks(
-        "IOT_LGen",
+        "IOT_LGen", 
         {"WARNING", "DEBUG", "DEBUGV" ,"ERROR" },
-        EPTF_Logging_CLL);
-
+        EPTF_Logging_CLL);    
+    
     f_EPTF_LGenBase_init(pl_selfName, 0, "IoT_Entity#");
-
-    //v_InfluxDB_ctx.localPort := tsp_InfluxDB_client_basePort + p_idx;
+    
+    v_InfluxDB_ctx.localPort := tsp_InfluxDB_client_basePort + p_idx;
     //f_InfluxDB_init();
     
     f_IOT_LGen_initSamples(pl_selfName);
@@ -85,30 +86,32 @@
     // COAP applib init
 
     f_EPTF_COAP_LGen_init(pl_selfName);
-    f_EPTF_COAP_LocalTransport_init();
+    f_EPTF_COAP_LocalTransport_init();    
 
     vf_EPTF_COAP_Transport_send := refers(f_IOT_COAP_LocalTransport_send);
     vf_EPTF_COAP_Transport_receiveMessage := refers(f_IOT_COAP_LGen_receiveMessage);
     vf_EPTF_COAP_Transport_receiveEvent := refers(f_EPTF_COAP_LGen_receiveEvent);
     vf_EPTF_COAP_Transport_apiRequest := refers(f_EPTF_COAP_LocalTransport_transportApiRequest);
     vf_EPTF_COAP_Transport_apiResponse := refers(f_EPTF_COAP_LGen_transportApiResponse);
-
+    
     //////////////////////
     // LWM2M applib init
-
+    
     f_EPTF_LwM2M_LGen_init(pl_selfName);
     f_EPTF_LwM2M_CoapApplibTransport_init(pl_selfName);
-
+    
     vf_COAP_msgReceived := refers(f_EPTF_LwM2M_CoapApplibTransport_messageReceived);
+    vf_COAP_eventIndication := refers(f_EPTF_LwM2M_CoapApplibTransport_eventIndication);
     vf_EPTF_LwM2M_Transport_send := refers(f_EPTF_LwM2M_CoapApplibTransport_send);
     vf_EPTF_LwM2M_Transport_receiveMessage := refers(f_EPTF_LwM2M_LGen_receiveMessage);
+    vf_EPTF_LwM2M_Transport_receiveEvent := refers(f_EPTF_LwM2M_LGen_receiveEvent);
 
     //////////////////////
     // HTTP applib init
-
+    
     f_EPTF_HTTP_init("HTTP", 0, "Demo Entity#");
 
-    f_EPTF_HTTP_LocalTransport_init_CT("HTTP",
+    f_EPTF_HTTP_LocalTransport_init_CT("HTTP", 
       refers(f_EPTF_HTTP_messageReceived),
       refers(f_EPTF_HTTP_eventReceived),
       refers(f_EPTF_HTTP_socketErrorReceived)
@@ -120,12 +123,12 @@
   	f_EPTF_HTTP_setConnectionHalfCloseFunction(refers(f_EPTF_HTTP_LocalTransport_connectionHalfClose));
   	f_EPTF_HTTP_setClosePortOfUserFunction(refers(f_EPTF_HTTP_LocalTransport_closePortOfUser));
   	f_EPTF_HTTP_setFreePortOfUserFunction(refers(f_EPTF_HTTP_LocalTransport_freePortOfUser));
-
+  	
     //////////////////////
     // MQTT applib init
 
     f_EPTF_MQTT_LGen_init(pl_selfName);
-    f_EPTF_MQTT_LocalTransport_init();
+    f_EPTF_MQTT_LocalTransport_init();    
 
     vf_EPTF_MQTT_Transport_send := refers(f_EPTF_MQTT_LocalTransport_send);
     vf_EPTF_MQTT_Transport_receiveMessage := refers(f_EPTF_MQTT_LGen_receiveMessage);
@@ -135,13 +138,13 @@
 
     //////////////////////
     // CLL config
-
-    v_IOT_bIdx := f_EPTF_LGenBase_declareBehaviorType(c_IOT_behaviorType, -1, null, null, null);
+    
+    v_IOT_bIdx := f_EPTF_LGenBase_declareBehaviorType(c_IOT_behaviorType, -1, null, null, null);    
     f_EPTF_LGenBase_declareEntityType(
-      c_IOT_entityType,
+      c_IOT_entityType, 
       {
-    	c_COAP_behaviorType,
-    	c_LwM2M_behaviorType,
+    	c_COAP_behaviorType,    	  
+    	c_LwM2M_behaviorType,    	  
     	c_EPTF_HTTP_myBName,
     	c_MQTT_behaviorType
    	  }
@@ -155,7 +158,7 @@
 
     f_EPTF_ExecCtrlClient_init_CT(pl_selfName, pl_ExecCtrlRef);   // Only after library init(s)
   }
-
+  
   function f_IOT_LGen_Logging_VERBOSE(in @lazy charstring pl_message)
   runs on IOT_LGen_CT
   {
@@ -187,12 +190,12 @@
     	f_EPTF_Logging_debugV2(pl_message, v_IOT_LGen_loggingMaskId, {c_IOT_LGen_Logging_ERROR});
 	}
   }
-
+  
   function f_IOT_COAP_LocalTransport_send(in EPTF_COAP_PDU pl_msg)
   runs on IOT_LGen_CT
   {
     f_EPTF_COAP_LocalTransport_send(pl_msg);
-
+    
     /*
     f_EPTF_COAP_PDU_to_Influx(
       v_IOT_LGen_name & int2str(v_IOT_LGen_idx),
@@ -200,10 +203,11 @@
       pl_msg,
       v_InfluxDB_msgToSend
     );
-    f_InfluxDB_send(v_InfluxDB_msgToSend);
+    //f_InfluxDB_send(v_InfluxDB_msgToSend);
     */
   }
 
+  
   function f_IOT_COAP_LGen_receiveMessage(in EPTF_COAP_PDU pl_message)
   runs on IOT_LGen_CT
   {
@@ -219,10 +223,11 @@
     f_InfluxDB_send(v_InfluxDB_msgToSend);
     */
   }
-
+  
+  /*
   function f_EPTF_COAP_PDU_to_Influx(
   	in charstring p_lgenId,
-  	in charstring p_direction,
+  	in charstring p_direction, 
   	in EPTF_COAP_PDU p_pdu,
   	inout InfluxLineProtocol p_influx)
   {
@@ -231,9 +236,9 @@
 	else if (p_pdu.pdu.header.msg_type == NON_CONFIRMABLE) { vl_mtype := "NON" }
 	else if (p_pdu.pdu.header.msg_type == ACKNOWLEDGEMENT) { vl_mtype := "ACK" }
 	else if (p_pdu.pdu.header.msg_type == RESET) { vl_mtype := "RST" }
-
+	
 	var charstring vl_mcode := "NA";
-	if (p_pdu.pdu.header.code.class == 0)
+	if (p_pdu.pdu.header.code.class == 0) 
 	{
 	  if (p_pdu.pdu.header.code.detail == 0) { vl_mcode := "EMPTY"; }
 	  else if (p_pdu.pdu.header.code.detail == 1) { vl_mcode := "GET"; }
@@ -245,13 +250,13 @@
 	{
 	  vl_mcode := int2str(p_pdu.pdu.header.code.class*100 + p_pdu.pdu.header.code.detail);
 	}
-
+	
 	if (not isbound(p_pdu.fsmIdx)) { p_pdu.fsmIdx := -1 }
-
+	
 	p_influx := c_InfluxLineProtocol_empty;
-
+	
     p_influx.measurement := "COAP_PDUs";
-
+        
     f_InfluxDB_addField(p_influx, {name := "direction", val := "\"" & p_direction & "\""});
     f_InfluxDB_addField(p_influx, {name := "lgen", val := "\"" & p_lgenId & "\""});
     f_InfluxDB_addField(p_influx, {name := "entity", val := int2str(p_pdu.eIdx)});
@@ -262,7 +267,9 @@
 	f_InfluxDB_addField(p_influx, {name := "mid", val := int2str(p_pdu.pdu.header.message_id)});
 	f_InfluxDB_addField(p_influx, {name := "type", val := "\"" & vl_mtype & "\""});
 	f_InfluxDB_addField(p_influx, {name := "code", val := "\"" & vl_mcode & "\""});
+  
   }
+  */
   
   function f_IOT_LGen_initSamples(in charstring p_selfName)
   runs on IOT_LGen_CT
diff --git a/IOT_LGen_Steps.ttcn b/IOT_LGen_Steps.ttcn
index b586130..c639d55 100644
--- a/IOT_LGen_Steps.ttcn
+++ b/IOT_LGen_Steps.ttcn
@@ -17,14 +17,14 @@
 module IOT_LGen_Steps {
 
   import from JSON_Types all;
-  import from General_Types all;
-  import from LightweightM2M_Types all;
   import from IOT_LGen_Definitions all;
+  import from EPTF_COAP_LGen_Definitions all;
   import from EPTF_COAP_LGen_Functions all;
   import from EPTF_MQTT_LGen_Functions all;
   import from EPTF_LwM2M_LGen_Functions all;
   import from EPTF_LwM2M_Object_Definitions all;
   import from EPTF_LwM2M_Object_Functions all;
+  import from LightweightM2M_Types all;
   import from EPTF_HTTP_Functions all;
   import from EPTF_HTTP_Transport_Functions all;
 
@@ -36,7 +36,6 @@
   import from EPTF_CLL_LGenBase_ConfigFunctions all;
   import from EPTF_CLL_ExecCtrlClient_Functions all;
 
-
   // Generic
     const charstring c_IOT_stepName_tcFinished_withVerdict := "IOT App: tcFinished_withVerdict";
     const charstring c_IOT_stepName_print_stringParam := "IOT App: print_stringParam";
@@ -48,6 +47,7 @@
   const charstring c_IOT_stepName_MQTT_setClientId_stringParam := "IOT App MQTT: setClientId_stringParam";
   // LwM2M
   const charstring c_IOT_stepName_LwM2M_setClientNameInRegister := "IOT App LwM2M: setClientNameInRegister";
+  const charstring c_IOT_stepName_LwM2M_setClientNameInRegister_stringVar := "IOT App LwM2M: setClientNameInRegister_stringVar";
   // HTTP
   const charstring c_IOT_stepName_HTTP_initEntityContext := "IOT App HTTP: initEntityContext";  
   const charstring c_IOT_stepName_HTTP_openConnection_byVars := "IOT App HTTP: openConnection_byVars";
@@ -62,8 +62,11 @@
   //  FSM_RegDereg
   const charstring c_IOT_stepName_FSM_RegDereg_initResourceValues := "IOT Fsm LWM2M_RegDereg: initResourceValues";
   // FSM SimDevice
+  const charstring c_IOT_stepName_FSM_SimDevice_createResources := "IOT Fsm LWM2M_SimDevice: createResources";
   const charstring c_IOT_stepName_FSM_SimDevice_initResourceValues := "IOT Fsm LWM2M_SimDevice: initResourceValues";
+  const charstring c_IOT_stepName_FSM_SimDevice_initTransport_boolVar := "IOT Fsm LWM2M_SimDevice: initTransport_boolVar";
   const charstring c_IOT_stepName_FSM_SimDevice_updateResourceValues := "IOT Fsm LWM2M_SimDevice: updateResourceValues";
+  const charstring c_IOT_stepName_FSM_SimDevice_handleExecute := "IOT Fsm LWM2M_SimDevice: handleExecute";
 
   function f_IOT_LGen_declareSteps()
   runs on IOT_LGen_CT
@@ -75,9 +78,13 @@
     f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_MQTT_setClientId_stringParam, refers(f_IOT_LGen_step_MQTT_setClientId_stringParam)});
     // LwM2M
     f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_FSM_RegDereg_initResourceValues, refers(f_IOT_LGen_step_FSM_RegDereg_initResourceValues)});
-    f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_LwM2M_setClientNameInRegister, refers(f_IOT_LGen_step_LwM2M_setClientNameInRegister)});
+    f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_FSM_SimDevice_createResources, refers(f_IOT_LGen_step_FSM_SimDevice_createResources)});
     f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_FSM_SimDevice_initResourceValues, refers(f_IOT_LGen_step_FSM_SimDevice_initResourceValues)});
+    f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_FSM_SimDevice_initTransport_boolVar, refers(f_IOT_LGen_step_FSM_SimDevice_initTransport_boolVar)});
     f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_FSM_SimDevice_updateResourceValues, refers(f_IOT_LGen_step_FSM_SimDevice_updateResourceValues)});
+    f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_FSM_SimDevice_handleExecute, refers(f_IOT_LGen_step_FSM_SimDevice_handleExecute)});
+    f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_LwM2M_setClientNameInRegister, refers(f_IOT_LGen_step_LwM2M_setClientNameInRegister)});
+    f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_LwM2M_setClientNameInRegister_stringVar, refers(f_IOT_LGen_step_LwM2M_setClientNameInRegister_stringVar)});
     // HTTP
     f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_HTTP_initEntityContext, refers(f_IOT_LGen_step_HTTP_initEntityContext)});
     f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_HTTP_openConnection_byVars, refers(f_IOT_LGen_step_HTTP_openConnection_byVars)});
@@ -92,7 +99,7 @@
     // Common
     f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_tcFinished_withVerdict, refers(f_IOT_LGen_step_tcFinished_withVerdict)});
     f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_print_stringParam, refers(f_IOT_LGen_step_print_stringParam)});
-    f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_genRndValue_varParams, refers(f_IOT_LGen_step_genRndValue_varParams)});
+	f_EPTF_LGenBase_declareStep(c_IOT_behaviorType, {c_IOT_stepName_genRndValue_varParams, refers(f_IOT_LGen_step_genRndValue_varParams)});
   }
   
   function f_IOT_LGen_getEntityIdxinEntityGroup(in EPTF_LGenBase_TestStepArgs pl_ptr)
@@ -158,10 +165,13 @@
       
       if (vl_localPort < 65535)
       {
-        f_EPTF_COAP_addressDB_add(
+        f_EPTF_COAP_transportEndpointDB_add(
           { 
-            hostName := vl_host.charstringVal,
-            portNumber := vl_localPort
+            socket := {
+              hostName := vl_host.charstringVal,
+              portNumber := vl_localPort
+            },
+            proto := { udp := {} }
           },
           v_COAP_EntityCtxDB.data[v_COAP_ctx.eCtxIdx].localAddressIdx
         );
@@ -250,11 +260,39 @@
   function f_IOT_LGen_step_LwM2M_setClientNameInRegister(in EPTF_LGenBase_TestStepArgs pl_ptr)
   runs on IOT_LGen_CT
   {
+    f_EPTF_LwM2M_Logging_DEBUG(log2str(%definitionId));
+    
     var integer vl_eRelIdxInEGrp := f_IOT_LGen_getEntityIdxinEntityGroup(pl_ptr);
     
     v_LwM2M_msgToSend.pdu.Register.endpointClientName := "eantwuhDev_" & int2str(vl_eRelIdxInEGrp);
   }
   
+  function f_IOT_LGen_step_LwM2M_setClientNameInRegister_stringVar(in EPTF_LGenBase_TestStepArgs pl_ptr)
+  runs on IOT_LGen_CT
+  {
+    f_EPTF_LwM2M_Logging_DEBUG(log2str(%definitionId));
+    
+    var EPTF_IntegerList vl_varIds := {};
+    f_EPTF_LGenBase_fsmVarIdListFromStep(pl_ptr, vl_varIds);
+
+    if (sizeof(vl_varIds)==1)
+    {
+      var EPTF_Var_DirectContent vl_endpoint;
+      f_EPTF_Var_getContent(vl_varIds[0], vl_endpoint);
+
+      if (not ischosen(vl_endpoint.charstringVal)) {
+        f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " first param is not charstring variable!"));
+        return;
+      }
+      
+      var integer vl_eRelIdxInEGrp := f_IOT_LGen_getEntityIdxinEntityGroup(pl_ptr);
+      v_LwM2M_msgToSend.pdu.Register.endpointClientName := vl_endpoint.charstringVal & int2str(vl_eRelIdxInEGrp);
+    }
+    else {
+      f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " one variable (useDTLS) is needed as parameter!"));
+    }
+  }
+  
   function f_IOT_LGen_step_HTTP_initEntityContext(in EPTF_LGenBase_TestStepArgs pl_ptr)
   runs on IOT_LGen_CT
   {
@@ -511,22 +549,25 @@
   function f_IOT_LGen_step_tcFinished_withVerdict(in EPTF_LGenBase_TestStepArgs pl_ptr)
   runs on IOT_LGen_CT
   {
-    f_EPTF_LGenBase_step_cancelAllTimers(pl_ptr);
-    f_COAP_step_cleanUp(pl_ptr);
-    f_MQTT_step_cleanUp(pl_ptr);
-    f_LwM2M_step_cleanupDevice(pl_ptr);
-    
     var charstring vl_reason := "";
  	var verdicttype vl_verdict := pass;
+ 	
+    var charstring vl_behavior := "behavior ["&f_EPTF_LGenBase_bIdx2Str(pl_ptr.reportedEvent.event.bIdx)&"]";
+    var charstring vl_event := "event ["&
+      f_EPTF_LGenBase_iIdx2Str(
+        pl_ptr.reportedEvent.event.bIdx, 
+        pl_ptr.reportedEvent.event.iIdx,
+        f_EPTF_LGenBase_getFsmIndexByCtxIdx(pl_ptr.eIdx, pl_ptr.refContext.fCtxIdx)
+      )&"]";
+ 	
  	f_EPTF_LGenBase_verdictOfStep(pl_ptr, vl_verdict, vl_reason);
 
 	var charstring vl_state := "state ["&f_EPTF_LGenBase_getFsmStateNameByStepArgs(pl_ptr)&"]";
 	
-	var integer vl_bIdx, vl_iIdx, vl_varIdx;	
-	pl_ptr.refContext.fRefArgs[c_EPTF_LGenBase_stepArgsIdxEventOfFsmVarId0] := -1;
-	f_EPTF_LGenBase_eventOfFsmFromStep(pl_ptr, vl_bIdx, vl_iIdx, vl_varIdx);	
-	var charstring vl_behavior := "behavior ["&f_EPTF_LGenBase_bIdx2Str(vl_bIdx)&"]";
-	var charstring vl_event := "event ["&f_EPTF_LGenBase_iIdx2Str(vl_bIdx, vl_iIdx)&"]";
+    f_EPTF_LGenBase_step_cancelAllTimers(pl_ptr);
+    f_COAP_step_cleanUp(pl_ptr);
+    f_MQTT_step_cleanUp(pl_ptr);
+    f_LwM2M_step_cleanupDevice(pl_ptr);
 
     if (vl_verdict == pass)
     {
@@ -579,40 +620,64 @@
     }
   }
   
-  // 1st param: min value (in): integer
-  // 2nd param: max value (in): integer
-  // 3rd param: rnd value (out): integer
-  function f_IOT_LGen_step_genRndValue_varParams(in EPTF_LGenBase_TestStepArgs pl_ptr)
+  function f_IOT_LGen_step_FSM_SimDevice_createResources(in EPTF_LGenBase_TestStepArgs pl_ptr)
   runs on IOT_LGen_CT
   {
-    f_EPTF_COAP_Logging_DEBUG(log2str(%definitionId, pl_ptr));
-    
+  }
+  
+  function f_IOT_LGen_step_FSM_SimDevice_initTransport_boolVar(in EPTF_LGenBase_TestStepArgs pl_ptr)
+  runs on IOT_LGen_CT
+  {
+    f_EPTF_COAP_Logging_DEBUG(log2str(%definitionId));
+
+    if (not f_EPTF_COAP_setStepCtx(pl_ptr, v_COAP_ctx)) { return; }
+
     var EPTF_IntegerList vl_varIds := {};
     f_EPTF_LGenBase_fsmVarIdListFromStep(pl_ptr, vl_varIds);
-    
-    if (sizeof(vl_varIds)==3)
+
+    if (sizeof(vl_varIds)==1)
     {
-      var EPTF_Var_DirectContent vl_min, vl_max, vl_rnd;
-      f_EPTF_Var_getContent(vl_varIds[0], vl_min);
-      f_EPTF_Var_getContent(vl_varIds[1], vl_max);
-      f_EPTF_Var_getContent(vl_varIds[2], vl_rnd);
-      
-      if (not ischosen(vl_min.intVal)) {
-        f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " first param is not integer variable!"));
-        return;
-      }
-      if (not ischosen(vl_max.intVal)) {
-        f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " second param is not integer variable!"));
+      var EPTF_Var_DirectContent vl_dtlsOn;
+      f_EPTF_Var_getContent(vl_varIds[0], vl_dtlsOn);
+
+      if (not ischosen(vl_dtlsOn.boolVal)) {
+        f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " first param is not boolean variable!"));
         return;
       }
       
-      var integer vl_randomVal := float2int(int2float(vl_max.intVal - vl_min.intVal +1)*rnd()) + vl_min.intVal;
-	  f_EPTF_COAP_Logging_VERBOSE(log2str(%definitionId, " calculated random value ",vl_randomVal));
-      
-      f_EPTF_Var_setContent(vl_varIds[2], { intVal := vl_randomVal });
+      // If we have to use DTLS
+      if (vl_dtlsOn.boolVal == true)
+      {
+        // We need to adjust the local and remote protocol to dtls
+        if (v_COAP_FsmCtxDB.data[v_COAP_ctx.fsmCtxIdx].remoteAddressIdx >= 0)
+        {
+          v_COAP_transportEndpointDB.data[v_COAP_EntityCtxDB.data[v_COAP_ctx.eCtxIdx].localAddressIdx].proto :=
+            { dtls := { udp := {} }};
+          v_COAP_transportEndpointDB.data[v_COAP_FsmCtxDB.data[v_COAP_ctx.fsmCtxIdx].remoteAddressIdx].proto :=
+            { dtls := { udp := {} }};
+        }
+        // We also need to initialize the DTLS connection:
+        //  - we need to set the identity and the keys first into the fsmCtx
+        //      we will use the tsp_EPTF_COAP_LGen_psks module par as a base and add the entity index inside the group to create the identity
+        if (sizeof(tsp_EPTF_COAP_LGen_psks) >= 1)
+        {
+          var integer vl_eRelIdxInEGrp := f_IOT_LGen_getEntityIdxinEntityGroup(pl_ptr);
+          v_COAP_FsmCtxDB.data[v_COAP_ctx.fsmCtxIdx].psk.identity := tsp_EPTF_COAP_LGen_psks[0].identity & int2str(vl_eRelIdxInEGrp);
+          v_COAP_FsmCtxDB.data[v_COAP_ctx.fsmCtxIdx].psk.key := tsp_EPTF_COAP_LGen_psks[0].key;
+          f_COAP_step_startDTLS(pl_ptr);
+        }
+        else {
+          f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " we want to use the first item in tsp_EPTF_COAP_LGen_psks to generate the identity and key!"));
+        }
+      }
+      // If we use plain UDP
+      else
+      {
+        f_COAP_step_startListening(pl_ptr);
+      }
     }
     else {
-      f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " at least three variables are needed as params!"));
+      f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " one variable (useDTLS) is needed as parameter!"));
     }
   }
   
@@ -650,6 +715,11 @@
         p_objId := 6, p_objInstId := 0, p_resourceId := 0,
         p_resource := v_res
       );     
+      /* f_LwM2M_ObjectDB_setResourceValue(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 6, p_objInstId := 0, p_resourceId := 0,
+        p_value := { floatValue := 47.475096 }
+      );*/
       
       //Longitude
       f_LwM2M_ObjectDB_getResource(
@@ -668,6 +738,11 @@
         p_objId := 6, p_objInstId := 0, p_resourceId := 1,
         p_resource := v_res
       );
+      /*f_LwM2M_ObjectDB_setResourceValue(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 6, p_objInstId := 0, p_resourceId := 1,
+        p_value := { floatValue := 19.057871 }
+      );*/
       
       // Altitude
       f_LwM2M_ObjectDB_setResourceValue(
@@ -682,73 +757,273 @@
         p_objId := 3303, p_objInstId := 0, p_resourceId := 5700,
         p_value := { floatValue := 34.35 }
       );
+      
+      // Dropped
+      f_LwM2M_ObjectDB_setResourceValue(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 3400, p_objInstId := 0, p_resourceId := 1,
+        p_value := { boolValue := false }
+      );
     }
   }
   
   function f_IOT_LGen_step_FSM_SimDevice_updateResourceValues(in EPTF_LGenBase_TestStepArgs pl_ptr)
   runs on IOT_LGen_CT
-  { 
+  {
+    f_EPTF_LwM2M_Logging_DEBUG(log2str(%definitionId));
+    f_EPTF_LwM2M_setStepCtx(pl_ptr, v_LwM2M_ctx);
+    
     var LwM2M_Resource v_res;
       
     //////////////////
+    // Dropped
+    
+    if(
+      f_LwM2M_ObjectDB_getResource(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 3400, p_objInstId := 0, p_resourceId := 1,
+        p_resource := v_res
+      )
+    ){
+      var boolean droppableChanged := false;
+      if (v_res.val.boolValue) {
+        v_res.val.boolValue := false;
+        droppableChanged := true;
+        action("Drop cleared")
+      }
+      else {
+        var float v_rnd := rnd();
+        if (v_rnd>=0.5) { 
+          v_res.val.boolValue := true;
+          droppableChanged := true;
+          action("Dropped: ",v_rnd);
+        }
+      }
+    
+      if (droppableChanged)
+      {
+        f_LwM2M_ObjectDB_setResource(
+          p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+          p_objId := 3400, p_objInstId := 0, p_resourceId := 1,
+          p_resource := v_res
+        );
+        f_EPTF_LwM2M_sendNotificationForResource(pl_ptr, v_res);
+      }
+    }
+      
+    //////////////////
     // Temperature
     
-    f_LwM2M_ObjectDB_getResource(
-      p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
-      p_objId := 3303, p_objInstId := 0, p_resourceId := 5700,
-      p_resource := v_res //{ floatValue := int2float(vl_randomVal) }
-    );
-      
-    v_res.val.floatValue := int2float(32 - 10 +1)*rnd() + 10.0;
-    if (ispresent(v_res.observe)) { v_res.observe.observe := v_res.observe.observe + 1 }
-      
-    f_LwM2M_ObjectDB_setResource(
-      p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
-      p_objId := 3303, p_objInstId := 0, p_resourceId := 5700,
-      p_resource := v_res
-    );
-      
-    //f_EPTF_LwM2M_sendNotificationForResource(pl_ptr, v_res);
+    if (
+      f_LwM2M_ObjectDB_getResource(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 3303, p_objInstId := 0, p_resourceId := 5700,
+        p_resource := v_res //{ floatValue := int2float(vl_randomVal) }
+      )
+    ){      
+      v_res.val.floatValue := int2float(32 - 10 +1)*rnd() + 10.0;      
+      f_LwM2M_ObjectDB_setResource(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 3303, p_objInstId := 0, p_resourceId := 5700,
+        p_resource := v_res
+      );      
+      f_EPTF_LwM2M_sendNotificationForResource(pl_ptr, v_res);
+    }
             
     //////////////////
     // Latitude
       
-    f_LwM2M_ObjectDB_getResource(
-      p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
-      p_objId := 6, p_objInstId := 0, p_resourceId := 0,
-      p_resource := v_res
-    );
-    
-    f_LwM2M_Resource_setNextDataSample(v_res, v_IOT_LGen_DataSamples_DB);
-    if (ispresent(v_res.observe)) { v_res.observe.observe := v_res.observe.observe + 1 }
-      
-    f_LwM2M_ObjectDB_setResource(
-      p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
-      p_objId := 6, p_objInstId := 0, p_resourceId := 0,
-      p_resource := v_res
-    );
-      
-    //f_EPTF_LwM2M_sendNotificationForResource(pl_ptr, v_res);
+    if (
+      f_LwM2M_ObjectDB_getResource(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 6, p_objInstId := 0, p_resourceId := 0,
+        p_resource := v_res
+      )
+    ){    
+      f_LwM2M_Resource_setNextDataSample(v_res, v_IOT_LGen_DataSamples_DB);      
+      f_LwM2M_ObjectDB_setResource(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 6, p_objInstId := 0, p_resourceId := 0,
+        p_resource := v_res
+      );      
+      f_EPTF_LwM2M_sendNotificationForResource(pl_ptr, v_res);
+    }
       
     //////////////////
     // Longitude
       
-    f_LwM2M_ObjectDB_getResource(
-      p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
-      p_objId := 6, p_objInstId := 0, p_resourceId := 1,
-      p_resource := v_res
-    );
-      
-    f_LwM2M_Resource_setNextDataSample(v_res, v_IOT_LGen_DataSamples_DB);
-    if (ispresent(v_res.observe)) { v_res.observe.observe := v_res.observe.observe + 1 }
-      
-    f_LwM2M_ObjectDB_setResource(
-      p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
-      p_objId := 6, p_objInstId := 0, p_resourceId := 1,
-      p_resource := v_res
-    );
-      
-    //f_EPTF_LwM2M_sendNotificationForResource(pl_ptr, v_res);
+    if (
+      f_LwM2M_ObjectDB_getResource(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 6, p_objInstId := 0, p_resourceId := 1,
+        p_resource := v_res
+      )
+    ){      
+      f_LwM2M_Resource_setNextDataSample(v_res, v_IOT_LGen_DataSamples_DB);
+      f_LwM2M_ObjectDB_setResource(
+        p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+        p_objId := 6, p_objInstId := 0, p_resourceId := 1,
+        p_resource := v_res
+      );      
+      f_EPTF_LwM2M_sendNotificationForResource(pl_ptr, v_res);
+    }
   }
   
+  function f_IOT_LGen_step_FSM_SimDevice_handleExecute(in EPTF_LGenBase_TestStepArgs pl_ptr)
+  runs on IOT_LGen_CT
+  {
+    f_EPTF_LwM2M_Logging_DEBUG(log2str(%definitionId));
+    f_EPTF_LwM2M_setStepCtx(pl_ptr, v_LwM2M_ctx);
+        
+    if (ischosen(v_LwM2M_msgToProcess.pdu.Execute) and v_LwM2M_ctx.deviceIdx >= 0)
+    {
+      var LwM2M_Resource v_res;
+      var boolean vl_found := false;
+	  if (f_LwM2M_ObjectPath_isResource(v_LwM2M_msgToProcess.pdu.Execute.path))
+	  {
+	    f_EPTF_LwM2M_Logging_DEBUG(log2str(%definitionId, " Looking up resource"));
+	    vl_found := f_LwM2M_ObjectDB_getResource(
+  	      v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects,
+  	      v_LwM2M_msgToProcess.pdu.Execute.path.objectId,
+  	      v_LwM2M_msgToProcess.pdu.Execute.path.objectInstanceId,
+  	      v_LwM2M_msgToProcess.pdu.Execute.path.resourceId,
+  	      v_res
+	    );
+	    f_EPTF_LwM2M_Logging_DEBUG(log2str(%definitionId, " resource found: ", v_res));
+	    
+	    action("executed: ", v_res);
+	    
+        v_LwM2M_msgToSend.eIdx := v_LwM2M_ctx.eIdx;
+        v_LwM2M_msgToSend.fsmIdx := v_LwM2M_ctx.fsmIdx;
+  	    v_LwM2M_msgToSend.pdu :=
+	    {
+	      Response := {
+	        location := {},
+	        code := 204,
+	        contentFormat := omit,
+	        resources := {}
+	      }
+	    }  	    
+	    vf_EPTF_LwM2M_Transport_send.apply(v_LwM2M_msgToSend);
+	    
+	    /*
+	    // Execute on Reset of DropDetector
+	    if (v_res.objId == 3400 and v_res.objInstId == 2)
+	    {
+	      f_LwM2M_ObjectDB_getResource(
+            p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+            p_objId := 3400, p_objInstId := 0, p_resourceId := 1,
+            p_resource := v_res
+          );
+      
+          v_res.val.boolValue := false;
+          if (ispresent(v_res.observe)) { v_res.observe.observe := v_res.observe.observe + 1 }
+      
+          f_LwM2M_ObjectDB_setResource(
+            p_db := v_LwM2M_DeviceDB.data[v_LwM2M_ctx.deviceIdx].objects, 
+            p_objId := 3400, p_objInstId := 0, p_resourceId := 1,
+            p_resource := v_res
+          );
+      
+          f_EPTF_LwM2M_sendNotificationForResource(pl_ptr, v_res);
+	    }
+		*/
+	  }
+	  else { f_EPTF_LwM2M_Logging_DEBUG(log2str(%definitionId, " Only resource can be executed, ignoring request")); }
+	}
+	else { f_EPTF_LwM2M_Logging_DEBUG(log2str(%definitionId, " not execute pdu, or no device available, returning")); }
+  }
+  
+  // 1st param: min value (in): integer
+  // 2nd param: max value (in): integer
+  // 3rd param: rnd value (out): integer
+  function f_IOT_LGen_step_genRndValue_varParams(in EPTF_LGenBase_TestStepArgs pl_ptr)
+  runs on IOT_LGen_CT
+  {
+    f_EPTF_COAP_Logging_DEBUG(log2str(%definitionId, pl_ptr));
+    
+    var EPTF_IntegerList vl_varIds := {};
+    f_EPTF_LGenBase_fsmVarIdListFromStep(pl_ptr, vl_varIds);
+    
+    if (sizeof(vl_varIds)==3)
+    {
+      var EPTF_Var_DirectContent vl_min, vl_max, vl_rnd;
+      f_EPTF_Var_getContent(vl_varIds[0], vl_min);
+      f_EPTF_Var_getContent(vl_varIds[1], vl_max);
+      f_EPTF_Var_getContent(vl_varIds[2], vl_rnd);
+      
+      if (not ischosen(vl_min.intVal)) {
+        f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " first param is not integer variable!"));
+        return;
+      }
+      if (not ischosen(vl_max.intVal)) {
+        f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " second param is not integer variable!"));
+        return;
+      }
+      
+      var integer vl_randomVal := float2int(int2float(vl_max.intVal - vl_min.intVal +1)*rnd()) + vl_min.intVal;
+	  f_EPTF_COAP_Logging_VERBOSE(log2str(%definitionId, " calculated random value ",vl_randomVal));
+      
+      f_EPTF_Var_setContent(vl_varIds[2], { intVal := vl_randomVal });
+    }
+    else {
+      f_EPTF_COAP_Logging_WARNING(log2str(%definitionId, " at least three variables are needed as params!"));
+    }
+  }
+  
+  /*
+  // Deprecated
+  
+  function f_IOT_App_step_tcFinished(in EPTF_LGenBase_TestStepArgs pl_ptr)
+  runs on IOT_LGen_CT
+  {
+    f_COAP_step_cleanUp(pl_ptr);      
+    f_LwM2M_step_cleanupDevice(pl_ptr);
+
+    if(pl_ptr.refContext.fRefArgs[0]==c_FSM_pass)
+    {
+      action("=> pass");
+      f_EPTF_LGenBase_step_trafficSuccess(pl_ptr);
+    }
+    else if(pl_ptr.refContext.fRefArgs[0]==c_FSM_fail)
+    {
+      action("=> fail");
+      f_EPTF_LGenBase_step_trafficFailed(pl_ptr);
+    }
+    else//c_FSM_timeout
+    {
+      action("=> timeout");
+      f_EPTF_LGenBase_step_trafficTimeout(pl_ptr);
+    }
+  }
+
+  function f_IOT_App_step_setLocalAddress(in EPTF_LGenBase_TestStepArgs pl_ptr)
+  runs on IOT_LGen_CT
+  {
+    if (not f_EPTF_COAP_setStepCtx(pl_ptr, v_COAP_ctx)) { return; }
+
+    if (v_COAP_EntityCtxDB.data[v_COAP_ctx.eCtxIdx].localAddressIdx == -1)
+    {
+      var integer vl_localPort := -1;
+
+      if (sizeof(pl_ptr.refContext.fRefArgs)>0)
+      {
+        vl_localPort := pl_ptr.refContext.fRefArgs[0];
+      }
+      else
+      {
+        vl_localPort := tsp_localPort+v_COAP_ctx.eIdx+1;
+      }
+
+      if (vl_localPort < 65535)
+      {
+        f_EPTF_COAP_addressDB_add({tsp_remoteHost, vl_localPort}, v_COAP_EntityCtxDB.data[v_COAP_ctx.eCtxIdx].localAddressIdx);
+      }
+      else
+      {
+        v_COAP_EntityCtxDB.data[v_COAP_ctx.eCtxIdx].localAddressIdx := v_IOT_LGen_localAddressIdx;
+      }
+    }
+  }
+  */
 }
