diff --git a/ttcn/CAM/LibItsCam_Functions.ttcn b/ttcn/CAM/LibItsCam_Functions.ttcn
index 65d87014ce7e66c113392b77a1b4a7d24559a09b..23ee715cbf8022c326306c3ac1ef187300330396 100644
--- a/ttcn/CAM/LibItsCam_Functions.ttcn
+++ b/ttcn/CAM/LibItsCam_Functions.ttcn
@@ -16,6 +16,8 @@ module LibItsCam_Functions {
     import from LibItsCam_TestSystem all;
     import from LibItsCam_Templates all;
     import from LibItsCam_TypesAndValues all;
+    import from LibItsCommon_Pixits all;
+    import from LibItsCommon_Templates all;
     import from LibItsCommon_Functions all;
     import from LibItsCommon_TypesAndValues all;
     import from ITS_Container language "ASN.1:1997" all;
@@ -105,14 +107,121 @@ module LibItsCam_Functions {
                     
     } // End of group utFunctions
 
+    group adapterControl {
+        
+        /**
+         * @desc    Triggers event in the test system adaptation.
+         * @param   p_event The event to trigger
+         * @return  FncRetCode
+         */
+        function f_acTriggerGnssEvent(template (value) AcGnssPrimitive p_event) runs on ItsCam return FncRetCode {
+            var FncRetCode v_ret := e_success;
+            
+            acPort.send(p_event);
+            tc_ac.start;
+            alt {
+                [] acPort.receive(m_acGnssResponseSuccess) {
+                    tc_ac.stop;
+                }
+                [] acPort.receive {
+                    tc_ac.stop;
+                    log("*** " & __SCOPE__ & ": ERROR: Received unexpected message ***");
+                    f_selfOrClientSyncAndVerdict("error", e_error);
+                }
+                [] tc_ac.timeout {
+                    log("*** " & __SCOPE__ & ": ERROR: Timeout while waiting for adapter control event result ***");
+                    f_selfOrClientSyncAndVerdict("error", e_timeout);
+                }
+            }
+            
+            return v_ret;
+        }
+        
+        /**
+         * @desc    Loads the given scenario
+         * 
+         * @param   p_scenario   The scenario to load.
+         */
+        function f_acLoadScenario(Scenario p_scenario) runs on ItsCam {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true) {
+                f_acTriggerGnssEvent(m_loadScenario(p_scenario));
+            }
+        } // end f_acLoadScenario
+        
+        /**
+         * @desc    Starts a loaded scenario
+         */
+        function f_acStartScenario() runs on ItsCam {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true) {
+                f_acTriggerGnssEvent(m_startScenario);
+                vc_scenarioStarted := true;
+            }
+        } // end f_acStartScenario
+        
+        /**
+         * @desc    Stops a loaded scenario
+         */
+        function f_acStopScenario() runs on ItsCam {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
+                f_acTriggerGnssEvent(m_stopScenario);
+                vc_scenarioStarted := false;
+            }
+        } // end f_acStopScenario
+        
+        function f_acAwaitDistanceCovered(float p_distanceToCover) runs on ItsCam return FncRetCode {
+            var FncRetCode v_ret := e_success;
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
+                f_acTriggerGnssEvent(m_distanceToCover(p_distanceToCover));
+                
+                tc_ac.start;
+                alt {
+                    [] acPort.receive(m_acGnssDistanceCovered) {
+                        tc_ac.stop;
+                    }
+                    [] acPort.receive {
+                        tc_ac.stop;
+                        log("*** " & __SCOPE__ & ": ERROR: Received unexpected message ***");
+                        f_selfOrClientSyncAndVerdict("error", e_error);
+                    }
+                    [] tc_ac.timeout {
+                        log("*** " & __SCOPE__ & ": ERROR: Timeout while waiting for covered distance indication ***");
+                        f_selfOrClientSyncAndVerdict("error", e_timeout);
+                    }
+                }
+                
+            }
+            return v_ret;
+        } // end f_acAwaitDistanceCovered
+        
+        function f_acChangeSpeed(SpeedValue p_deltaSpeedValue) runs on ItsCam {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
+                f_acTriggerGnssEvent(m_changeScenarioSpeed(p_deltaSpeedValue));
+            }
+        } // end f_acChangeSpeed
+        
+        function f_acChangeHeading(HeadingValue p_deltaHeadingValue) runs on ItsCam {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
+                f_acTriggerGnssEvent(m_changeScenarioHeading(p_deltaHeadingValue));
+            }
+        } // end f_acChangeHeading
+        
+    } // End of group adapterControl
+
     group camConfigurationFunctions {
         
         /**
          * @desc    Setups default configuration   
          */
-        function f_cfUp() runs on ItsCam {
+        function f_cfUp() runs on ItsCam system ItsCamSystem {
             
             map(self:utPort, system:utPort);
+            map(self:acPort, system:acPort);
             map(self:camPort, system:camPort);
             f_connect4SelfOrClientSync();
             
@@ -121,9 +230,10 @@ module LibItsCam_Functions {
         /**
          * @desc    Deletes default configuration 
          */
-        function f_cfDown() runs on ItsCam {
+        function f_cfDown() runs on ItsCam system ItsCamSystem {
             
             unmap(self:utPort, system:utPort);
+            unmap(self:acPort, system:acPort);
             unmap(self:camPort, system:camPort);
             f_disconnect4SelfOrClientSync();
             
@@ -191,16 +301,22 @@ module LibItsCam_Functions {
          * @desc    Initialize the IUT
          * @remark  No specific actions specified in the base standard
          */    
-        function f_prInitialState() runs on ItsCam {
+        function f_prInitialState(Scenario p_scenario := e_staticPosition, boolean p_awaitInitialCAM := true) runs on ItsCam {
             
             f_utInitializeIut(m_camInitialize);
             
             f_prDefault();
             
+            f_acLoadScenario(p_scenario);
+            
             //Allow burst mode at the beginning
             f_sleep(1.0);
             
             camPort.clear;
+            
+            f_acStartScenario();
+            
+            if (p_awaitInitialCAM) {
             tc_ac.start;
             alt {
                 [] camPort.receive(mw_camInd ( mw_camMsg_any )){
@@ -212,6 +328,7 @@ module LibItsCam_Functions {
                     f_selfOrClientSyncAndVerdictPreamble("error", e_timeout);
                 }
             }  
+            }
         
         } // end f_prInitialState
     
@@ -223,7 +340,7 @@ module LibItsCam_Functions {
          * @desc The default postamble.
          */
         function f_poDefault() runs on ItsCam {
-            //empty
+            f_acStopScenario();
         }
         
     } // end group postambles
@@ -239,7 +356,7 @@ module LibItsCam_Functions {
          * 
          * @return The new reference position.
          */
-        function f_computePositionUsingDistance(in ReferencePosition p_referencePosition, in integer p_offSet) return ReferencePosition {
+        function f_computePositionUsingDistance(in ReferencePosition p_referencePosition, in float p_offSet) return ReferencePosition {
             var ReferencePosition v_referencePosition := p_referencePosition;
             
             log("*** f_computePositionUsingDistance: INFO: calling fx_computePositionUsingDistance() ***");
@@ -256,6 +373,28 @@ module LibItsCam_Functions {
         
     } // end group camPositionFunctions
 
+    group camAuxilaryFunctions {
+        
+        function f_changeSpeed(SpeedValue p_deltaSpeedValue) runs on ItsCam {
+            if (PICS_GNSS_SCENARIO_SUPPORT == false) {
+                f_utTriggerEvent(m_changeSpeed(p_deltaSpeedValue));
+            }
+            else {
+                f_acChangeSpeed(p_deltaSpeedValue);
+            }
+        }
+        
+        function f_changeHeading(HeadingValue p_deltaHeadingValue) runs on ItsCam {
+            if (PICS_GNSS_SCENARIO_SUPPORT == false) {
+                f_utTriggerEvent(m_changeHeading(p_deltaHeadingValue));
+            }
+            else {
+                f_acChangeHeading(p_deltaHeadingValue);
+            }
+        }
+        
+    } // end group camAuxilaryFunctions
+    
     group camGenerators {
         function f_generateDefaultCam() 
         return octetstring {
diff --git a/ttcn/CAM/LibItsCam_TestSystem.ttcn b/ttcn/CAM/LibItsCam_TestSystem.ttcn
index 5234178cf352c18e65f7b886dbb1d2a32802da0f..684e8e3712bbecf60bacbc97bc2a8e437a46325f 100644
--- a/ttcn/CAM/LibItsCam_TestSystem.ttcn
+++ b/ttcn/CAM/LibItsCam_TestSystem.ttcn
@@ -25,14 +25,24 @@ module LibItsCam_TestSystem {
     
     group portDefinitions {
     
+        /**
+         * @desc Adapter control port
+         */
+        type port AdapterControlPort message {
+            out
+                AcGnssPrimitive;
+            in
+                AcGnssResponse, AcGnssDistanceCovered;
+        } // end AdapterControlPort
+        
         /**
          * @desc Upper Tester port
          */
         type port UpperTesterPort message {
             out 
-                UtInitialize, UtCamTrigger, UtChangePosition;
+                UtInitialize, UtCamTrigger, UtChangePosition, UtActivatePositionTime, UtDeactivatePositionTime;
             in 
-                UtInitializeResult, UtCamTriggerResult, UtChangePositionResult, UtCamEventInd;
+                UtInitializeResult, UtCamTriggerResult, UtChangePositionResult, UtActivatePositionTimeResult, UtDeactivatePositionTimeResult, UtCamEventInd;
         } // end UpperTesterPort
         
     } // end portDefinitions
@@ -65,6 +75,7 @@ module LibItsCam_TestSystem {
         type component ItsCamSystem {
             
             port UpperTesterPort utPort;
+            port AdapterControlPort acPort;
             
             // FA1 ports
             port CamPort camPort;
@@ -79,6 +90,7 @@ module LibItsCam_TestSystem {
     type component ItsCam extends ItsBaseComponent {
 
         port UpperTesterPort utPort;
+        port AdapterControlPort acPort;
         
         // FA1 ports
         port CamPort camPort;
diff --git a/ttcn/Common/LibItsCommon_Functions.ttcn b/ttcn/Common/LibItsCommon_Functions.ttcn
index 098c7b6147006cae3facd5dc2145ee2f84296da0..53a7c042eba27d86f67449f52cefec99ed030eff 100644
--- a/ttcn/Common/LibItsCommon_Functions.ttcn
+++ b/ttcn/Common/LibItsCommon_Functions.ttcn
@@ -195,7 +195,7 @@ module LibItsCommon_Functions {
         external function fx_computePositionUsingDistance(
             in Int32 p_refLatitude, 
             in Int32 p_refLongitude, 
-            in integer p_distance, 
+            in float p_distance, 
             in integer p_orientation,
             out Int32 p_latitude,
             out Int32 p_longitude
diff --git a/ttcn/Common/LibItsCommon_Pixits.ttcn b/ttcn/Common/LibItsCommon_Pixits.ttcn
index a3d368ddd41a34d83cc2d21f314bda1a813f45c2..12ceb2e339e29193fc4a5b70bfc1ececacaa75c9 100644
--- a/ttcn/Common/LibItsCommon_Pixits.ttcn
+++ b/ttcn/Common/LibItsCommon_Pixits.ttcn
@@ -46,4 +46,9 @@ module LibItsCommon_Pixits {
      */
     modulepar integer PX_TIME_DELTA := 1000;
     
+    /**
+     * @desc Support for GNSS scenario
+     */
+    modulepar boolean PICS_GNSS_SCENARIO_SUPPORT := true;
+    
 } // end LibItsCommon_Pixits
\ No newline at end of file
diff --git a/ttcn/Common/LibItsCommon_Templates.ttcn b/ttcn/Common/LibItsCommon_Templates.ttcn
new file mode 100644
index 0000000000000000000000000000000000000000..629c03bb4605dbef4253a1e4b00919d24a4e5e9f
--- /dev/null
+++ b/ttcn/Common/LibItsCommon_Templates.ttcn
@@ -0,0 +1,75 @@
+/**
+ *  @author      ETSI / STF405 / STF449
+ *  @version     $URL$
+ *               $Id$
+ *  @desc        Module containing base template definitions for DENM
+ *
+ */
+module LibItsCommon_Templates {
+    
+    import from ITS_Container language "ASN.1:1997" all;
+
+    // LibItsCommon
+    import from LibItsCommon_TypesAndValues all;
+    
+    group taPrimitives {
+        
+        template AcGnssResponse m_acGnssResponseSuccess := true;
+        
+        template AcGnssDistanceCovered m_acGnssDistanceCovered := true;
+        
+        /**
+         * @desc Testsystem will load GNSS scenario
+         */
+        template AcGnssPrimitive m_loadScenario(Scenario p_scenario) := {
+            loadScenario := {
+                scenario := p_scenario
+            }
+        }
+        
+        /**
+         * @desc Testsystem will start GNSS scenario
+         */
+        template AcGnssPrimitive m_startScenario := {
+            startScenario := {
+            }
+        }
+        
+        /**
+         * @desc Testsystem will stop GNSS scenario
+         */
+        template AcGnssPrimitive m_stopScenario := {
+            stopScenario := {
+            }
+        }
+        
+        /**
+         * @desc Testsystem will request indication if distance was covered
+         */
+        template AcGnssPrimitive m_distanceToCover(float p_distance) := {
+            distanceToCover := {
+                distance := p_distance
+            }
+        }
+        
+        /**
+         * @desc Testsystem will change the speed (delta value)
+         */
+        template AcGnssPrimitive m_changeScenarioSpeed(SpeedValue p_deltaSpeedValue) := {
+            changeSpeed := {
+                deltaSpeed := p_deltaSpeedValue
+            }
+        }
+        
+        /**
+         * @desc Testsystem will change the heading (delta value)
+         */
+        template AcGnssPrimitive m_changeScenarioHeading(HeadingValue p_deltaHeadingValue) := {
+            changeHeading := {
+                deltaHeading := p_deltaHeadingValue
+            }
+        }
+        
+    } // end taPrimitives
+    
+}
diff --git a/ttcn/Common/LibItsCommon_TestSystem.ttcn b/ttcn/Common/LibItsCommon_TestSystem.ttcn
index 24d8607cd76df7d68ccee60e703784b643e192ae..22897753c7adbf86e2e833f3ae334b491e100d69 100644
--- a/ttcn/Common/LibItsCommon_TestSystem.ttcn
+++ b/ttcn/Common/LibItsCommon_TestSystem.ttcn
@@ -37,6 +37,8 @@ module LibItsCommon_TestSystem {
             timer tc_ac := PX_TAC;
             timer tc_noac := PX_TNOAC;
             
+            var boolean vc_scenarioStarted := false;
+            
         } // end ItsComponent
     
     } // End of group componentDefinitions
diff --git a/ttcn/Common/LibItsCommon_TypesAndValues.ttcn b/ttcn/Common/LibItsCommon_TypesAndValues.ttcn
index 0a74a782dfbb8528a9b40f81c6d5ba78671796e4..7a366eb17649221d2a4863dafa1357b9f8c561fe 100644
--- a/ttcn/Common/LibItsCommon_TypesAndValues.ttcn
+++ b/ttcn/Common/LibItsCommon_TypesAndValues.ttcn
@@ -53,11 +53,117 @@ module LibItsCommon_TypesAndValues {
          * @desc Upper Tester result message of the change pseudonym request 
          */
         type boolean UtChangePseudonymResult;
+        
+        /**
+         * @desc Upper Tester message to activate position and/or time
+         */
+        type record UtActivatePositionTime {
+            // empty on purpose
+        }
+        
+        /**
+         * @desc Upper Tester result message of the activate position and/or time request 
+         */
+        type boolean UtActivatePositionTimeResult;
+        
+        /**
+         * @desc Upper Tester message to deactivate position and/or time
+         */
+        type record UtDeactivatePositionTime {
+            // empty on purpose
+        }
+        
+        /**
+         * @desc Upper Tester result message of the deactivate position and/or time request 
+         */
+        type boolean UtDeactivatePositionTimeResult;
+        
     }
     with {
         encode "UpperTester"
     }
     
+    group acPrimitives {
+        
+        /**
+         * @desc    TA primitives for DENM
+         * @member  loadScenario                -
+         * @member  startScenario               -
+         * @member  stopScenario                -
+         * @member  distanceCovered             -
+         */
+        type union AcGnssPrimitive {
+            AcLoadScenario loadScenario,
+            AcStartScenario startScenario,
+            AcStopScenario stopScenario,
+            AcDistanceToCover distanceToCover,
+            AcChangeSpeed changeSpeed,
+            AcChangeHeading changeHeading
+        }
+        
+        /**
+         * @desc    Primitive for receiving response from TA
+         */
+        type boolean AcGnssResponse;
+        
+        /**
+         * @desc    Primitive for receiving an indication if requested distance was covered from TA
+         */
+        type boolean AcGnssDistanceCovered;
+        
+        /**
+         * @desc    Primitive for loading a scenario
+         * @member  scenario   Scenario to load
+         */
+        type record AcLoadScenario {
+            Scenario scenario
+        }
+        
+        type enumerated Scenario {
+            e_staticPosition(0),
+            e_dynamicPosition200m(200),
+            e_dynamicPosition1000m(1000),
+            e_dynamicPosition1500m(1500)
+        }
+        
+        /**
+         * @desc    Primitive for starting the loaded scenario
+         */
+        type record AcStartScenario {
+        }
+        
+        /**
+         * @desc    Primitive for stopping the loaded scenario
+         */
+        type record AcStopScenario {
+        }
+        
+        /**
+         * @desc Primitive to inform when given distance was covered
+         */
+        type record AcDistanceToCover {
+            float distance
+        }
+        
+        /**
+         * @desc Primitive to change speed in current scenario
+         */
+        type record AcChangeSpeed {
+            SpeedValue deltaSpeed
+        }
+        
+        /**
+         * @desc Primitive to change heading in current scenario
+         */
+        type record AcChangeHeading {
+            HeadingValue deltaHeading
+        }
+        
+    } // end acPrimitives
+    with {
+        encode "AdapterControl"
+    }
+    
 }
 with {
     encode "LibItsCommon"
diff --git a/ttcn/DENM/LibItsDenm_Functions.ttcn b/ttcn/DENM/LibItsDenm_Functions.ttcn
index e9343da4585db980e832604b845c2e6788efc7e8..4448bca730516a76f45e38e62757dbeaa93bedb9 100644
--- a/ttcn/DENM/LibItsDenm_Functions.ttcn
+++ b/ttcn/DENM/LibItsDenm_Functions.ttcn
@@ -13,11 +13,12 @@ module LibItsDenm_Functions {
     import from LibCommon_Time { modulepar PX_TNOAC ; function f_sleep };
     
     // LibItsCommon
+    import from LibItsCommon_Templates all;
     import from LibItsCommon_TypesAndValues all;
     import from LibItsCommon_Functions all;
+    import from LibItsCommon_Pixits all;
     
     // LibIts
-    import from LibItsCommon_Functions all;
     import from LibItsDenm_TestSystem all;
     import from LibItsDenm_TypesAndValues all; 
     import from LibItsDenm_Templates all; 
@@ -102,6 +103,7 @@ module LibItsDenm_Functions {
                     v_actionId := v_result.actionId;
                     if ( not v_result.result ) {
                         f_selfOrClientSyncAndVerdict("DENM Trigger failed", e_error);
+                    }
                 }
                 [] a_utDefault() {
                   //empty on purpose
@@ -125,7 +127,7 @@ module LibItsDenm_Functions {
          */
         function f_utUpdateEvent(template (value) UtDenmUpdate p_event) runs on ItsDenm return ActionID {
             var ActionID v_actionId;
-            var UtDenmTriggerResult v_result;
+            var UtDenmUpdateResult v_result;
             
             utPort.send(p_event);
             tc_wait.start;
@@ -206,13 +208,106 @@ module LibItsDenm_Functions {
         
     } // End of group utFunctions
 
+    group adapterControl {
+        
+        /**
+         * @desc    Triggers event in the test system adaptation.
+         * @param   p_event The event to trigger
+         * @return  FncRetCode
+         */
+        function f_acTriggerGnssEvent(template (value) AcGnssPrimitive p_event) runs on ItsDenm return FncRetCode {
+            var FncRetCode v_ret := e_success;
+            
+            acPort.send(p_event);
+            tc_ac.start;
+            alt {
+                [] acPort.receive(m_acGnssResponseSuccess) {
+                    tc_ac.stop;
+                }
+                [] acPort.receive {
+                    tc_ac.stop;
+                    log("*** " & __SCOPE__ & ": ERROR: Received unexpected message ***");
+                    f_selfOrClientSyncAndVerdict("error", e_error);
+                }
+                [] tc_ac.timeout {
+                    log("*** " & __SCOPE__ & ": ERROR: Timeout while waiting for adapter control event result ***");
+                    f_selfOrClientSyncAndVerdict("error", e_timeout);
+                }
+            }
+            
+            return v_ret;
+        }
+        
+        /**
+         * @desc    Loads the given scenario
+         * 
+         * @param   p_scenario   The scenario to load.
+         */
+        function f_acLoadScenario(Scenario p_scenario) runs on ItsDenm {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true) {
+                f_acTriggerGnssEvent(m_loadScenario(p_scenario));
+            }
+        } // end f_acLoadScenario
+        
+        /**
+         * @desc    Starts a loaded scenario
+         */
+        function f_acStartScenario() runs on ItsDenm {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true) {
+                f_acTriggerGnssEvent(m_startScenario);
+                vc_scenarioStarted := true;
+            }
+        } // end f_acStartScenario
+        
+        /**
+         * @desc    Stops a loaded scenario
+         */
+        function f_acStopScenario() runs on ItsDenm {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
+                f_acTriggerGnssEvent(m_stopScenario);
+                vc_scenarioStarted := false;
+            }
+        } // end f_acStopScenario
+        
+        function f_acAwaitDistanceCovered(float p_distanceToCover) runs on ItsDenm return FncRetCode {
+            var FncRetCode v_ret := e_success;
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
+                f_acTriggerGnssEvent(m_distanceToCover(p_distanceToCover));
+                
+                tc_ac.start;
+                alt {
+                    [] acPort.receive(m_acGnssDistanceCovered) {
+                        tc_ac.stop;
+                    }
+                    [] acPort.receive {
+                        tc_ac.stop;
+                        log("*** " & __SCOPE__ & ": ERROR: Received unexpected message ***");
+                        f_selfOrClientSyncAndVerdict("error", e_error);
+                    }
+                    [] tc_ac.timeout {
+                        log("*** " & __SCOPE__ & ": ERROR: Timeout while waiting for covered distance indication ***");
+                        f_selfOrClientSyncAndVerdict("error", e_timeout);
+                    }
+                }
+                
+            }
+            return v_ret;
+        } // end f_acAwaitDistanceCovered
+        
+    } // End of group adapterControl
+
     group denmConfigurationFunctions {
         
         /**
          * @desc    Setups default configuration   
          */
-        function f_cfUp() runs on ItsDenm {
+        function f_cfUp() runs on ItsDenm system ItsDenmSystem {
             
+            map(self:acPort, system:acPort);
             map(self:utPort, system:utPort);
             map(self:denmPort, system:denmPort);
             f_connect4SelfOrClientSync();
@@ -222,8 +317,9 @@ module LibItsDenm_Functions {
         /**
          * @desc    Deletes default configuration 
          */
-        function f_cfDown() runs on ItsDenm {
+        function f_cfDown() runs on ItsDenm system ItsDenmSystem {
             
+            unmap(self:acPort, system:acPort);
             unmap(self:utPort, system:utPort);
             unmap(self:denmPort, system:denmPort);
             f_disconnect4SelfOrClientSync();
@@ -295,11 +391,14 @@ module LibItsDenm_Functions {
          * @desc Brings the IUT into an initial state.
          * @return FncRetCode 
          */
-        function f_prInitialState() runs on ItsDenm return FncRetCode {
+        function f_prInitialState(Scenario p_scenario := e_staticPosition) runs on ItsDenm return FncRetCode {
             var FncRetCode v_ret := e_success;
             
             f_utInitializeIut(m_denmInitialize);
             
+            f_acLoadScenario(valueof(p_scenario));
+            f_acStartScenario();
+            
             f_prDefault();
             
             return v_ret;
@@ -314,7 +413,7 @@ module LibItsDenm_Functions {
          */
         function f_poDefault() runs on ItsDenm {
             var FncRetCode v_ret := e_success;
-            //empty
+            f_acStopScenario();
         }
         
         /**
diff --git a/ttcn/DENM/LibItsDenm_TestSystem.ttcn b/ttcn/DENM/LibItsDenm_TestSystem.ttcn
index 0e252f84cc53df67757e132ecd998f297c2ad3a3..1057febd5b907ec87c164e6ff3fde2b77b6d9999 100644
--- a/ttcn/DENM/LibItsDenm_TestSystem.ttcn
+++ b/ttcn/DENM/LibItsDenm_TestSystem.ttcn
@@ -25,6 +25,16 @@ module LibItsDenm_TestSystem {
     
     group portDefinitions {
     
+        /**
+         * @desc Adapter control port
+         */
+        type port AdapterControlPort message {
+            out
+                AcGnssPrimitive;
+            in
+                AcGnssResponse, AcGnssDistanceCovered;
+        } // end AdapterControlPort
+        
         /**
          * @desc Upper Tester port
          */
@@ -65,6 +75,7 @@ module LibItsDenm_TestSystem {
         type component ItsDenmSystem {
             
             port UpperTesterPort utPort;
+            port AdapterControlPort acPort;
             
             // FA1 ports
             port DenmPort denmPort;
@@ -78,6 +89,7 @@ module LibItsDenm_TestSystem {
      */
     type component ItsDenm extends ItsBaseComponent {
 
+        port AdapterControlPort acPort;
         port UpperTesterPort utPort;
 
         // FA1 ports
diff --git a/ttcn/GeoNetworking/LibItsGeoNetworking_Functions.ttcn b/ttcn/GeoNetworking/LibItsGeoNetworking_Functions.ttcn
index ba14a52350dd1e187d5694b4e551e7dbb73e81df..e13ccfc8f41fd78f6ce140d7d5d9c67b530bdd8b 100644
--- a/ttcn/GeoNetworking/LibItsGeoNetworking_Functions.ttcn
+++ b/ttcn/GeoNetworking/LibItsGeoNetworking_Functions.ttcn
@@ -16,6 +16,8 @@ module LibItsGeoNetworking_Functions {
     
     // LibItsCommon
     import from LibItsCommon_Functions all;
+    import from LibItsCommon_Pixits all;
+    import from LibItsCommon_Templates all;
     import from LibItsCommon_TestSystem all;
     import from LibItsCommon_TypesAndValues all;
     import from LibItsExternal_TypesAndValues {type MacAddress};
@@ -139,7 +141,7 @@ module LibItsGeoNetworking_Functions {
          *       - Area2 which only includes NodeB
          *         NodeB being close to the area center
          */
-        function f_cf01Up() runs on ItsGeoNetworking {
+        function f_cf01Up(Scenario p_scenario := e_staticPosition) runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
             
             // Variables
             var PositionTable v_positionTable := {};
@@ -158,7 +160,7 @@ module LibItsGeoNetworking_Functions {
             f_initialiseSecuredMode();
             
             //Initialze the IUT
-            f_initialState();
+            f_initialState(p_scenario);
             
             // Positions & Areas
             f_preparePositionsAndAreas(v_positionTable, v_areaTable);
@@ -167,7 +169,7 @@ module LibItsGeoNetworking_Functions {
             
         } // end f_cf01Up
         
-        function f_cf01Down() runs on ItsGeoNetworking {
+        function f_cf01Down() runs on ItsGeoNetworking system ItsGeoNetworkingSystem {
             
             f_uninitialiseSecuredMode();
             
@@ -192,7 +194,7 @@ module LibItsGeoNetworking_Functions {
          *
          * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
          */
-        function f_cf02Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
+        function f_cf02Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Variables
             var PositionTable v_positionTable := {};
@@ -227,11 +229,11 @@ module LibItsGeoNetworking_Functions {
                 f_initialiseSecuredMode();
                 
                 // MTC intializes IUT
-                f_initialState();
+                f_initialState(p_scenario);
             }
             else {
                 v_component := f_getComponent(p_mainUtComponent);
-                v_component.start(f_initialState());
+                v_component.start(f_initialState(p_scenario));
                 v_component.done;    
             }
             
@@ -251,7 +253,7 @@ module LibItsGeoNetworking_Functions {
         /**
          * @desc Deletes configuration cf02
          */
-        function f_cf02Down() runs on ItsMtc {
+        function f_cf02Down() runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Local variables
             var integer i;
@@ -282,7 +284,7 @@ module LibItsGeoNetworking_Functions {
          *         NodeB being close to the area center
          * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
          */
-        function f_cf03Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
+        function f_cf03Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Variables
             var PositionTable v_positionTable := {};
@@ -317,11 +319,11 @@ module LibItsGeoNetworking_Functions {
                 f_initialiseSecuredMode();
                 
                 // MTC intializes IUT
-                f_initialState();
+                f_initialState(p_scenario);
             }
             else {
                 v_component := f_getComponent(p_mainUtComponent);
-                v_component.start(f_initialState());
+                v_component.start(f_initialState(p_scenario));
                 v_component.done;   
             }
             
@@ -341,7 +343,7 @@ module LibItsGeoNetworking_Functions {
         /**
          * @desc Deletes configuration cf03
          */
-        function f_cf03Down() runs on ItsMtc {
+        function f_cf03Down() runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Local variables
             var integer i;
@@ -374,7 +376,7 @@ module LibItsGeoNetworking_Functions {
          *         NodeB being close to the area center
          * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
          */
-        function f_cf04Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
+        function f_cf04Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Variables
             var PositionTable v_positionTable := {};
@@ -409,11 +411,11 @@ module LibItsGeoNetworking_Functions {
                 f_initialiseSecuredMode();
                 
                 // MTC intializes IUT
-                f_initialState();
+                f_initialState(p_scenario);
             }
             else {
                 v_component := f_getComponent(p_mainUtComponent);
-                v_component.start(f_initialState());
+                v_component.start(f_initialState(p_scenario));
                 v_component.done;   
             }
             
@@ -433,7 +435,7 @@ module LibItsGeoNetworking_Functions {
         /**
          * @desc Deletes configuration cf04
          */
-        function f_cf04Down() runs on ItsMtc {
+        function f_cf04Down() runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Local variables
             var integer i;
@@ -462,7 +464,7 @@ module LibItsGeoNetworking_Functions {
          *       - Area1 which only includes NodeB, NodeD and IUT
          * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
          */
-        function f_cf05Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
+        function f_cf05Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Variables
             var PositionTable v_positionTable := {};
@@ -497,11 +499,11 @@ module LibItsGeoNetworking_Functions {
                 f_initialiseSecuredMode();
                 
                 // MTC intializes IUT
-                f_initialState();
+                f_initialState(p_scenario);
             }
             else {
                 v_component := f_getComponent(p_mainUtComponent);
-                v_component.start(f_initialState());
+                v_component.start(f_initialState(p_scenario));
                 v_component.done;   
             }
             
@@ -520,7 +522,7 @@ module LibItsGeoNetworking_Functions {
         /**
          * @desc Deletes configuration cf05
          */
-        function f_cf05Down() runs on ItsMtc {
+        function f_cf05Down() runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Local variables
             var integer i;
@@ -550,7 +552,7 @@ module LibItsGeoNetworking_Functions {
          *       - IUT not in sectorial area of NodeB-NodeF
          * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
          */
-        function f_cf06Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
+        function f_cf06Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
                     
             // Variables
             var PositionTable v_positionTable := {};
@@ -585,11 +587,11 @@ module LibItsGeoNetworking_Functions {
                 f_initialiseSecuredMode();
                 
                 // MTC intializes IUT
-                f_initialState();
+                f_initialState(p_scenario);
             }
             else {
                 v_component := f_getComponent(p_mainUtComponent);
-                v_component.start(f_initialState());
+                v_component.start(f_initialState(p_scenario));
                 v_component.done;   
             }
             
@@ -608,7 +610,7 @@ module LibItsGeoNetworking_Functions {
         /**
          * @desc Deletes configuration cf06
          */
-        function f_cf06Down() runs on ItsMtc {
+        function f_cf06Down() runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Local variables
             var integer i;
@@ -637,7 +639,7 @@ module LibItsGeoNetworking_Functions {
          *       - Area1 which only includes NodeB, NodeD and IUT
          * @param p_mainUtComponent Name of the component that will initialize IUT and handle default UT messages
          */
-        function f_cf07Up(in charstring p_mainUtComponent := c_compMTC) runs on ItsMtc {
+        function f_cf07Up(in charstring p_mainUtComponent := c_compMTC, Scenario p_scenario := e_staticPosition) runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
                     
             // Variables
             var PositionTable v_positionTable := {};
@@ -672,11 +674,11 @@ module LibItsGeoNetworking_Functions {
                 f_initialiseSecuredMode();
                 
                 // MTC intializes IUT
-                f_initialState();
+                f_initialState(p_scenario);
             }
             else {
                 v_component := f_getComponent(p_mainUtComponent);
-                v_component.start(f_initialState());
+                v_component.start(f_initialState(p_scenario));
                 v_component.done;   
             }
             
@@ -695,7 +697,7 @@ module LibItsGeoNetworking_Functions {
         /**
          * @desc Deletes configuration cf06
          */
-        function f_cf07Down() runs on ItsMtc {
+        function f_cf07Down() runs on ItsMtc mtc ItsMtc system ItsGeoNetworkingSystem {
             
             // Local variables
             var integer i;
@@ -868,6 +870,14 @@ module LibItsGeoNetworking_Functions {
             };
         }
         
+        function @deterministic f_fillTimestamp(inout LongPosVector v_vector) 
+        return LongPosVector {
+            if (v_vector.timestamp == 0) {
+                v_vector.timestamp := f_computeGnTimestamp();
+            }
+            return v_vector;
+        }
+        
         /**
          * @desc    Get the position vector corresponding to a key
          * @param   p_positionKey   Reference key of the searched position vector
@@ -883,7 +893,7 @@ module LibItsGeoNetworking_Functions {
             
             for (i:=0; i<lengthof(vc_positionTable); i:=i+1) {
                 if (vc_positionTable[i].key == p_positionKey) {
-                    v_return := vc_positionTable[i].position;
+                    v_return := f_fillTimestamp(vc_positionTable[i].position);
                 }
             }
             
@@ -1582,7 +1592,7 @@ module LibItsGeoNetworking_Functions {
          * @desc Brings the IUT into an initial state.
          * @remark Component variable vc_hashedId8ToBeUsed shall be set with the IUT certificate to be used
          */
-        function f_initialState() runs on ItsBaseGeoNetworking {
+        function f_initialState(Scenario p_scenario := e_staticPosition) runs on ItsBaseGeoNetworking {
             
             if (PICS_GN_SECURITY) {
                 var Oct8 v_hashedId8ToBeUsed := f_setupIutCertificate(vc_hashedId8ToBeUsed);
@@ -1590,9 +1600,13 @@ module LibItsGeoNetworking_Functions {
                     v_hashedId8ToBeUsed := 'FFFFFFFFFFFFFFFF'O; // Reset to unknown value, the IUT will use its own certificates
                 }
                 f_utInitializeIut(m_secGnInitialize(v_hashedId8ToBeUsed));
-                return;
             } // else, default behavior
-            f_utInitializeIut(m_gnInitialize);
+            else {
+                f_utInitializeIut(m_gnInitialize);
+            }
+            
+            f_acLoadScenario(p_scenario);
+            f_acStartScenario();
         }
         
         /**
@@ -1676,7 +1690,7 @@ module LibItsGeoNetworking_Functions {
          * @desc The default postamble.
          */
         function f_poDefault() runs on ItsGeoNetworking {
-            //empty
+            f_acStopScenario();
         }
         
         /**
@@ -1781,6 +1795,68 @@ module LibItsGeoNetworking_Functions {
             
         }
         
+        /**
+         * @desc    Triggers event in the test system adaptation.
+         * @param   p_event The event to trigger
+         * @return  FncRetCode
+         */
+        function f_acTriggerGnssEvent(template (value) AcGnssPrimitive p_event) runs on ItsBaseGeoNetworking return FncRetCode {
+            var FncRetCode v_ret := e_success;
+            
+            acPort.send(p_event);
+            tc_ac.start;
+            alt {
+                [] acPort.receive(m_acGnssResponseSuccess) {
+                    tc_ac.stop;
+                }
+                [] acPort.receive {
+                    tc_ac.stop;
+                    log("*** f_acTriggerEvent: ERROR: Received unexpected message ***");
+                    f_selfOrClientSyncAndVerdict("error", e_error);
+                }
+                [] tc_ac.timeout {
+                    log("*** f_acTriggerEvent: ERROR: Timeout while waiting for adapter control event result ***");
+                    f_selfOrClientSyncAndVerdict("error", e_timeout);
+                }
+            }
+            
+            return v_ret;
+        }
+        
+        /**
+         * @desc    Loads the given scenario
+         * 
+         * @param   p_scenario   The scenario to load.
+         */
+        function f_acLoadScenario(Scenario p_scenario) runs on ItsBaseGeoNetworking {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true) {
+                f_acTriggerGnssEvent(m_loadScenario(p_scenario));
+            }
+        } // end f_acLoadScenario
+        
+        /**
+         * @desc    Starts a loaded scenario
+         */
+        function f_acStartScenario() runs on ItsBaseGeoNetworking {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true) {
+                f_acTriggerGnssEvent(m_startScenario);
+                vc_scenarioStarted := true;
+            }
+        } // end f_acStartScenario
+        
+        /**
+         * @desc    Stops a loaded scenario
+         */
+        function f_acStopScenario() runs on ItsBaseGeoNetworking {
+            
+            if (PICS_GNSS_SCENARIO_SUPPORT==true and vc_scenarioStarted==true) {
+                f_acTriggerGnssEvent(m_stopScenario);
+                vc_scenarioStarted := false;
+            }
+        } // end f_acStopScenario
+        
     } // end adapterControl
     
     group commonFunctions {
@@ -2339,7 +2415,7 @@ module LibItsGeoNetworking_Functions {
          * @param   p_orientation direction of the computed position (0 to 359; 0 means North)
          * @return  LongPosVector
          */
-        function f_computePositionUsingDistance(in LongPosVector p_iutLongPosVector, in integer p_distance, in integer p_orientation)
+        function f_computePositionUsingDistance(in LongPosVector p_iutLongPosVector, in float p_distance, in integer p_orientation)
         return LongPosVector {
             var LongPosVector v_result := p_iutLongPosVector;
             
@@ -2453,8 +2529,10 @@ module LibItsGeoNetworking_Functions {
                     var SignerInfo v_si;
                     
                     if (f_getMsgSignerInfo(v_recv, v_si) == true) { 
-                        p_cert :=  v_si.signerInfo.certificate;
-                        v_ret := true;
+                        if (ischosen(v_si.signerInfo.certificate)) {
+                            p_cert :=  v_si.signerInfo.certificate;
+                            v_ret := true;
+                        }
                     }
                 }
             } // End of 'alt' statement
@@ -2553,8 +2631,9 @@ module LibItsGeoNetworking_Functions {
          * @desc  Wait for GN message with security containing digest as a signer info
          * @return the digest of the certificate been used to sign received message
          */
-        function f_waitForDigest(out HashedId8 p_digest)
-        runs on ItsGeoNetworking return boolean {
+        function f_waitForDigest(
+                                 out HashedId8 p_digest
+        ) runs on ItsGeoNetworking return boolean {
             // Local variables
             var SecuredMessage v_recv;
             var boolean v_ret := false;
@@ -2572,16 +2651,45 @@ module LibItsGeoNetworking_Functions {
             return v_ret;
         } // End of function f_waitForDigest
         
+        /**
+         * @desc Send a CAM message with a certificate and wait the certificate chain request message
+         * @remark  This function is used only for testing against another ATS
+         * @param p_certificate The certificate identifier
+         * @param p_CamPayload  The CAM paylaod
+         * @return true on success, flase otherwise
+         */
+        function f_sendCertificateAndWaitForCertificateChainRequest(
+                                                                    in charstring p_certificate, 
+                                                                    in template(value) octetstring p_CamPayload
+        ) runs on ItsGeoNetworking return boolean {
+            // Local variables
+            var SecuredMessage v_recv;
+            
+            f_sendCertificate(p_certificate, p_CamPayload);
+            alt {
+                [] a_securedMessage (
+                    mdw_securedMessage(
+                        superset(
+                            mw_header_field_unrecognised_certificate
+                    )),
+                    v_recv
+                ) {
+                    // Nothing to do
+                    log("*** " & testcasename() & ": DEBUG: Receive certificate ***")
+                }
+            } // End of 'alt' statement
+            
+            return true;
+        } // End of function f_sendCertificateAndWaitForCertificateChainRequest
+        
     } // End of group waitingHelpers
         
     group CertRequests{
         
-        function f_sendCertificateRequest (
-                                           in template (value) HashedId8 p_digest,
-                                           in template (value) octetstring p_payload
-        )
-        runs on ItsGeoNetworking
-        {
+        function f_sendCertificateRequest(
+                                          in template (value) HashedId8 p_digest,
+                                          in template (value) octetstring p_payload
+        ) runs on ItsGeoNetworking {
             var GeoNetworkingReq v_gnReq;
             var GnNonSecuredPacket v_gnNonSecuredPacket;
             var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessage;
@@ -2619,6 +2727,51 @@ module LibItsGeoNetworking_Functions {
             
         } // End of function f_sendCertificateRequest
         
+        /**
+         * @desc Send a CAM message with a certificate
+         * @remark  This function is used only for testing against another ATS
+         * @param p_certificate The certificate identifier
+         * @param p_CamPayload  The CAM paylaod
+         * @return true on success, flase otherwise
+         * @see     f_sendCertificateAndWaitForCertificateChainRequest
+         */
+        function f_sendCertificate(
+                                   in charstring p_certificate,
+                                   in template (value) octetstring p_payload
+        ) runs on ItsGeoNetworking {
+            var GeoNetworkingReq v_gnReq;
+            var GnNonSecuredPacket v_gnNonSecuredPacket;
+            var template (value) ToBeSignedSecuredMessage v_toBeSignedSecuredMessage;
+            var template (value) SecuredMessage v_securedMessage;
+                
+            // Build signed SecuredMessage
+            v_gnNonSecuredPacket := valueof(m_geoNwShbPacket(
+                f_getPosition(c_compNodeC) // FIXME To be verified YANN
+            ));
+            // Add CAM payload
+            v_gnNonSecuredPacket.payload := valueof(f_adaptPayload_m(p_payload));
+            
+            f_buildGnSecuredCam(
+                v_securedMessage,
+                m_payload_signed(bit2oct(encvalue(v_gnNonSecuredPacket))),
+                e_certificate,
+                -,
+                p_certificate
+            );
+                
+            // Build secured Gn packet
+            v_gnReq := valueof(m_geoNwReq_linkLayerBroadcast(
+                m_geoNwSecPdu(
+                    v_gnNonSecuredPacket,
+                    v_securedMessage
+                ) // End of template m_geoNwSecPdu
+            )); // End of template m_geoNwReq_linkLayerBroadcast
+            
+            // Send Message
+            f_sendGeoNetMessage(v_gnReq);
+            
+        } // End of function f_sendCertificate
+        
     } // End of group CertRequests 
     
     group messageGetters {
diff --git a/ttcn/GeoNetworking/LibItsGeoNetworking_Templates.ttcn b/ttcn/GeoNetworking/LibItsGeoNetworking_Templates.ttcn
index c3053e4826f050633d5bc50295b37dde585f12d4..12786e6ea11f9a822880e6a76cf39ada31fa3e3e 100644
--- a/ttcn/GeoNetworking/LibItsGeoNetworking_Templates.ttcn
+++ b/ttcn/GeoNetworking/LibItsGeoNetworking_Templates.ttcn
@@ -2329,7 +2329,7 @@ module LibItsGeoNetworking_Templates {
 				        return bit2oct(encvalue(p_gnPayload.decodedPayload.btpPacket.payload));
             		}
             		
-            		return p_gnPayload.rawPayload;
+            		return valueof(p_gnPayload.rawPayload);
             	}
             }
             
diff --git a/ttcn/GeoNetworking/LibItsGeoNetworking_TestSystem.ttcn b/ttcn/GeoNetworking/LibItsGeoNetworking_TestSystem.ttcn
index 584816ca5181a9bf60ba4ec9e2ebd85097cf84fe..dc7c0ae8d5cbd99d011c1219ad9a22d5061d8bb4 100644
--- a/ttcn/GeoNetworking/LibItsGeoNetworking_TestSystem.ttcn
+++ b/ttcn/GeoNetworking/LibItsGeoNetworking_TestSystem.ttcn
@@ -35,9 +35,9 @@ module LibItsGeoNetworking_TestSystem {
          */
         type port AdapterControlPort message {
             out
-                AcGnPrimitive, AcGn6Primitive;
+                AcGnPrimitive, AcGn6Primitive, AcGnssPrimitive;
             in
-                AcGnResponse, AcGn6Response;
+                AcGnResponse, AcGn6Response, AcGnssResponse, AcGnssDistanceCovered;
         } // end AdapterControlPort
         
         /**
diff --git a/ttcn/Security/LibItsSecurity_Functions.ttcn3 b/ttcn/Security/LibItsSecurity_Functions.ttcn3
index 832b7db80cac386229674a5b26e3d8d39583a459..5e60e2156d63f14b3d239e3606ec855ab97b665e 100644
--- a/ttcn/Security/LibItsSecurity_Functions.ttcn3
+++ b/ttcn/Security/LibItsSecurity_Functions.ttcn3
@@ -116,6 +116,22 @@ module LibItsSecurity_Functions {
             return substr(v_hash, lengthof(v_hash) - 8, 8);
         } // End of function f_calculateDigestFromCertificate
         
+        function f_duration2time(
+                                 in Duration p_duration
+        ) return Time32 {
+            if (p_duration.unit == e_seconds) {
+                return p_duration.duration_;
+            } else if (p_duration.unit == e_minutes) { 
+                return p_duration.duration_ * 60;
+            } else if (p_duration.unit == e_hours) { 
+                return p_duration.duration_ * 3600;
+            } else if (p_duration.unit == e_hoursBlock) {
+                return p_duration.duration_ * 216000;
+            }
+            
+            return p_duration.duration_ * 31556925;
+        } // End of function f_duration2time
+        
         group hostSignatureHelpers {
             
             /**
@@ -288,7 +304,7 @@ module LibItsSecurity_Functions {
             function f_buildGnSecuredMessage_Bo(
                                                 out template (value) SecuredMessage p_securedMessage,
                                                 in template (value) charstring p_certificateName,
-                                                in integer p_protocolVersion := c_protocol_version,
+                                                in UInt8 p_protocolVersion := c_protocol_version,
                                                 in integer p_trailerStatus := 0,
                                                 in template (value) SecPayload p_payloadField,
                                                 in template (value) HeaderFields p_mandatoryHeaders,
@@ -355,6 +371,7 @@ module LibItsSecurity_Functions {
                 
                 // Prepare payload to be signed
                 v_toBeSignedPayload := valueof(p_payloadField);
+//                log("p_trailerStatus=", p_trailerStatus);
                 if (p_trailerStatus == 0) {
                     v_trailerSize := 0;
                 } else if (p_trailerStatus == 1) {
@@ -371,8 +388,10 @@ module LibItsSecurity_Functions {
                     p_protocolVersion,
                     v_trailerSize
                 );
+//                log("m_toBeSignedSecuredMessage_wrong_protocol=", v_toBeSignedSecuredMessage);
                 
                 v_secPayload := bit2oct(encvalue(v_toBeSignedSecuredMessage));
+//                log("v_secPayload=", v_secPayload);
                 
                 // Signed payload
                 if (ispresent(p_certificateName) and (valueof(p_certificateName) != cc_taCert_A)) {
@@ -388,16 +407,20 @@ module LibItsSecurity_Functions {
                     v_secPayload, 
                     v_privateKey 
                 );
+//                log("v_signature=", v_signature);
                 
+//                log("p_trailerStatus=", p_trailerStatus);
                 if (p_trailerStatus == 0) { // No signature
-                    p_securedMessage := m_securedMessage(
+                    p_securedMessage := m_securedMessage_wrong_protocol(
+                        p_protocolVersion,
                         v_toBeSignedSecuredMessage.header_fields,
                         p_payloadField,
                         { }
                     );
                     v_trailerSize := 0;
                 } else if (p_trailerStatus == 2) { // Duplicate signature
-                    p_securedMessage := m_securedMessage(
+                    p_securedMessage := m_securedMessage_wrong_protocol(
+                        p_protocolVersion,
                         v_toBeSignedSecuredMessage.header_fields,
                         p_payloadField,
                         {
@@ -423,8 +446,22 @@ module LibItsSecurity_Functions {
                             ) 
                         }
                     );
+                } else if (p_trailerStatus == 3) { // Signature with reserved algorthm
+                    p_securedMessage := m_securedMessage_wrong_protocol(
+                        p_protocolVersion,
+                        v_toBeSignedSecuredMessage.header_fields,
+                        p_payloadField,
+                        {
+                            m_trailer_field_signature(
+                                m_unknownSignature(
+                                    v_signature
+                                )
+                            )
+                        }
+                    );
                 } else { // Invalid signature
-                    p_securedMessage := m_securedMessage(
+                    p_securedMessage := m_securedMessage_wrong_protocol(
+                        p_protocolVersion,
                         v_toBeSignedSecuredMessage.header_fields,
                         p_payloadField,
                         {
@@ -440,7 +477,7 @@ module LibItsSecurity_Functions {
                             )
                         }
                     );
-                    p_securedMessage.trailer_fields[0].trailerField.signature_.signature_.ecdsa_signature.s := not4b(p_securedMessage.trailer_fields[0].trailerField.signature_.signature_.ecdsa_signature.s);
+                    p_securedMessage.trailer_fields[0].trailerField.signature_.signature_.ecdsa_signature.s := not4b(valueof(p_securedMessage.trailer_fields[0].trailerField.signature_.signature_.ecdsa_signature.s));
                 } 
                 
                 return true;
@@ -448,13 +485,13 @@ module LibItsSecurity_Functions {
             
             /**
             * @desc This function build and sign the SecureMessage part covered by the signature process
-            * @param p_securedMessage       The signed  SecureMessage part
-            * @param p_payloadField         Payloads to be included in the message
-            * @param p_signerInfoType       Add digest or AT certificate or certificate chain
-            * @param p_threeDLocation       The 3D location
-            * @param p_headerFields         HeaderFields to be inserted in the message
-            * @param p_certificateName      The certificate identifier to be used. Default: TA_CERT_A
-            * @param p_addMissingHeaders    Whether to add mandatory headers not present in p_headerFields
+            * @param p_securedMessage               The signed  SecureMessage part
+            * @param p_payloadField                 Payloads to be included in the message
+            * @param p_signerInfoType               Add digest or AT certificate or certificate chain
+            * @param p_threeDLocation               The 3D location
+            * @param p_headerFields                 HeaderFields to be inserted in the message
+            * @param p_certificateName              The certificate identifier to be used. Default: TA_CERT_A
+            * @param p_addMissingHeaders            Whether to add mandatory headers not present in p_headerFields
             * @return true on success, false otherwise
             * 
             * @see Draft ETSI TS 103 097 V1.1.14 Clause 7.1  Security profile for CAMs
@@ -518,31 +555,35 @@ module LibItsSecurity_Functions {
             
             /**
             * @desc This function build and sign the SecureMessage part covered by the signature process including wrong elements of protocols. It is used for BO test cases
-            * @param p_securedMessage       The signed  SecureMessage part
-            * @param  p_protocolVersion     The protocol version to be set. Default: 2
-            * @param  p_trailerStatus       The Traile behaviour:
-            *                               <li>0 for no trailer</li>
-            *                               <li>1 for invalid trailer</li>
-            *                               <li>2 for duplicated trailer</li>
-            * @param p_payloadField         Payloads to be included in the message
-            * @param p_signerInfoType       Add digest or AT certificate or certificate chain
-            * @param p_threeDLocation       The 3D location
-            * @param p_headerFields         HeaderFields to be inserted in the message
-            * @param p_certificateName      The certificate identifier to be used. Default: TA_CERT_A
-            * @param p_addMissingHeaders    Whether to add mandatory headers not present in p_headerFields
+            * @param p_securedMessage               The signed  SecureMessage part
+            * @param  p_protocolVersion             The protocol version to be set. Default: 2
+            * @param  p_trailerStatus               The Traile behaviour:
+            *                                       <li>0 for no trailer</li>
+            *                                       <li>1 for invalid trailer</li>
+            *                                       <li>2 for duplicated trailer</li>
+            * @param p_payloadField                 Payloads to be included in the message
+            * @param p_signerInfoType               Add digest or AT certificate or certificate chain
+            * @param p_threeDLocation               The 3D location
+            * @param p_headerFields                 HeaderFields to be inserted in the message
+            * @param p_certificateName              The certificate identifier to be used. Default: TA_CERT_A
+            * @param p_addMissingHeaders            Whether to add mandatory headers not present in p_headerFields
+            * @param p_alterATCertificateSignature  Set to true to alter the AT certificate signature
+            * @param p_alterAACertificateSignature  Set to true to alter the AA certificate signature
             * @return true on success, false otherwise
             * 
             * @see Draft ETSI TS 103 097 V1.1.14 Clause 7.1  Security profile for CAMs
             */
             function f_buildGnSecuredCam_Bo(
                                             out template (value) SecuredMessage p_securedMessage,
-                                            in integer p_protocolVersion := c_protocol_version,
+                                            in UInt8 p_protocolVersion := c_protocol_version,
                                             in integer p_trailerStatus := 0,
                                             in template (value) SecPayload p_payloadField,
                                             in template (omit) SignerInfoType p_signerInfoType := e_certificate_digest_with_sha256,
                                             in template (omit) HeaderFields p_headerFields := omit,
                                             in template (omit) charstring p_certificateName := omit,
-                                            in boolean p_addMissingHeaders := true
+                                            in boolean p_addMissingHeaders := true,
+                                            in boolean p_alterATCertificateSignature := false,
+                                            in boolean p_alterAACertificateSignature := false
             ) runs on ItsSecurityBaseComponent return boolean {
                 
                 // Local variables
@@ -555,6 +596,14 @@ module LibItsSecurity_Functions {
                     return false;
                 }
                 
+                if (p_alterATCertificateSignature == true) {
+                    v_atCertificate.signature_.signature_.ecdsa_signature.s := not4b(v_atCertificate.signature_.signature_.ecdsa_signature.s);
+                }
+                
+                if (p_alterAACertificateSignature == true) {
+                    v_aaCertificate.signature_.signature_.ecdsa_signature.s := not4b(v_aaCertificate.signature_.signature_.ecdsa_signature.s);
+                }
+                
                 if (p_addMissingHeaders == true) {
                     // Prepare mandatory headers
                     if (valueof(p_signerInfoType) == e_certificate) { // Add the AT certificate
@@ -683,7 +732,7 @@ module LibItsSecurity_Functions {
              */
             function f_buildGnSecuredDenm_Bo(
                                              out template (value) SecuredMessage p_securedMessage,
-                                             in integer p_protocolVersion := c_protocol_version,
+                                             in UInt8 p_protocolVersion := c_protocol_version,
                                              in integer p_trailerStatus := 0,
                                              in template (value) SecPayload p_payloadField,
                                              in template (omit) SignerInfoType p_signerInfoType := e_certificate_digest_with_sha256,
@@ -814,6 +863,85 @@ module LibItsSecurity_Functions {
                 return f_buildGnSecuredMessage(p_securedMessage, p_certificateName, p_payloadField, v_mandatoryHeaders, p_headerFields);
             } // End of function f_buildGnSecuredOtherMessage
             
+            /**
+             * @desc This function build and sign the SecureMessage part covered by the signature process including wrong elements of protocols. It is used for BO test cases
+             * @param p_securedMessage       The signed  SecureMessage part
+             * @param  p_protocolVersion     The protocol version to be set. Default: 2
+             * @param  p_trailerStatus       The Traile behaviour:
+             *                               <li>0 for no trailer</li>
+             *                               <li>1 for invalid trailer</li>
+             *                               <li>2 for duplicated trailer</li>
+             * @param p_payloadField        Payloads to be included in the message
+             * @param p_signerInfoType       Add digest or AT certificate or certificate chain
+             * @param p_threeDLocation       The 3D location
+             * @param p_headerFields         HeaderFields to be inserted in the message
+             * @param p_certificateName      The certificate identifier to be used. Default: TA_CERT_A
+             * @param p_addMissingHeaders    Whether to add mandatory headers not present in p_headerFields
+             * @return true on success, false otherwise
+             */
+            function f_buildGnSecuredOtherMessage_Bo(
+                                                     out template (value) SecuredMessage p_securedMessage,
+                                                     in UInt8 p_protocolVersion := c_protocol_version,
+                                                     in integer p_trailerStatus := 0,
+                                                     in template (value) SecPayload p_payloadField,
+                                                     in template (omit) SignerInfoType p_signerInfoType := e_certificate_digest_with_sha256,
+                                                     in ThreeDLocation p_threeDLocation,
+                                                     in template (omit) HeaderFields p_headerFields := omit,
+                                                     in template (omit) charstring p_certificateName := omit,
+                                                     in boolean p_addMissingHeaders := true
+            ) runs on ItsSecurityBaseComponent return boolean {
+                
+                // Local variables
+                var Certificate v_aaCertificate, v_atCertificate;
+                var HeaderFields v_mandatoryHeaders := {};
+                var HeaderField v_signerInfo;
+                
+                // Load certificates if required
+                if (f_prepareCertificates(p_certificateName, v_aaCertificate, v_atCertificate) == false) {
+                    return false;
+                }
+                
+                // Add additional headers if required
+                if (p_addMissingHeaders == true) {
+                    // Prepare mandatory headers
+                    if (valueof(p_signerInfoType) == e_certificate) { // Add the AT certificate
+                        v_signerInfo := valueof(
+                            m_header_field_signer_info(
+                                m_signerInfo_certificate(
+                                    v_atCertificate
+                        )));
+                    }
+                    if (valueof(p_signerInfoType) == e_certificate_chain) { // Add the AT certificate + AA Certificate
+                        v_signerInfo := valueof(
+                            m_header_field_signer_info(
+                                m_signerInfo_certificates(
+                                    {
+                                        v_aaCertificate,
+                                        v_atCertificate
+                                    }
+                                )
+                        ));
+                    }
+                    if (valueof(p_signerInfoType) == e_certificate_digest_with_sha256) { // Add the AT certificate digest
+                        v_signerInfo := valueof(
+                            m_header_field_signer_info(
+                                m_signerInfo_digest(
+                                    v_atCertificate.signer_info.signerInfo.digest
+                        )));
+                    }
+                    v_mandatoryHeaders := {
+                        v_signerInfo,
+                        valueof(m_header_field_generation_time(1000 * f_getCurrentTime())), // In us
+                        valueof(m_header_field_generation_location(p_threeDLocation))
+                    }
+                }
+                
+                // FIXME To be done 
+                
+                // Build the secured message and return it
+                return f_buildGnSecuredMessage(p_securedMessage, p_certificateName, p_payloadField, v_mandatoryHeaders, p_headerFields);
+            } // End of function f_buildGnSecuredOtherMessage_Bo
+            
         } // End of group hostSignatureHelpers
         
         group deviceSignatureHelpers {
@@ -944,11 +1072,6 @@ module LibItsSecurity_Functions {
                 v_secPayload := bit2oct(encvalue(v_toBeSignedSecuredMessage));
                 log("f_verifyGnSecuredMessageSignatureWithPublicKey: v_secPayload=", v_secPayload);
                 
-                // FIXME BUG Framework already compute the hash
-//                // Calculate the hash of the SecuredMessage payload to be signed
-//                v_hash := fx_hashWithSha256(v_secPayload);
-//                log("f_verifyGnSecuredMessageSignatureWithPublicKey: v_hash=", v_hash);
-//                
                 // Verify payload
                 for (v_counter := 0; v_counter < lengthof(p_securedMessage.trailer_fields); v_counter := v_counter + 1) {
                     var SecuredMessage v_securedMessage := valueof(p_securedMessage);
@@ -962,7 +1085,7 @@ module LibItsSecurity_Functions {
                         v_securedMessage.trailer_fields[v_counter].trailerField.signature_.signature_.ecdsa_signature.s;
                         log("f_verifyGnSecuredMessageSignatureWithPublicKey: v_signedData=", v_signedData);
                         v_result := f_verifyWithEcdsaNistp256WithSha256(
-                            v_secPayload, // FIXME BUG Framework already compute the hash v_hash,
+                            v_secPayload, 
                             v_signedData,
                             valueof(p_publicKey.public_key.eccPoint.x),
                             valueof(p_publicKey.public_key.eccPoint.y.y)
@@ -1181,8 +1304,8 @@ module LibItsSecurity_Functions {
             * @return  true on success, false otherwise
             */
             function f_readEncryptingKey(
-                                       in charstring p_keysId,
-                                       out Oct32 p_encryptPrivateKey
+                                         in charstring p_keysId,
+                                         out Oct32 p_encryptPrivateKey
             ) runs on ItsSecurityBaseComponent return boolean {
                 return fx_readEncryptingKey(p_keysId, p_encryptPrivateKey);
             } // End of function f_readEncryptingKey
@@ -1235,6 +1358,60 @@ module LibItsSecurity_Functions {
             
         }// End of group certificateGetters
         
+        group certificatesCaching {
+            
+            function f_createCertificatesCaching(
+                                                 in CertificateChain p_certificates, 
+                                                 out CertificatesCaching p_certificatesCaching
+            ) return boolean {
+                p_certificatesCaching := { };
+                for (var integer v_counter := 0; v_counter < lengthof(p_certificates); v_counter := v_counter + 1) {
+                    var CertificatesCachingItem v_item;
+                    v_item.certificate := p_certificates[v_counter];
+                    v_item.hashedId8 := f_calculateDigestFromCertificate(v_item.certificate);
+                    p_certificatesCaching[v_counter] := v_item;
+                } // End of 'for' statement
+                
+                return true;
+            }
+            
+            function f_getCertificateFromCaching(
+                                                 in CertificatesCaching p_certificatesCaching, 
+                                                 in HashedId8 p_hashedId8, 
+                                                 out Certificate p_certificate
+            ) return boolean {
+                for (var integer v_counter := 0; v_counter < lengthof(p_certificatesCaching); v_counter := v_counter + 1) { 
+                    if (match(p_certificatesCaching[v_counter].hashedId8, p_hashedId8) == true) {
+                        p_certificate := p_certificatesCaching[v_counter].certificate;
+                        return true;
+                    }
+                } // End of 'for' statement
+                
+                return false;
+            }
+            
+            function f_getCertificatesCachingItem(
+                                                  in CertificatesCaching p_certificatesCaching, 
+                                                  in UInt8 p_index, 
+                                                  out Certificate p_certificate
+            ) return boolean {
+                if (lengthof(p_certificatesCaching) < p_index) {
+                    p_certificate := p_certificatesCaching[p_index].certificate;
+                    return true;
+                }
+                
+                return false;
+            }
+            
+            function f_getCertificatesCachingItemSize(
+                                                      in CertificatesCaching p_certificatesCaching
+            ) return UInt8 {
+                return lengthof(p_certificatesCaching);
+            }
+            
+        }// End of group certificatesCaching
+        
+        
     } // End of group helpersFunctions
 
     group externalFunctions {
@@ -1346,7 +1523,7 @@ module LibItsSecurity_Functions {
             external function fx_isValidPolygonalRegion(in PolygonalRegion p_region) return boolean;
             
             /**
-            * @desc Check if a polygonal regin is inside another one
+            * @desc Check if a polygonal region is inside another one
             * @param p_parent  The main polygonal region
             * @param p_region  The polygonal region to be included
             * @return true on success, false otherwise
@@ -1390,6 +1567,43 @@ module LibItsSecurity_Functions {
             */
             external function fx_isLocationInsideIdentifiedRegion(in IdentifiedRegion p_region, in ThreeDLocation p_location) return boolean;
             
+            /**
+            * @desc Check if the location is inside an undefined region
+            * @param p_region      The identified region to consider
+            * @param p_location    The device location
+            * @return true on success, false otherwise
+            * @verdict Unchanged
+            */
+//          TODO To be implemented in TA
+            external function fx_isLocationInsideOtherRegion(in octetstring p_region, in ThreeDLocation p_location) return boolean; 
+            
+            /**
+             * @desc    Check that p_circular_region_1 circular region is included into p_circular_region_2 circular region
+             * @param   p_circular_region_1    Circular region 1
+             * @param   p_circular_region_2    Circular region 2
+             *
+             * @return  true on success, false otherwise
+             */
+            external function fx_areCirclesInside(in CircularRegion p_circular_region_1, in CircularRegion p_circular_region_2) return boolean;
+            
+            /**
+             * @desc    Check that p_rectanglar_region_1 rectangular region is included into p_rectanglar_region_2 rectangular region
+             * @param   p_rectanglar_region_1    Rectangular region 1
+             * @param   p_rectanglar_region_2    Rectangular region 2
+             *
+             * @return  true on success, false otherwise
+             */
+            external function fx_areRectanglesInside(in RectangularRegions p_rectanglar_region_1, in RectangularRegions p_rectanglar_region_2) return boolean;
+            
+            /**
+             * @desc    Check that p_polygonal_region_1 polygonal region is included into p_polygonal_region_2 polygonal region
+             * @param   p_polygonal_region_1    Polygonal region 1
+             * @param   p_polygonal_region_2    Polygonal region 2
+             *
+             * @return  true on success, false otherwise
+             */
+            external function fx_arePolygonsInside(in PolygonalRegion p_polygonal_region_1, in PolygonalRegion p_polygonal_region_2) return boolean;
+            
             /**
             * @desc Convert a spacial coordinate from DMS to Dms
             * @param p_degrees The degrees (D)
@@ -1407,11 +1621,129 @@ module LibItsSecurity_Functions {
     
     group geometryFunctions {
         
+        function f_checkRegionValidityRestiction(
+                                                 in Certificate p_cert, 
+                                                 in Certificate p_cert_issuer
+        ) return boolean {
+            var ValidityRestriction v_cert_region, v_cert_issuer_region;
+            var boolean v_cert_issuer_region_result;
+            
+            v_cert_issuer_region_result := f_getCertificateValidityRestriction(p_cert_issuer, e_region, v_cert_issuer_region);
+            if (f_getCertificateValidityRestriction(p_cert, e_region, v_cert_region) == false) {
+                if (v_cert_issuer_region_result == true) {
+                    if (not match(v_cert_issuer_region.validity.region.region_type, e_none)) {
+                        return false;
+                    }
+                }
+            } else if (
+                        (v_cert_issuer_region_result == true) and 
+                        (not match(v_cert_issuer_region.validity.region.region_type, e_none))
+            ) {
+                if (match(v_cert_region.validity.region.region_type, e_circle)) {
+                    if (match(v_cert_issuer_region.validity.region.region_type, e_circle)) {
+                        // Check v_cert_region 'circle' is inside v_cert_issuer_region 'circle'
+                        if (f_areCirclesInside(v_cert_region.validity.region.region.circular_region, v_cert_issuer_region.validity.region.region.circular_region) == false) {
+                            log("*** " & testcasename() & ": FAIL: Issuer and issuing certificates circle area does not match ***");
+                            return false;
+                        }
+                    }
+                } else if (match(v_cert_region.validity.region.region_type, e_rectangle)) {
+                    if (match(v_cert_issuer_region.validity.region.region_type, e_rectangle)) {
+                        // Check v_cert_region 'rectangle' is inside v_cert_issuer_region 'rectangle'
+                        if (f_areRectanglesInside(v_cert_region.validity.region.region.rectangular_region, v_cert_issuer_region.validity.region.region.rectangular_region) == false) {
+                            log("*** " & testcasename() & ": FAIL: Issuer and issuing certificates rectangle area does not match ***");
+                            return false;
+                        }
+                    }
+                } else if (match(v_cert_region.validity.region.region_type, e_polygon)) {
+                    if (match(v_cert_issuer_region.validity.region.region_type, e_polygon)) {
+                        // Check v_cert_region 'polygon' is inside v_cert_issuer_region 'polygon'
+                        if (f_arePolygonsInside(v_cert_region.validity.region.region.polygonal_region, v_cert_issuer_region.validity.region.region.polygonal_region) == false) {
+                            log("*** " & testcasename() & ": FAIL: Issuer and issuing certificates polygon area does not match ***");
+                            return false;
+                        }
+                    }
+                } else if (match(v_cert_region.validity.region.region_type,e_id)) {
+                    // Check id_region
+                    if (not match (v_cert_region.validity.region, mw_geographicRegion_identified(mw_identifiedRegion_iso3166_any))) { 
+                        log("*** " & testcasename() & ": FAIL: Identified region is not conformed to ISO 3166-1 ***");
+                        return false;
+                    }
+                    if (not match (v_cert_region.validity.region, mw_geographicRegion_identified(mw_identifiedRegion_un_stats_any))) {
+                        log("*** " & testcasename() & ": FAIL: Identified region is not conformed to United Nations Statistics Division ***");
+                        return false;
+                    }
+                    // Check region_dictionary
+                    if (not match (v_cert_region.validity.region.region.id_region.region_dictionary, v_cert_issuer_region.validity.region.region.id_region.region_dictionary)) {
+                        log("*** " & testcasename() & ": FAIL: Issuer and issuing 'region_dictionary' field does not match ***");
+                        return false;
+                    }
+                    // Check region_identifier
+                    if (not match (v_cert_region.validity.region.region.id_region.region_identifier, v_cert_issuer_region.validity.region.region.id_region.region_identifier)) {
+                        log("*** " & testcasename() & ": FAIL: Issuer and issuing 'region_identifier' field does not match ***");
+                        return false;
+                    }
+                    // Check local_region
+                    if (
+                        (not match (v_cert_issuer_region.validity.region.region.id_region.local_region, v_cert_region.validity.region.region.id_region.local_region)) or 
+                        (not match (v_cert_issuer_region.validity.region.region.id_region.local_region, 0))
+                    ) {
+                        return false;
+                        log("*** " & testcasename() & ": FAIL: Issuer and issuing 'local_region' field does not match ***");
+                    }
+                }
+            }
+            
+            return true;
+        } // End of function f_checkRegionValidityRestiction
+        
         /**
-        * @desc    Check that given location is valid
-        * @param   p_location    location to be checked
-        * @return  true on success, false otherwise
-        */
+         * @desc    Check that p_circular_region_1 circular region is included into p_circular_region_2 circular region
+         * @param   p_circular_region_1    Circular region 1
+         * @param   p_circular_region_2    Circular region 2
+         *
+         * @return  true on success, false otherwise
+         */
+        function f_areCirclesInside(
+                                    in CircularRegion p_circular_region_1, 
+                                    in CircularRegion p_circular_region_2
+        ) return boolean {
+            return fx_areCirclesInside(p_circular_region_1, p_circular_region_2);
+        }
+        
+        /**
+         * @desc    Check that p_rectanglar_region_1 rectangular region is included into p_rectanglar_region_2 rectangular region
+         * @param   p_rectanglar_region_1    Rectangular region 1
+         * @param   p_rectanglar_region_2    Rectangular region 2
+         *
+         * @return  true on success, false otherwise
+         */
+        function f_areRectanglesInside(
+                                       in RectangularRegions p_rectanglar_region_1, 
+                                       in RectangularRegions p_rectanglar_region_2
+        ) return boolean {
+            return fx_areRectanglesInside(p_rectanglar_region_1, p_rectanglar_region_2);
+        }
+        
+        /**
+         * @desc    Check that p_polygonal_region_1 polygonal region is included into p_polygonal_region_2 polygonal region
+         * @param   p_polygonal_region_1    Polygonal region 1
+         * @param   p_polygonal_region_2    Polygonal region 2
+         *
+         * @return  true on success, false otherwise
+         */
+        function f_arePolygonsInside(
+                                     in PolygonalRegion p_polygonal_region_1, 
+                                     in PolygonalRegion p_polygonal_region_2
+        ) return boolean {
+            return fx_arePolygonsInside(p_polygonal_region_1, p_polygonal_region_2);
+        }
+        
+        /**
+         * @desc    Check that given location is valid
+         * @param   p_location    location to be checked
+         * @return  true on success, false otherwise
+         */
         function f_isValidTwoDLocation(
                                        in template (value) TwoDLocation p_location
         ) return boolean {
@@ -1421,14 +1753,13 @@ module LibItsSecurity_Functions {
         } // End of function f_isValidTwoDLocation
 
         /**
-        * @desc    Check that two given rectanlular regions are intersected
-        *          Note: Regions must be normalized(northwest.latitude >= southeast.latitude)
-        *          TODO: Add case when
-        * @param   p_r1    Region 1
-        * @param   p_r2    Region 2
-        *
-        * @return  true on success, false otherwise
-        */
+         * @desc    Check that two given rectanlular regions are intersected
+         *          Note: Regions must be normalized(northwest.latitude >= southeast.latitude)
+         * @param   p_r1    Region 1
+         * @param   p_r2    Region 2
+         *
+         * @return  true on success, false otherwise
+         */
         function f_isRectangularRegionsIntersected(
                                                    in template (value) RectangularRegion p_r1,
                                                    in template (value) RectangularRegion p_r2
@@ -1442,35 +1773,95 @@ module LibItsSecurity_Functions {
         } // End of function f_isRectangularRegionsIntersected
         
         function f_isContinuousRectangularRegions(
-                                                  in template (value) RectangularRegions regions
+                                                  in template (value) RectangularRegions p_region
         ) return boolean {
-            // TODO: call external function
+            var integer v_i, v_j;
+            var boolean v_found;
+            
+            for (v_i := 0; v_i < lengthof(p_region); v_i := v_i + 1) {
+                var PolygonalRegion v_region_base;
+                f_convertRectangularRegionIntoPolygonalRegion(p_region[v_i], v_region_base);
+                v_found := false;
+                for (v_j := 0; v_j < lengthof(p_region); v_j := v_j + 1) {
+                    if (v_j != v_i) {
+                        var PolygonalRegion v_region;
+                        f_convertRectangularRegionIntoPolygonalRegion(p_region[v_j], v_region);
+                        if (f_isPolygonalRegionInside(v_region, v_region_base) == true) {
+                            v_found := true;
+                        }
+                    }
+                } // End of 'for' statement
+                if (v_found == false) {
+                    return false;
+                }
+            } // End of 'for' statement
+            
             return true;
-        } // End of function f_isRectangularRegionsIntersected
+        } // End of function f_isContinuousRectangularRegions
         
         /**
-        * @desc Check if a polygonal regin is inside another one
-        * @param p_parent  The main polygonal region
-        * @param p_region  The polygonal region to be included
-        * @return true on success, false otherwise
-        * @verdict Unchanged
-        */
+         * @desc Check if a polygonal region is inside another one
+         * @param p_parent  The main polygonal region
+         * @param p_region  The polygonal region to be included
+         * @return true on success, false otherwise
+         * @verdict Unchanged
+         */
         function f_isRectangularRegionsInside(
                                               in template (value) RectangularRegions p_parent,
                                               in template (value) RectangularRegions p_region
         ) return boolean {
-            // TODO: convert rectangular regions to polygons and check polygons
-            return true;
+            var integer v_i, v_j;
+            
+            for (v_i := 0; v_i < lengthof(p_parent); v_i := v_i + 1) {
+                var PolygonalRegion v_region_parent, v_region;
+                f_convertRectangularRegionIntoPolygonalRegion(p_parent[v_i], v_region_parent);
+                for (v_j := 0; v_j < lengthof(p_parent); v_j := v_j + 1) {
+                    f_convertRectangularRegionIntoPolygonalRegion(p_region[v_j], v_region);
+                    if (f_isPolygonalRegionInside(v_region, v_region_parent) == true) {
+                        return true;
+                    }
+                } // End of 'for' statement
+            } // End of 'for' statement
+            
+            return false;
         } // End of function f_isRectangularRegionsInside
         
         /**
-        * @desc    Check that given polygon doesn't have neither self-intersections nor holes.
-        * @param   p_region   Polygonal Region
-        * @return  true on success, false otherwise
-        * @verdict Unchanged
-        */
+         * @desc Convert a rectangular region into a polygonal region
+         * @param p_region The rectangular regions to convert
+         * @return 
+         * @verdict 
+         */
+        function f_convertRectangularRegionIntoPolygonalRegion(
+                                                               in template (value) RectangularRegion p_rectangular_region,
+                                                               out PolygonalRegion p_region
+        ) return boolean {
+            var integer v_counter := 0;
+            
+            // Convert rectangular regions to polygons and check polygons
+            p_region[0] := valueof(p_rectangular_region.northwest);
+            p_region[1] := { 
+                valueof(p_rectangular_region.northwest.latitude) + valueof(p_rectangular_region.southeast.latitude),
+                valueof(p_rectangular_region.northwest.longitude)
+            };
+            p_region[2] := valueof(p_rectangular_region.southeast);
+            p_region[3] := { 
+                valueof(p_rectangular_region.northwest.latitude),
+                valueof(p_rectangular_region.northwest.longitude) + valueof(p_rectangular_region.southeast.longitude) 
+            };
+            log("f_convertRectangularRegionIntoPolygonalRegion: DEBUG: Northwest location is invalid in rect ", p_region);
+            
+            return true;
+        } // End of function 
+        
+        /**
+         * @desc    Check that given polygon doesn't have neither self-intersections nor holes.
+         * @param   p_region   Polygonal Region
+         * @return  true on success, false otherwise
+         * @verdict Unchanged
+         */
         function f_isValidPolygonalRegion(
-            in template (value) PolygonalRegion p_region
+                                          in template (value) PolygonalRegion p_region
         ) return boolean {
             // Sanity check
             if (not isbound(p_region) or (lengthof(p_region) == 0)) {
@@ -1481,12 +1872,12 @@ module LibItsSecurity_Functions {
         } // End of function f_isValidPolygonalRegion
         
         /**
-        * @desc Check if a polygonal regin is inside another one
-        * @param p_parent  The main polygonal region
-        * @param p_region  The polygonal region to be included
-        * @return true on success, false otherwise
-        * @verdict Unchanged
-        */
+         * @desc Check if a polygonal region is inside another one
+         * @param p_parent  The main polygonal region
+         * @param p_region  The polygonal region to be included
+         * @return true on success, false otherwise
+         * @verdict Unchanged
+         */
         function f_isPolygonalRegionInside(
                                            in template (value) PolygonalRegion p_parent,
                                            in template (value) PolygonalRegion p_region
@@ -1637,8 +2028,12 @@ module LibItsSecurity_Functions {
                                                in template (value) octetstring p_region,
                                                in template (value) ThreeDLocation p_location
         ) return boolean {
-            // FIXME To be removed
-            return false;
+            // Sanity check
+            if (valueof(p_region) == ''O) {
+                return false;
+            }
+            
+            return fx_isLocationInsideOtherRegion(valueof(p_region), valueof(p_location)); 
         } // End of function f_isLocationInsideOtherRegion
         
         /**
@@ -1696,3 +2091,4 @@ module LibItsSecurity_Functions {
     } // End of group geometryFunctions
     
 } // End of module LibItsSecurity_Functions
+
diff --git a/ttcn/Security/LibItsSecurity_Pics.ttcn3 b/ttcn/Security/LibItsSecurity_Pics.ttcn3
index 39dcb1fe607384e49be18ca55ecb3978f74a4e63..01dff2f60f498f091d90d83edb374bb7715e448d 100644
--- a/ttcn/Security/LibItsSecurity_Pics.ttcn3
+++ b/ttcn/Security/LibItsSecurity_Pics.ttcn3
@@ -47,4 +47,9 @@ module LibItsSecurity_Pics {
      */
     modulepar boolean PICS_ITS_AID_OTHER_PROFILE := true;
     
+    /**
+     * Does the IUT support C2C profile?
+     */
+    modulepar boolean PICS_ITS_C2C_MODE := false; // FIXME To be merge with C2C ATS, see Dirk T.
+    
 } // End of module LibItsSecurity_Pics
\ No newline at end of file
diff --git a/ttcn/Security/LibItsSecurity_Pixits.ttcn3 b/ttcn/Security/LibItsSecurity_Pixits.ttcn3
index 4aa0db4fbabbc6cd15d8f59f8789aa1ec49ea35f..ad3f571424c1db514c7faaa83698fde99f1719ad 100644
--- a/ttcn/Security/LibItsSecurity_Pixits.ttcn3
+++ b/ttcn/Security/LibItsSecurity_Pixits.ttcn3
@@ -9,6 +9,7 @@ module LibItsSecurity_Pixits {
     
     // LibCommon
     import from LibCommon_BasicTypesAndValues all;
+    import from LibCommon_DataStrings all;
     
     // LibItsSecurity
     import from LibItsSecurity_TypesAndValues all;
@@ -19,7 +20,7 @@ module LibItsSecurity_Pixits {
     modulepar charstring PX_CERTIFICATE_POOL_PATH := "data/certificates";
     
     /**
-     * @descConfiguration sub-directory to access certificate stored in files
+     * @desc Configuration sub-directory to access certificate stored in files
      */
     modulepar charstring PX_IUT_SEC_CONFIG_NAME := "cfg01";
     
@@ -39,4 +40,24 @@ module LibItsSecurity_Pixits {
      */
     modulepar UInt8 PX_WRONG_PROTOCOL_VERSION := 1;
     
+    /**
+     * @desc Invalid WGS longitude
+     */
+    modulepar WGSLongitude PX_WGSLONGITUDE := 0;
+    
+    /**
+     * @desc Invalid WGS latitude. Default: 1
+     */
+    modulepar WGSLatitude PX_WGSLATITUDE := 0;
+    
+    /**
+     * @desc Invalid digest. Default: 1
+     */
+    modulepar HashedId8 PX_OTHER_CERT_DIGEST := '0000000000000000'O;
+    
+    /**
+     * @desc AES-128-CCM nonce public key
+     */
+    modulepar Oct12 PX_ENCRYPTIONPARAMETERS_AES_128_CCM_NONCE := 'C0FFEEDECAC0FFEEDECA0000'O;
+    
 } // End of module LibItsSecurity_Pixits
\ No newline at end of file
diff --git a/ttcn/Security/LibItsSecurity_Templates.ttcn3 b/ttcn/Security/LibItsSecurity_Templates.ttcn3
index ee9b0f49fe0c85b0adfd47940ae6a26639c467f7..97877a8bba7cec4552790ec5fca82456f94c6c62 100644
--- a/ttcn/Security/LibItsSecurity_Templates.ttcn3
+++ b/ttcn/Security/LibItsSecurity_Templates.ttcn3
@@ -334,6 +334,20 @@ module LibItsSecurity_Templates {
                     s           := p_s
                 } // End of template m_ecdsaSignature
                 
+                /**
+                 * @desc Send template for signatures based on unknown algorithm
+                 * @member p_signature The unknown signature
+                 * @see Draft ETSI TS 103 097 V1.1.14 Clause 4.2.9   Signature
+                 */
+                template (value) Signature m_unknownSignature(
+                                                              in template (value) octetstring p_signature
+                ):= {
+                    algorithm   := e_unknown,
+                    signature_  := {
+                        signature_ := p_signature
+                    } // End of field signature_
+                } // End of template m_unknownSignature
+                
             } // End of group signatures 
             
             group signerInfos {
@@ -358,6 +372,9 @@ module LibItsSecurity_Templates {
                     } // End of field signerInfo 
                 } // End of template m_signerInfo_digest
                 
+                /**
+                 * @desc Send template for certificate signed message
+                 */
                 template (value) SignerInfo m_signerInfo_certificate(
                                                                      in template (value) Certificate p_certificate
                 ) := {
@@ -367,6 +384,9 @@ module LibItsSecurity_Templates {
                     } // End of field signerInfo 
                 } // End of template m_signerInfo_certificate
                 
+                /**
+                 * @desc Send template for certificate chain signed message
+                 */
                 template (value) SignerInfo m_signerInfo_certificates(
                                                                       in template (value) CertificateChain p_certificates
                 ) := {
@@ -376,12 +396,43 @@ module LibItsSecurity_Templates {
                     } // End of field signerInfo
                 } // End of template m_signerInfo_certificates
                 
+                /**
+                 * @desc Send template for other certificate signed message
+                 */
+                template (value) SignerInfo m_signerInfo_other_certificates(
+                                                                            in template (value) CertificateWithAlgo p_certificateWithAlgo
+                ) := {
+                    type_         := e_certificate_digest_with_other_algorithm,
+                    signerInfo    := {
+                        certificateWithAlgo := p_certificateWithAlgo
+                    } // End of field signerInfo
+                } // End of template m_signerInfo_other_certificates
+                
+                template (value) CertificateWithAlgo m_certificateWithAlgo_ecdsa(
+                                                                                 in template (value) HashedId8 p_digest
+                ) := {
+                    algorithm := e_ecdsa_nistp256_with_sha256,
+                    digest := p_digest
+                } // End of m_certificateWithAlgo
+                
+                /**
+                 * @desc Send template for unknown signed message
+                 */
+                template (value) SignerInfo m_signerInfo_unknown(
+                                                                 in template (value) octetstring p_info
+                ) := {
+                    type_         := e_unknown,
+                    signerInfo    := {
+                        info := p_info
+                    } // End of field signerInfo
+                } // End of template m_signerInfo_unknown
+                
             } // End of group signerInfos
             
             /**
              * @desc Send template for Time64WithStandardDeviation
-             * @param p_time        TODO
-             * @param p_log_std_dev TODO
+             * @param p_time        Time in microseconds
+             * @param p_log_std_dev Estimate standard deviation (unit: nanoseconds)
              * @see Draft ETSI TS 103 097 V1.1.14 Clause 4.2.17    Time64WithStandardDeviation
              */
             template (value) Time64WithStandardDeviation m_time64WithStandardDeviation(
@@ -401,7 +452,7 @@ module LibItsSecurity_Templates {
                                                             in template (value) Int13 p_duration
             ) := {
                 unit        := e_seconds,
-                duration    := p_duration
+                duration_   := p_duration
             } // End of template m_duration_in_seconds
             
             /**
@@ -577,7 +628,7 @@ module LibItsSecurity_Templates {
                     type_           := e_uncompressed,
                     x               := p_x,
                     y               := {
-                    	y := p_y
+                        y := p_y
                     }
                 } // End of template mw_eccPointecdsa_nistp256_with_sha256_uncompressed
                 
@@ -613,7 +664,7 @@ module LibItsSecurity_Templates {
                     signerInfo    := {
                         certificates := p_certificates
                     } // End of field signerInfo
-                } // End of template m_signerInfo_certificates
+                } // End of template mw_signerInfo_certificates
                 
             } // End of group signerInfos
             
@@ -676,7 +727,7 @@ module LibItsSecurity_Templates {
                                                                in template (present) Int13 p_duration
             ) := {
                 unit        := e_seconds,
-                duration    := p_duration
+                duration_   := p_duration
             } // End of template mw_duration_in_seconds
             
             /**
@@ -919,7 +970,22 @@ module LibItsSecurity_Templates {
                 payload_field       := p_payload_field,
                 trailer_fields      := p_trailer_fields
             } // End of template m_securedMessage
-
+            
+            /**
+             * @desc Generic send template for secured message
+             */
+            template (value) SecuredMessage m_securedMessage_wrong_protocol(
+                                                                            in template (value) UInt8 p_protocol_version := c_protocol_version,
+                                                                            in template (value) HeaderFields p_header_fields,
+                                                                            in template (value) SecPayload p_payload_field,
+                                                                            in template (value) TrailerFields p_trailer_fields
+            ) := {
+                protocol_version    := p_protocol_version,
+                header_fields       := p_header_fields,
+                payload_field       := p_payload_field,
+                trailer_fields      := p_trailer_fields
+            } // End of template m_securedMessage
+            
         } // End of group messagesSend
         
         /**
@@ -1054,6 +1120,17 @@ module LibItsSecurity_Templates {
                     data    := p_data
                 } // End of template m_payload_signed_and_encrypted
                 
+                /**
+                 * @desc Send template for 'unsecured' Payload 
+                 * @see Draft ETSI TS 103 097 V1.1.14 Clause 5.2 Payload
+                 */
+                template (value) SecPayload m_payload_unknown(
+                                                              in template (value) octetstring p_data
+                ) := {
+                    type_   := e_unknown,
+                    data    := p_data
+                } // End of template m_payload_unknown
+                
             } // End of group payloadsSend 
             
             /**
@@ -1147,7 +1224,7 @@ module LibItsSecurity_Templates {
                  * @see Draft ETSI TS 103 097 V1.1.14 Clause 5.4    HeaderField
                  */
                 template (value) HeaderField m_header_field_unrecognised_certificate(
-                                                                   in template (value) HashedId3 p_digest
+                                                                                     in template (value) HashedId3 p_digest
                 ) := {
                     type_       := e_request_unrecognized_certificate,
                     headerField := {
@@ -1266,6 +1343,17 @@ module LibItsSecurity_Templates {
                     }
                 } // End of template m_header_field_enc_params
                 
+                /**
+                 * @desc Send template for HeaderField with unspecify header field value
+                 * @see Draft ETSI TS 103 097 V1.1.14 Clause 5.4    HeaderField
+                 */
+                template (value) HeaderField m_header_field_unspecify := {
+                    type_       := e_other_header_240,
+                    headerField := {
+                        other_header := 'C0FFEEDECA'O
+                    }
+                } // End of template m_header_field_unspecify
+                
             } // End of group headerFieldsSend
         
             /**
@@ -1303,7 +1391,7 @@ module LibItsSecurity_Templates {
                  * @see Draft ETSI TS 103 097 V1.1.14 Clause 5.4    HeaderField
                  */
                 template (present) HeaderField mw_header_field_generation_time_with_standard_deviation(
-                                                                                                       in template (present) Time64WithStandardDeviation p_generation_time_with_standard_deviation
+                                                                                                       in template (present) Time64WithStandardDeviation p_generation_time_with_standard_deviation := ?
                 ) := {
                     type_       := e_generation_time_standard_deviation,
                     headerField := {
@@ -1316,7 +1404,7 @@ module LibItsSecurity_Templates {
                  * @see Draft ETSI TS 103 097 V1.1.14 Clause 5.4    HeaderField
                  */
                 template (present) HeaderField mw_header_field_expiry_time(
-                                                                           in template (present) Time32 p_expiry_time
+                                                                           in template (present) Time32 p_expiry_time := ?
                 ) := {
                     type_       := e_expiration,
                     headerField := {
@@ -1329,7 +1417,7 @@ module LibItsSecurity_Templates {
                  * @see Draft ETSI TS 103 097 V1.1.14 Clause 5.4    HeaderField
                  */
                 template (present) HeaderField mw_header_field_generation_location(
-                                                                                   in template (present) ThreeDLocation p_generation_location
+                                                                                   in template (present) ThreeDLocation p_generation_location := ?
                 ) := {
                     type_       := e_generation_location,
                     headerField := {
@@ -1341,21 +1429,21 @@ module LibItsSecurity_Templates {
                  * @desc Receive template for HeaderField with generation location information
                  * @see Draft ETSI TS 103 097 V1.1.14 Clause 5.4    HeaderField
                  */
-                template (present) HeaderField mw_header_field_multiple_digests(
-                                                                                in template (present) HashedId3s p_digests
+                template (present) HeaderField mw_header_field_unrecognised_certificate(
+                                                                                        in template (present) HashedId3s p_digests := ?
                 ) := {
                     type_       := e_request_unrecognized_certificate,
                     headerField := {
                         digests := p_digests
                     }
-                } // End of template mw_header_field_multiple_digests
+                } // End of template mw_header_field_unrecognised_certificate
                 
                 /**
                  * @desc Receive template for HeaderField with signer information
                  * @see Draft ETSI TS 103 097 V1.1.14 Clause 5.4    HeaderField
                  */
                 template (present) HeaderField mw_header_field_signer_info(
-                                                                           in template (present) SignerInfo p_signer
+                                                                           in template (present) SignerInfo p_signer := ?
                 ) := {
                     type_       := e_signer_info,
                     headerField := {
@@ -1839,7 +1927,7 @@ module LibItsSecurity_Templates {
                     validity    :=  {
                         time_start_and_duration := {
                             start_validity  := p_start_validity,
-                            duration        := p_duration
+                            duration_       := p_duration
                         } // End of field time_start_and_duration
                     } // End of field validity
                 } // End of template m_validity_restriction_time_start_and_duration
@@ -1875,7 +1963,7 @@ module LibItsSecurity_Templates {
                                                           in template (present) SubjectInfo p_subject_info := ?,
                                                           in template (present) SubjectAttributes p_subject_attributes := ?,
                                                           in template (present) ValidityRestrictions p_validity_restrictions := ?,
-                                                          in template (present) Signature p_signature :=?
+                                                          in template (present) Signature p_signature := ?
             ) := {
                 version                 := c_certificate_version,
                 signer_info             := p_signer_info,
@@ -1889,7 +1977,7 @@ module LibItsSecurity_Templates {
                                                           in template (present) SignerInfo p_signer_info := ?,
                                                           in template (present) SubjectAttributes p_subject_attributes := ?,
                                                           in template (present) ValidityRestrictions p_validity_restrictions := ?,
-                                                          in template (present) Signature p_signature :=?
+                                                          in template (present) Signature p_signature := ?
             ) := {
                 version                 := c_certificate_version,
                 signer_info             := p_signer_info,
@@ -2077,7 +2165,7 @@ module LibItsSecurity_Templates {
                     validity    :=  {
                         time_start_and_duration := {
                             start_validity  := p_start_validity,
-                            duration        := p_duration
+                            duration_       := p_duration
                         } // End of field time_start_and_duration
                     } // End of field validity
                 } // End of template mw_validity_restriction_time_start_and_duration
@@ -2461,14 +2549,14 @@ module LibItsSecurity_Templates {
          * @desc SecuredMesage payload to be signed
          * @member p_security_profile   The secury profile 
          * @member p_header_fields      The headers list
-         * @member p_payload_field     The payloads list 
+         * @member p_payload_field      The payloads list 
          * @member p_trailer_field_type The trailer type
          * @see Draft ETSI TS 103 097 V1.1.14 Clause 7    Security profiles 
          */
         template (value) ToBeSignedSecuredMessage m_toBeSignedSecuredMessage(
-            in template (value) HeaderFields p_header_fields,
-            in template (value) SecPayload p_payload_field,
-            in template (value) TrailerFieldType p_trailer_field_type
+                                                                             in template (value) HeaderFields p_header_fields,
+                                                                             in template (value) SecPayload p_payload_field,
+                                                                             in template (value) TrailerFieldType p_trailer_field_type
         ) := {
             protocol_version        := c_protocol_version,
             header_fields           := p_header_fields,
@@ -2477,13 +2565,21 @@ module LibItsSecurity_Templates {
             trailerFieldType        := p_trailer_field_type
         } // End of template m_toBeSignedSecuredMessage
         
-        // FIXME Replace c_protocol_version by a PIXIT
+        /**
+         * @desc SecuredMesage template used to calculate the signature
+         * @member p_header_fields        The headers list
+         * @member p_payload_field        The payloads list 
+         * @member p_trailer_field_type   The trailer type
+         * @member p_protocol_version     The protocol version
+         * @member p_trailer_fieldsLength The trailer fields length, set to 67
+         * @see Draft ETSI TS 103 097 V1.1.14 Clause 7    Security profiles 
+         */
         template (value) ToBeSignedSecuredMessage m_toBeSignedSecuredMessage_wrong_protocol(
-            in template (value) HeaderFields p_header_fields,
-            in template (value) SecPayload p_payload_field,
-            in template (value) TrailerFieldType p_trailer_field_type,
-            in template (value) UInt8 p_protocol_version := c_protocol_version,
-            in template (value) UInt8 p_trailer_fieldsLength := 67
+                                                                                            in template (value) HeaderFields p_header_fields,
+                                                                                            in template (value) SecPayload p_payload_field,
+                                                                                            in template (value) TrailerFieldType p_trailer_field_type,
+                                                                                            in template (value) UInt8 p_protocol_version := c_protocol_version,
+                                                                                            in template (value) UInt8 p_trailer_fieldsLength := 67
         ) modifies m_toBeSignedSecuredMessage := {
             protocol_version        := p_protocol_version
         } // End of template m_toBeSignedSecuredMessage
diff --git a/ttcn/Security/LibItsSecurity_TestSystem.ttcn3 b/ttcn/Security/LibItsSecurity_TestSystem.ttcn3
index ca2a427d4bc008f7818cda20877b07f312c52bb8..caa5949ab66da21d0d2716e51e68ba3ce10604af 100644
--- a/ttcn/Security/LibItsSecurity_TestSystem.ttcn3
+++ b/ttcn/Security/LibItsSecurity_TestSystem.ttcn3
@@ -44,15 +44,99 @@ module LibItsSecurity_TestSystem {
             const charstring cc_taCert_G  := "CERT_TS_G_AT"; /** to be defined */
             const charstring cc_taCert_EC := "CERT_TS_A_EC"; /** Certificate with a subject type indicating 'enrolment_credentials', to be used when secured messages are sent from TA to IUT */
             const charstring cc_taCert_AA := "CERT_TS_A_AA"; /** Certificate with a subject type indicating 'authorisation_authority', to be used when secured messages are sent from TA to IUT */
+            const charstring cc_taCert_EA := "CERT_TS_A_EA"; /** Certificate with a subject type indicating 'enrolment_authority', to be used when secured messages are sent from TA to IUT */
+            const charstring cc_taCert_CA := "CERT_TS_A_CA"; /** Certificate with a subject type indicating 'root_ca', to be used when secured messages are sent from TA to IUT */
             // Test Adapter certificates & private keys - Inoportune behavior
             const charstring cc_taCert_B_BO  := "CERT_TS_B_BO_AT"; /** Certificate with a circular region, the IUT position is outside of the region */
             const charstring cc_taCert_C_BO  := "CERT_TS_C_BO_AT"; /** Certificate with a rectangular region, the IUT position is outside of the region */
             const charstring cc_taCert_D_BO  := "CERT_TS_D_BO_AT"; /** Certificate with a polygonal region, the IUT position is outside of the region */
             const charstring cc_taCert_E_BO  := "CERT_TS_E_BO_AT"; /** Certificate with a region identifier, the IUT position is outside of the region */
-            const charstring cc_taCert0101BO := "CERT_TS_01_01_BO_AT"; /**  */
-            const charstring cc_taCert0102BO := "CERT_TS_01_02_BO_AT"; /**  */
-            const charstring cc_taCert0103BO := "CERT_TS_01_03_BO_AT"; /**  */
-            const charstring cc_taCert0104BO := "CERT_TS_01_04_BO_AT"; /**  */
+            const charstring cc_taCert0101_BO := "CERT_TS_01_01_BO_AT"; /** Check that IUT discards the AT certificate with version 3 */
+            const charstring cc_taCert0102_BO := "CERT_TS_01_02_BO_AT"; /** Check that IUT discards the AT certificate with version 1 */
+            const charstring cc_taCert0103_BO := "CERT_TS_01_03_BO_AT"; /** Check that IUT discards the AA certificate with version 3 */
+            const charstring cc_taCert0104_BO := "CERT_TS_01_04_BO_AT"; /** Check that IUT discards the AA certificate with version 1 */
+            const charstring cc_taCert0201_BO := "CERT_TS_02_01_BO_AT"; /** Check that IUT discards a SecuredMessage if the issuer certificate of the authorization ticket certificate contains the subject type 'enrolment_credential' */
+            const charstring cc_taCert0202_BO := "CERT_TS_02_02_BO_AT"; /** Check that IUT discards a SecuredMessage if the issuer certificate of the authorization authority certificate contains the subject type 'enrolment_credential' */
+            const charstring cc_taCert0203_BO := "CERT_TS_02_03_BO_AT"; /** Check that IUT discards a SecuredMessage if the issuer certificate of the authorization ticket certificate contains the subject type 'enrolment_authority' */
+            const charstring cc_taCert0204_BO := "CERT_TS_02_04_BO_AT"; /** Check that IUT discards a SecuredMessage if the issuer certificate of the authorization authority certificate contains the subject type 'enrolment_authority' */
+            const charstring cc_taCert0301_BO := "CERT_TS_03_01_BO_AT"; /** Check that IUT discards a SecuredMessage if the issuer certificate of the authorization ticket certificate contains the subject type 'authorization_ticket' */
+            const charstring cc_taCert0302_BO := "CERT_TS_03_02_BO_AT"; /** Check that IUT discards a SecuredMessage if the issuer certificate of the authorization authority certificate contains the subject type 'authorization_ticket' */
+            const charstring cc_taCert0601_BO := "CERT_TS_06_01_BO_AT"; /** Check that IUT discards a SecuredMessage containing generation_time before the message signing certificate validity period */
+            const charstring cc_taCert0602_BO := "CERT_TS_06_02_BO_AT"; /** Check that IUT discards a SecuredMessage containing generation_time after the message signing certificate validity period */
+            const charstring cc_taCert0401_BO := "CERT_TS_04_01_BO_AT"; /** Check that IUT discards a SecuredMessage if the issuer certificate of the AA certificate contains the subject type 'authorization_authority' */
+            const charstring cc_taCertMsg1301_BO := "CERT_TS_MSG_13_01_BO_AT"; /** Check that IUT discards secured CAM signed with the not yet valid certificate */
+            const charstring cc_taCertMsg1302_BO := "CERT_TS_MSG_13_02_BO_AT"; /** Check that IUT discards secured CAM signed with the expired certificate */
+            const charstring cc_taCertMsg1303_BO := "CERT_TS_MSG_13_03_BO_AT"; /** Check that IUT discards secured CAM when IUT location is outside the circular validity restriction of the signing certificatee */
+            const charstring cc_taCertMsg1304_BO := "CERT_TS_MSG_13_04_BO_AT"; /** Check that IUT discards secured CAM when IUT location is outside the rectangular validity restriction of the signing certificate */
+            const charstring cc_taCertMsg1305_BO := "CERT_TS_MSG_13_05_BO_AT"; /** Check that IUT discards secured CAM when IUT location is outside the polygonal validity restriction of the signing certificate */
+            const charstring cc_taCertMsg1306_BO := "CERT_TS_MSG_13_06_BO_AT"; /** Check that IUT discards secured CAM when IUT location is outside the identified validity restriction of the signing certificate */
+            const charstring cc_taCert0601_BV := "CERT_TS_06_01_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the same circular region validity restriction as its issuing certificate */
+            const charstring cc_taCert0602_BV := "CERT_TS_06_02_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the circular region validity restriction which is fully inside in the circular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0603_BV := "CERT_TS_06_03_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the circular region validity restriction which is fully inside in the rectangular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0604_BV := "CERT_TS_06_04_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the circular region validity restriction which is fully inside in the polygonal region validity restriction of its issuing certificate */
+            const charstring cc_taCert0605_BV := "CERT_TS_06_05_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the circular region validity restriction which is fully inside in the identified region validity restriction of its issuing certificate */
+            const charstring cc_taCert0606_BO := "CERT_TS_06_06_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message does not contain the region validity restriction but its issuing certificate contains the circular region validity restriction */
+            const charstring cc_taCert0607_BO := "CERT_TS_06_07_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message contains circular region validity restriction which is outside of the circular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0608_BO := "CERT_TS_06_08_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message contains circular region validity restriction which is not fully covered by the the circular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0701_BV := "CERT_TS_07_01_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the same rectangular region validity restriction as its issuing certificate */
+            const charstring cc_taCert0702_BV := "CERT_TS_07_02_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the rectangular region validity restriction which is fully inside in the circular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0703_BV := "CERT_TS_07_03_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the validity restriction with rectangular region which is fully inside in the rectangular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0704_BV := "CERT_TS_07_04_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the rectangular region validity restriction which is fully inside in the polygonal region validity restriction of its issuing certificate */
+            const charstring cc_taCert0705_BV := "CERT_TS_07_05_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the rectangular region validity restriction which is fully inside in the identified region validity restriction of its issuing certificate */
+            const charstring cc_taCert0706_BO := "CERT_TS_07_06_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message does not contain the region validity restriction but its issuing certificate contains the rectangular region validity restriction */
+            const charstring cc_taCert0707_BO := "CERT_TS_07_07_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message contains rectangular region validity restriction which is outside of the rectangular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0708_BO := "CERT_TS_07_08_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message contains rectangular region validity restriction which is not fully covered by the the rectangular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0801_BV := "CERT_TS_08_01_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the same polygonal region validity restriction as its issuing certificate */
+            const charstring cc_taCert0802_BV := "CERT_TS_08_02_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the polygonal region validity restriction which is fully inside in the circular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0803_BV := "CERT_TS_08_03_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the polygonal region validity restriction which is fully inside in the rectangular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0804_BV := "CERT_TS_08_04_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the polygonal region validity restriction which is fully inside in the polygonal region validity restriction of its issuing certificate */
+            const charstring cc_taCert0805_BV := "CERT_TS_08_05_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the polygonal region validity restriction which is fully inside in the identified region validity restriction of its issuing certificate */
+            const charstring cc_taCert0806_BO := "CERT_TS_08_06_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message does not contain the region validity restriction but its issuing certificate contains the polygonal region validity restriction */
+            const charstring cc_taCert0807_BO := "CERT_TS_08_07_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message contains polygonal region validity restriction which is outside of the polygonal region validity restriction of its issuing certificate */
+            const charstring cc_taCert0808_BO := "CERT_TS_08_08_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message contains polygonal region validity restriction which is outside of the polygonal region validity restriction of its issuing certificate */
+            const charstring cc_taCert0809_BO := "CERT_TS_08_09_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message contains polygonal region validity restriction which is not fully covered by the the polygonal region validity restriction of its issuing certificate */
+            const charstring cc_taCert0901_BV := "CERT_TS_09_01_BV_AT"; /** Check that the IUT accepts a message when its signing certificate contains the identified region validity restriction with the same identified region as the issuing certificate and without local area definition  */
+            const charstring cc_taCert0902_BV := "CERT_TS_09_02_BV_AT"; /** Check that the IUT accepts a message when its signing certificate contains the identified region validity restriction with the same identified region as the issuing certificate and with local area definition  */
+            const charstring cc_taCert0903_BV := "CERT_TS_09_03_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the polygonal region validity restriction which is fully inside in the circular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0904_BV := "CERT_TS_09_04_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the polygonal region validity restriction which is fully inside in the rectangular region validity restriction of its issuing certificate */
+            const charstring cc_taCert0905_BV := "CERT_TS_09_05_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of this message contains the polygonal region validity restriction which is fully inside in the polygonal region validity restriction of its issuing certificate */
+            const charstring cc_taCert0906_BV := "CERT_TS_09_06_BV_AT"; /** Check that the IUT accepts a message when the signing certificate of the message contains the identified region validity restriction with the identified region which is fully covered by the identified region of the validity restriction of its issuing certificate */
+            const charstring cc_taCert0907_BO := "CERT_TS_09_07_BO_AT"; /** Check that the IUT discards a message when the signing certificate of this message does not contain the region validity restriction but its issuing certificate contains the identified region validity restriction */
+            const charstring cc_taCert0908_BO := "CERT_TS_09_08_BO_AT"; /** Check that the IUT discards a message when the signing certificate and its issuing certificate are both containing the identified region validity restrictions with the same region id but different local regions */
+            const charstring cc_taCert0909_BO := "CERT_TS_09_09_BO_AT"; /** Check that the IUT discards a message when the identified region of the validity restriction of its signing certificate is different and not fully covered by the one in the issuing certificate */
+            const charstring cc_taCert0910_BO := "CERT_TS_09_10_BO_AT"; /** Check that the IUT discards a message when the identified region validity restriction of its signing certificate contains unknown area code */
+            const charstring cc_taCert0911_BO := "CERT_TS_09_11_BO_AT"; /** Check that the IUT discards a message when the identified region validity restriction of its signing certificate contains invalid area code */
+            const charstring cc_taCert1001_BO := "CERT_TS_10_01_BO_AT"; /** Check that the IUT discards a message when its signing certificate does not contain the time validity restriction */
+            const charstring cc_taCert1002_BO := "CERT_TS_10_02_BO_AT"; /** Check that the IUT discards a message when the issuing certificate of the message signing certificate does not contain the time validity restriction */
+            const charstring cc_taCert1003_BO := "CERT_TS_10_03_BO_AT"; /** Check that the IUT discards a message when its signing certificate contains 'time_end' validity restriction */
+            const charstring cc_taCert1004_BO := "CERT_TS_10_03_BO_AT"; /** Check that the IUT discards a message when its signing certificate contains 'time_start_and_duration' validity restriction */
+            const charstring cc_taCert1005_BO := "CERT_TS_10_03_BO_AT"; /** Check that the IUT discards a message when the issuing certificate of the message signing certificate contains 'time_end' validity restriction */
+            const charstring cc_taCert1006_BO := "CERT_TS_10_03_BO_AT"; /** Check that the IUT discards a message when its signing certificate contains 'time_start_and_duration' validity restriction */
+            const charstring cc_taCert1101_BO := "CERT_TS_11_01_BO_AT"; /** Check that the IUT discards a message when the validity period of the signing certificate ends after the validity period of its issuing certificate */
+            const charstring cc_taCert1102_BO := "CERT_TS_11_02_BO_AT"; /** Check that the IUT discards a message when the validity period of its signing certificate starts before the validity period of the issuing certificate */
+            const charstring cc_taCert1103_BO := "CERT_TS_11_03_BO_AT"; /** Check that the IUT discards a message when the issuing certificate of signing certificate is expired but the signing certificate is not expired yet */
+            const charstring cc_taCert1104_BO := "CERT_TS_11_04_BO_AT"; /** Check that the IUT discards a message when the validity period of the signing certificate is after the validity period of its issuing certificate */
+            const charstring cc_taCert1201_BO := "CERT_TS_12_01_BO_AT"; /** Check that the IUT discards a message when its signing certificate does not contain the SSP-AID subject attribute */
+            const charstring cc_taCert1202_BO := "CERT_TS_12_02_BO_AT"; /** Check that the IUT discards a Secured CAM when its signing certificate does not contain a record with AID_CAM in the its_aid_ssp_list subject attribute */
+            const charstring cc_taCert1203_BO := "CERT_TS_12_03_BO_AT"; /** Check that the IUT discards a Secured DENM when its signing certificate does not contain a record with AID_DENM in the its_aid_ssp_list subject attribute */
+            const charstring cc_taCert1204_BO := "CERT_TS_12_04_BO_AT"; /** Check that the IUT discards a Secured CAM when its signing certificate contains two records with AID_CAM in the its_aid_ssp_list subject attribute */
+            const charstring cc_taCert1301_BO := "CERT_TS_13_01_BO_AT"; /** Check that the IUT discards a message when the signing AT certificate contains a CAM AID-SSP record whereas the issuing AA certificate does not contain the record with AID_CAM */
+            const charstring cc_taCert1302_BO := "CERT_TS_13_02_BO_AT"; /** Check that the IUT discards a message when the signing AT certificate contains a DENM AID-SSP record whereas the issuing AA certificate does not contain the AID record with AID_DENM */
+            const charstring cc_taCert1303_BO := "CERT_TS_13_03_BO_AT"; /** Check that IUT discards a SecuredMessage if the AA certificate does not contain a subject_attribute of type its_aid_list */
+            const charstring cc_taCert1401_BO := "CERT_TS_14_01_BO_AT"; /** Check that IUT discards the AT certificate with signer info of type 'certificate' */
+            const charstring cc_taCert1402_BO := "CERT_TS_14_02_BO_AT"; /** Check that IUT discards the AT certificate with signer info of type 'certificate_chain' */
+            const charstring cc_taCert1403_BO := "CERT_TS_14_03_BO_AT"; /** Check that IUT discards the AT certificate with signer info of type 'certificate_digest_with_other_algorithm' */
+            const charstring cc_taCert1501_BO := "CERT_TS_15_01_BO_AT"; /** Check that IUT discards the AA certificate with signer info of type 'certificate' */
+            const charstring cc_taCert1502_BO := "CERT_TS_15_02_BO_AT"; /** Check that IUT discards the AA certificate with signer info of type 'certificate_chain' */
+            const charstring cc_taCert1503_BO := "CERT_TS_15_03_BO_AT"; /** Check that IUT discards the AA certificate with signer info of type 'certificate_digest_with_other_algorithm' */
+            const charstring cc_taCert1601_BO := "CERT_TS_16_01_BO_AT"; /** Check that IUT discards a SecuredMessage if the subject_name of the AT certificate is not an empty name field */
+            const charstring cc_taCert1701_BO := "CERT_TS_17_01_BO_AT"; /** Check that IUT discards a SecuredMessage if the subject attribute of type assurance_level is missing in the AT certificate */
+            const charstring cc_taCert1702_BO := "CERT_TS_17_02_BO_AT"; /** Check that IUT discards a SecuredMessage if the subject attribute of type assurance_level is missing in the AA certificate */
+            const charstring cc_taCert1703_BO := "CERT_TS_17_03_BO_AT"; /** Check that IUT discards a SecuredMessage if the assurance level of issuing certificate is less then assurance level of subordinate certificate */
+            const charstring cc_taCert1704_BO := "CERT_TS_17_04_BO_AT"; /** Check that IUT discards a SecuredMessage if the assurance level of issuing certificate is equal to the  assurance level of the subordinate certificate but the confidence of subject assurance of issuing certificate is less then the confidence of the subordinate certificate */
+            const charstring cc_taCert1801_BO := "CERT_TS_18_01_BO_AT"; /** Check that IUT discards a SecuredMessage if the subject attribute of type verification_key is missing in the AT certificate */
+            const charstring cc_taCert1802_BO := "CERT_TS_18_02_BO_AT"; /** Check that IUT discards a SecuredMessage if the subject attribute of type verification_key is missing in the AA certificate */
+            const charstring cc_taCert1901_BO := "CERT_TS_19_01_BO_AT"; /** Check that IUT discards a SecuredMessage if the reserved region type has been used in region validity restriction of the AT certificate */
             
             // IUT certificates & private keys
             const charstring cc_iutCert_A := "CERT_IUT_A_AT"; /** Default certificate, without region validity restriction, to be used when secured messages are sent from TA to IUT */
diff --git a/ttcn/Security/LibItsSecurity_TypesAndValues.ttcn3 b/ttcn/Security/LibItsSecurity_TypesAndValues.ttcn3
index 4b325e682b892933513dfab5c9ecc3f6add10fa6..cc544a1e1b0881703c10424d52586bd725fe4638 100644
--- a/ttcn/Security/LibItsSecurity_TypesAndValues.ttcn3
+++ b/ttcn/Security/LibItsSecurity_TypesAndValues.ttcn3
@@ -29,7 +29,8 @@ module LibItsSecurity_TypesAndValues {
          */
         type enumerated PublicKeyAlgorithm {
             e_ecdsa_nistp256_with_sha256    (0),
-            e_ecies_nistp256                (1)
+            e_ecies_nistp256                (1),
+            e_unknown                       (240)
         } with { variant "8 bit" }
         
         /**
@@ -154,7 +155,7 @@ module LibItsSecurity_TypesAndValues {
         /**
          * @desc Description an ECDSA based signature
          * @member r            Coordinate of the elliptic curve point resulting from multiplying the generator element by the ephemeral private key
-         * @member s            TODO
+         * @member s            Signature
          * @see Draft ETSI TS 103 097 V1.1.14 Clause 4.2.9  EcdsaSignature
          */
         type record EcdsaSignature {
@@ -210,7 +211,8 @@ module LibItsSecurity_TypesAndValues {
             e_certificate_digest_with_sha256            (1),
             e_certificate                               (2),
             e_certificate_chain                         (3),
-            e_certificate_digest_with_other_algorithm   (4)
+            e_certificate_digest_with_other_algorithm   (4),
+            e_unknown                                   (240)
         } // End of type SignerInfoContainer
         
         /**
@@ -252,13 +254,13 @@ module LibItsSecurity_TypesAndValues {
         
         /**
          * @desc Defines the duration of a time span (e.g. a certificate's validity)
-         * @member unit     Units of the duration
-         * @member duration The duration of a time span
+         * @member unit         Units of the duration
+         * @member duration_    The duration of a time span
          * @see Draft ETSI TS 103 097 V1.1.14 Clause 4.2.17  Duration
          */
         type record Duration {
             DurationUnitType    unit,
-            Int13               duration
+            Int13               duration_
         } // End of type Duration
         
         /**
@@ -482,7 +484,8 @@ module LibItsSecurity_TypesAndValues {
             e_signed                (1),
             e_encrypted             (2),
             e_signed_external       (3),
-            e_signed_and_encrypted  (4)
+            e_signed_and_encrypted  (4),
+            e_unknown               (240)
         } with { variant "8 bit" }
         
         /**
@@ -513,7 +516,8 @@ module LibItsSecurity_TypesAndValues {
             e_its_aid                               (5),
             e_signer_info                           (128),
             e_encryption_parameters                 (129),
-            e_recipient_info                        (130)
+            e_recipient_info                        (130),
+            e_other_header_240                      (240)
         } with { variant "8 bit" }
         
         type union HeaderFieldContainer {
@@ -750,7 +754,7 @@ module LibItsSecurity_TypesAndValues {
          * @member time_start_and_duration  Validity restriction between into a range from a start date and inside a geographical aera
          * @member region                   Validity restriction into a geographical area
          * @member region                   Validity restriction into a geographical area
-         * @member data                     TODO
+         * @member data                     Undefined
          */
         type union ValidityRestrictionContainer {
             Time32              end_validity,
@@ -773,11 +777,11 @@ module LibItsSecurity_TypesAndValues {
         /**
          * @desc Defines the validity restriction between into a range from a start date and inside a geographical aera
          * @member start_validity   Start date
-         * @member duration         Duration of the validity restriction from the start date
+         * @member duration_        Duration of the validity restriction from the start date
          */
         type record TimeDuration {
             Time32              start_validity,
-            Duration            duration
+            Duration            duration_
         } // End of type TimeDuration
         
         /**
@@ -934,6 +938,13 @@ module LibItsSecurity_TypesAndValues {
             ValidityRestrictions    validity_restrictions
         } // End of type ToBeSignedCertificate
         
+        type record CertificatesCachingItem {
+            HashedId8   hashedId8,
+            Certificate certificate
+        }
+        type record of CertificatesCachingItem CertificatesCaching;
+        
+        
     } // End of group profileCertificates 
     
     group taConfiguration {