From 1272237e7de55c36ed27fc3b039baf234cb8a1e2 Mon Sep 17 00:00:00 2001
From: Yann Garcia <yann.garcia@fscom.fr>
Date: Wed, 31 May 2023 11:47:32 +0200
Subject: [PATCH] Finalyze TD_VoLTE_ECO_INT_INI_01_01

---
 ttcn/AtsImsIot/AtsImsIot_Emergency.ttcn       | 288 +++++++++++-
 .../AtsImsIot_TP_behavior_MW_EB.ttcn          | 428 +++++++++++++++++
 .../AtsImsIot_TP_behavior_MW_EC.ttcn          | 433 ++++++++++++++++++
 ttcn/AtsImsIot/AtsImsIot_Templates_MW.ttcn    | 257 +++++++++++
 4 files changed, 1392 insertions(+), 14 deletions(-)
 create mode 100644 ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EB.ttcn
 create mode 100644 ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EC.ttcn

diff --git a/ttcn/AtsImsIot/AtsImsIot_Emergency.ttcn b/ttcn/AtsImsIot/AtsImsIot_Emergency.ttcn
index ab2dbcb..4c3eb52 100644
--- a/ttcn/AtsImsIot/AtsImsIot_Emergency.ttcn
+++ b/ttcn/AtsImsIot/AtsImsIot_Emergency.ttcn
@@ -9,15 +9,15 @@ module AtsImsIot_Emergency {
     // LibCommon
     // LibSip
     // LibIms
-    import from LibIms_UpperTester { type ImsUserInfo };
+    import from LibIms_UpperTester all;
     // LibIot
-    import from LibIot_TestInterface { type IotEquipmentUser };
-    import from LibIot_TestConfiguration { function f_cf_create_IotEquipmentUser };
-    import from LibIot_PIXITS { modulepar PX_EUT_A, PX_EUT_B, PX_EUT_C };
+    import from LibIot_TestInterface all;
+    import from LibIot_TestConfiguration all;
+    import from LibIot_PIXITS all;
     import from LibIot_VxLTE_PIXITS all;
     import from LibIot_VxLTE_Functions all;
     // LibImsIot
-    import from AtsImsIot_Functions { function f_getImUser };
+    import from AtsImsIot_Functions all;
     // ImsIot
     import from AtsImsIot_TestConfiguration all; 
     import from AtsImsIot_TestSystem all; 
@@ -26,6 +26,8 @@ module AtsImsIot_Emergency {
     import from AtsImsIot_TP_behavior_MW_PS all;
     import from AtsImsIot_TP_behavior_MW_SI all;
     import from AtsImsIot_TP_behavior_MW_IS all;
+    import from AtsImsIot_TP_behavior_MW_EC all;
+    import from AtsImsIot_TP_behavior_MW_EB all;
     import from AtsImsIot_TP_behavior_IC all;
     import from AtsImsIot_TP_behavior_CX all;
     import from AtsImsIot_TP_behavior_GX all;
@@ -115,7 +117,7 @@ module AtsImsIot_Emergency {
                     f_cf_adapter_down ( );
                 }else{
                     //log...
-                    setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs")
+                    setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs");
                 }
             } // End of testcase TD_VoLTE_ECO_INT_REG_01
 
@@ -171,7 +173,7 @@ module AtsImsIot_Emergency {
                     f_cf_adapter_down ( );
                 }else{
                     //log...
-                    setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs")
+                    setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs");
                 }
             } // End of testcase TD_VoLTE_ECO_INT_REG_02
 
@@ -182,15 +184,262 @@ module AtsImsIot_Emergency {
          */
         group EmergencySessionEmergencyBearerOperations {
 
-        } // End of group EmergencySessionEmergencyBearerOperations
-
-        /**
-         * @see ETSI TS 103 795-2 Clause 5.4	Emergency Deregistration
-         */
-        group EmergencyNetworkDetachment {
-
             group EmergencySessionEstablishment {
 
+                /**
+                * @desc    To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session establishment.
+                *          On successful emergency call setup with UE-A attached to EPC A, the P-CSCF should derive from the SDP offer and answer, descriptions of the Service Data Flow
+                * @see ETSI TS 103 795-2 Clause 5.3.1.2	UE calling PSAP with emergency registration
+                * @remark This is option1: IBCF is connect to another network and the interface between the IBCF and the PSAP is the Ic interface
+                */
+                testcase TD_VoLTE_ECO_INT_INI_01_01 ( ) runs on ImsTestCoordinator system IotSystemInterface {
+                    
+                    var IotEquipmentUser v_ueA  := f_cf_create_IotEquipmentUser ( c_userUE_A );
+                    var IotEquipmentUser v_psap := f_cf_create_IotEquipmentUser ( c_psap );
+        
+                    f_setVxLteMonIterfacesAvailability();
+                    //Check required monitor interfaces due to TD
+                    if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME,
+                                                              PX_DIAMETER_GX_INTERFACENAME,
+                                                              PX_DIAMETER_RX_INTERFACENAME,
+                                                              PX_SIP_MW_PE_INTERFACENAME,
+                                                              PX_SIP_EB_INTERFACENAME, // E-CSCF -> IBCF
+                                                              PX_SIP_IC_INTERFACENAME // IBCF -> IMS_B -> PSAP
+                                                              }))
+                    {
+                        var SipMessage v_sip;
+                        
+                        f_cf_createVxLteMonitor();
+                
+                        // map/connect component ports
+                        f_cf_adapter_up ( );
+                        f_cf_user_up ( v_ueA );
+                        f_cf_user_up ( v_psap );
+                        f_cf_VxLteMonitor_Up();
+                
+                        // Preamble
+//                        f_mtc_userRegistration(v_ueA, v_userInfoA); 
+//                        f_mtc_userRegistration(v_psap, v_userInfoB); 
+                        f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_01_01();
+                        
+                        // Test body
+                        //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB);
+                        
+
+                        f_mtc_check_TP_GM_PCSCF_INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 1
+                        f_mtc_check_TP_GM_PCSCF_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip);
+
+                        //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF
+                        f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2
+                        f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3
+                        f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx);  // Event 4
+                        f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5
+                        f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8
+                        //f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9
+
+
+                        f_mtc_check_TP_MW_ECSCF_INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10
+                        f_mtc_check_TP_MW_ECSCF_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip);
+        
+                        f_mtc_check_TP_MW_IBCF_INVITE_01(vc_vxlte_monitor_components.mw??, -, v_sip); // Event 11
+                        f_mtc_check_TP_MW_IBCF_100Trying_01(vc_vxlte_monitor_components.mw??, -, v_sip);
+        
+                        f_mtc_check_TP_IC_IBCF_INVITE_01(vc_vxlte_monitor_components.ic, true); // INVITE Event 12 (NOTE: comment out if ISC simulated by Ic)
+                        f_mtc_check_TP_IC_IBCF_INVITE_02(vc_vxlte_monitor_components.ic, true); // INVITE Event 12 (NOTE: comment out if ISC simulated by Ic)
+                        f_mtc_check_TP_IC_IBCF_INVITE_03(vc_vxlte_monitor_components.ic); // INVITE ENUM Event 8
+                        f_mtc_check_TP_IC_IBCF_183RESP_01(vc_vxlte_monitor_components.ic,-); // 183 Event 13
+
+                        // 183 Session Progress
+                        f_mtc_check_TP_MW_IBCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 14
+                        f_mtc_check_TP_MW_ECSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 15
+                        f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 20
+                        
+                        //Rx/Gx exchange after 183(SDP) was received at P-CSCF
+                        f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 16
+                        f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 17
+                        f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx);  // Event 18
+                        f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 19
+                        
+                        f_mtc_check_TP_IC_IBCF_180RINGING_01(vc_vxlte_monitor_components.ic, true); // 180 Ringing – Event 22
+                        f_mtc_check_TP_MW_IBCF_180RINGING_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 23
+                        f_mtc_check_TP_MW_ECSCF_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 24
+                        f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25
+                                                
+                        f_mtc_userCheckRinging(v_psap);
+                        f_mtc_userCheckPeerIsRinging(v_ueA);
+                        f_mtc_userAnswerCall(v_psap);
+                        
+                        f_mtc_check_TP_IC_IBCF_2XXRESP_01(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 26
+                        f_mtc_check_TP_IC_IBCF_2XXRESP_02(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 26
+                        f_mtc_check_TP_IC_IBCF_2XXRESP_03(vc_vxlte_monitor_components.ic); // 200 OK – Event 26
+
+                        f_mtc_check_TP_MW_IBCF_200OK_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 27
+                        f_mtc_check_TP_MW_ECSCF_200OK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 28                        
+                        f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 29
+
+                        f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 30 
+                        f_mtc_check_TP_MW_ECSCF_ACK_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 31
+                        f_mtc_check_TP_MW_IBSCF_ACK_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 32                        
+                        f_mtc_check_TP_IC_IBCF_ACK_01(vc_vxlte_monitor_components.ic); // ACK – Event 33
+
+                        f_mtc_userCheckCallEstablished(v_ueA); // Event 34
+                        f_mtc_userCheckCallEstablished(v_psap); // Event 34
+                        
+                        // Postamble
+                        f_mtc_EndCall(v_ueA);
+                        f_PO_user_home_deregistration(v_ueA);
+                        f_PO_user_home_deregistration(v_psap);
+                        //f_cf_int_call_down(v_config);
+            
+                        //unmap/disconnect component ports
+                        f_cf_user_down ( v_psap );
+                        f_cf_user_down ( v_ueA );
+                        f_cf_VxLteMonitor_Down();
+                    }else{
+                        //log...
+                        setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs")
+                    }
+                    f_cf_adapter_down ( );
+                } // End of TC TD_VoLTE_ECO_INT_INI_01_01
+                
+                group f_TD_VoLTE_ECO_INT_INI_01_01 {
+                    
+                    function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_01_01() runs on ImsTestCoordinator {
+                        log("If the test case fails, please check the preconditions");
+                     } // End of function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_01_01
+                     
+                } // End of f_TD_VoLTE_ECO_INT_INI_01_01
+                 
+                /**
+                * @desc    To demonstrate the establishment of dedicated bearers at the originating EPC due to SIP emergency session establishment.
+                *          On successful emergency call setup with UE-A attached to EPC A, the P-CSCF should derive from the SDP offer and answer, descriptions of the Service Data Flow
+                * @see ETSI TS 103 795-2 Clause 5.3.1.2	UE calling PSAP with emergency registration
+                * @remark This is option2: IBCF is connected to the PSAP, the interface IBCF and the PSAP is the Mm interface
+                */
+                testcase TD_VoLTE_ECO_INT_INI_01_02() runs on ImsTestCoordinator system IotSystemInterface {
+
+                    var IotEquipmentUser v_ueA    := f_cf_create_IotEquipmentUser ( c_userUE_A );
+                    var IotEquipmentUser v_psap   := f_cf_create_IotEquipmentUser ( c_psap );
+        
+                    f_setVxLteMonIterfacesAvailability();
+                    //Check required monitor interfaces due to TD
+                    if (f_checkVxLteRequiredMonitorInterface({PX_SIP_GMA_INTERFACENAME,
+                                                              PX_DIAMETER_GX_INTERFACENAME,
+                                                              PX_DIAMETER_RX_INTERFACENAME,
+                                                              PX_SIP_MW_PE_INTERFACENAME,
+                                                              PX_SIP_EB_INTERFACENAME, // E-CSCF -> IBCF
+                                                              PX_SIP_MM_PSAP_INTERFACENAME // IBCF -> PSAP
+                                                              }))
+                    {
+                        var SipMessage v_sip;
+                        
+                        f_cf_createVxLteMonitor();
+                
+                        // map/connect component ports
+                        f_cf_adapter_up ( );
+                        f_cf_user_up ( v_ueA );
+                        f_cf_user_up ( v_psap );
+                        f_cf_VxLteMonitor_Up();
+                
+                        // Preamble
+                        f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_01();
+                        
+                        // Test body
+                        //f_mtc_userInitiateCall (v_ueA, v_userTelInfoB);
+                        
+
+                        f_mtc_check_TP_GM_PCSCF_INVITE_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 1
+                        f_mtc_check_TP_GM_PCSCF_100Trying_01(vc_vxlte_monitor_components.gmA, -, v_sip);
+
+                        //Rx/Gx exchange after INVITE (SDP) was received at P-CSCF
+                        f_mtc_check_TP_RX_PCSCF_AAR_03(vc_vxlte_monitor_components.rx);// Event 2
+                        f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 3
+                        f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx);  // Event 4
+                        f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 5
+                        f_mtc_check_TP_RX_PCSCF_RAA_01(vc_vxlte_monitor_components.rx);// Events 7,8
+                        f_mtc_check_TP_GX_PCRF_CCA_01(vc_vxlte_monitor_components.gx); // Events 6,9
+
+
+                        f_mtc_check_TP_MW_ECSCF_INVITE_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 10
+                        f_mtc_check_TP_MW_ECSCF_100Trying_01(vc_vxlte_monitor_components.mwPE, -, v_sip);
+
+                        f_mtc_check_TP_MW_IBCF_INVITE_01(vc_vxlte_monitor_components.mw??, -, v_sip); // Event 11
+                        f_mtc_check_TP_MW_IBCF_100Trying_01(vc_vxlte_monitor_components.mw??, -, v_sip);
+                        
+                        f_mtc_check_TP_MM_PSAP_INVITE_01(vc_vxlte_monitor_components.mwB_PSAP, true); // INVITE Event 12
+
+                        // 183 Session Progress
+                        f_mtc_check_TP_MM_PSAP_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwB_PSAP, -, v_sip); // Event 13
+                        f_mtc_check_TP_MW_ECSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 14
+                        f_mtc_check_TP_MW_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 15
+                        f_mtc_check_TP_GM_PCSCF_183SESSION_PROGRESS_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 20
+                        
+                        // PRACK after 183 Session Progress: require field is present
+                        // FIXME Add check of requires SIP message header to check PRACK
+                        //f_mtc_check_TP_MW_PCSCF_PRACK_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 15
+                        //f_mtc_check_TP_GM_PCSCF_PRACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 20
+                        
+                        //Rx/Gx exchange after 183(SDP) was received at P-CSCF
+                        f_mtc_check_TP_RX_PCSCF_AAR_04(vc_vxlte_monitor_components.rx);// Event 16
+                        f_mtc_check_TP_GX_PCRF_RAR_01(vc_vxlte_monitor_components.gx, true); // Event 17
+                        f_mtc_check_TP_GX_PGW_RAA_02(vc_vxlte_monitor_components.gx);  // Event 18
+                        f_mtc_check_TP_RX_PCRF_AAA_02(vc_vxlte_monitor_components.rx); // Event 19
+                        
+                        f_mtc_check_TP_MM_PSAP_1XXRESP_01(vc_vxlte_monitor_components.ic); // 180 Ringing – Event 22                        
+                        // FIXME f_mtc_check_TP_???_180RINGING_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 23
+                        f_mtc_check_TP_MW_ECSCF_180RINGING_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 24
+                        f_mtc_check_TP_GM_PCSCF_180RINGING_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 25
+                        
+                        // PRACK after 180 Session Progress: require field is present
+                        // FIXME Add check of requires SIP message header to check PRACK
+                        // f_mtc_check_TP_MW_PCSCF_PRACK_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 15
+                        // f_mtc_check_TP_GM_PCSCF_PRACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 20
+                        
+                        f_mtc_userCheckRinging(v_psap);
+                        f_mtc_userCheckPeerIsRinging(v_ueA);
+                        f_mtc_userAnswerCall(v_psap);
+                        
+                        //f_mtc_check_TP_IC_IBCF_2XXRESP_01(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 26
+                        //f_mtc_check_TP_IC_IBCF_2XXRESP_02(vc_vxlte_monitor_components.ic, true); // 200 OK – Event 25
+                        f_mtc_check_TP_MM_PSAP_2XXRESP_03(vc_vxlte_monitor_components.ic); // 200 OK – Event 26
+                        // FIXME f_mtc_check_TP_???_2XXRESP_03(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 27
+                        f_mtc_check_TP_MW_ECSCF_200OK_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 28
+                        f_mtc_check_TP_GM_PCSCF_200OK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 29
+
+                        f_mtc_check_TP_GM_PCSCF_ACK_01(vc_vxlte_monitor_components.gmA, -, v_sip); // Event 30 
+                        f_mtc_check_TP_MW_ECSCF_ACK_01(vc_vxlte_monitor_components.mwPS, -, v_sip); // Event 31
+                        // FIXME f_mtc_check_TP_???_ACK_01(vc_vxlte_monitor_components.mwPE, -, v_sip); // Event 32
+                        f_mtc_check_TP_MM_PSAP_ACK_01(vc_vxlte_monitor_components.ic); // ACK – Event 33
+
+                        f_mtc_userCheckCallEstablished(v_ueA); // Event 34
+                        f_mtc_userCheckCallEstablished(v_psap); // Event 34
+                        
+                        // Postamble
+                        f_mtc_EndCall(v_ueA);
+                        f_PO_user_home_deregistration(v_ueA);
+                        f_PO_user_home_deregistration(v_psap);
+                        //f_cf_int_call_down(v_config);
+            
+                        //unmap/disconnect component ports
+                        f_cf_user_down ( v_psap );
+                        f_cf_user_down ( v_ueA );
+                        f_cf_VxLteMonitor_Down();
+                    }else{
+                        //log...
+                        setverdict (inconc,"At least one required monitor interface SHALL be selected! Check PIXITs")
+                    }
+                    f_cf_adapter_down ( );
+                } // End of TC TD_VoLTE_ECO_INT_INI_01_02
+                
+                group f_TD_VoLTE_ECO_INT_INI_01_02 {
+                    
+                    function f_mtc_check_precond_TD_VoLTE_ECO_INT_INI_01() runs on ImsTestCoordinator {
+                        log("If the test case fails, please check the preconditions");
+                        // TODO Add real code to check pre-conditions
+                     } // End of function f_TD_VoLTE_ECO_INT_INI_01_02
+                     
+                } // End of f_TD_VoLTE_ECO_INT_INI_01
+                 
             } // End of group EmergencySessionEstablishment
 
             group EmergencySessionRelease {
@@ -201,6 +450,17 @@ module AtsImsIot_Emergency {
 
             } // End of group EmergencySessionAbortOrReject
 
+        } // End of group EmergencySessionEmergencyBearerOperations
+
+        /**
+         * @see ETSI TS 103 795-2 Clause 5.4	Emergency Deregistration
+         */
+        group EmergencyNetworkDetachment {
+
+            group EmergencySessionDetachment {
+
+            } // End of group EmergencySessionDetachment
+
         } // End of group EmergencyNetworkDetachment
 
     } // End of group Interoperability
diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EB.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EB.ttcn
new file mode 100644
index 0000000..850ca5a
--- /dev/null
+++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EB.ttcn
@@ -0,0 +1,428 @@
+/**
+ *  @author     TTF T010
+ *  @version    $Id$
+ *  @desc       This module provides the TP behaviour functions at Mw interface at E-CSCF/IBCF
+ */
+
+module AtsImsIot_TP_behavior_MW_EB {
+
+    // LibIms
+    import from LibIms_Templates all;
+    import from LibIms_UpperTester all;
+    // LibIot
+    import from LibIot_TypesAndValues all;
+    import from LibIot_Functions all;
+    import from LibIot_TestInterface all;
+    import from LibIot_PIXITS all;
+    // LibSip
+    import from LibSip_SIPTypesAndValues all;
+    import from LibSip_Templates all;
+    import from LibSip_Common all;
+    import from LibSip_SDPTypes all;
+    // LibMsrp
+    import from LibMsrp_TypesAndValues all;
+    import from LibMsrp_Functions all;
+    import from LibMsrp_Templates all;
+    // AtsImsIot
+    import from AtsImsIot_TestSystem all;
+    import from AtsImsIot_Templates_MW all;
+    import from AtsImsIot_Templates all;
+    import from AtsImsIot_TypesAndValues all;
+    import from AtsImsIot_Functions all;
+
+    group imsInvite {
+        
+        /**
+         * @desc Verify that the E-CSCF successfully processes an initial INVITE (Originating Leg)..
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_E_CSCF_A entity receives an INVITE containing
+         *             From indicating value PX_UE_A_SIP_URI,
+         *             To indicating value PX_PSAP_SIP_URI,
+         *             CallId indicating value PX_UE_A_CALLID,
+         *             Via indicating value PX_UE_A_VIA,
+         *             Route indicating value PX_UE_A_SERVICE_ROUTE,
+         *             PAccessNetworkInfo,
+         *             MessageBody containing
+         *                 SDP containing
+         *                     Version indicating value "0" 
+         *                         ;
+         *             ;;
+         *         from the IMS_P_CSCF_A entity
+         *     }
+         *     then {
+         *         the IMS_E_CSCF_A entity sends an INVITE containing
+         *             From indicating value PX_UE_A_SIP_URI,
+         *             To indicating value PX_PSAP_SIP_URI,
+         *             CallId indicating value PX_UE_A_CALLID,
+         *             Via indicating value PX_UE_A_VIA,
+         *             Route indicating value PX_UE_A_SERVICE_ROUTE,
+         *             PAccessNetworkInfo,
+         *             MessageBody containing
+         *                 SDP containing
+         *                     Version indicating value "0" 
+         *                         ;
+         *             ;;
+         *         to the IMS_IBCF_A entity
+         *         }
+         *     }
+         */
+            function f_mtc_check_TP_MW_IBCF_INVITE_01(
+                                                      in SipInterfaceMonitor  p_monitorCompRef,
+                                                      in boolean p_checkMessage := false
+                                                      ) runs on ImsTestCoordinator  {
+                if (isvalue(p_monitorCompRef)) {
+                    var charstring v_EUT_A_Addr := f_GetEUTScscfAddress_1();//f_GetEUTScscfAddress(PX_EUT_A);
+                    p_monitorCompRef.start(
+                                           f_Iot_Sip_receive(
+                                                             {
+                                                                 mw_SipRequest(
+                                                                               mdw_TP_MW_IBCF_INVITE_01(
+                                                                                                        (
+                                                                                                         mw_SipUrl_Host(v_EUT_A_Addr) //f_GetEUTScscfIpAddress(PX_EUT_A)
+                                                                                                        )
+                                                                               ))
+                                                             },
+                                                             { mw_SipRequest(mw_INVITE_Request_Base) },
+                                                             {0, omit},
+                                                             "TP_MW_IBCF_INVITE_01 - Request",
+                                                             false,
+                                                             p_checkMessage
+                                                        )
+                                            );
+                    p_monitorCompRef.done;
+                }
+            } // End of function f_mtc_check_TP_MW_IBCF_INVITE_01
+
+    } // End of group imsInvite
+
+    group ims100Trying {
+        
+        /**
+         * @desc Verify that the E-CSCF successfully processes a 100 (Trying) provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_E_CSCF_A entity receives a 100_Trying
+         *         from the IMS_IBCF_A entity
+         *     }
+         *     then {
+         *         the IMS_E_CSCF_A entity sends a 100_Trying
+         *         to the IMS_P_CSCF_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_IBSCF_100Trying_01(
+                                                      in SipInterfaceMonitor p_monitorCompRef,
+                                                      in boolean p_checkMessage := false,
+                                                      in SipMessage p_sip
+                                                      ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                // Check the 100 TRYING
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipResponse(mw_TP_MW_IBCF_100Trying_01(
+                                                                                                      p_sip.request.msgHeader.cSeq,
+                                                                                                      p_sip.request.msgHeader.fromField,
+                                                                                                      p_sip.request.msgHeader.toField
+                                                                          )) 
+                                                         },
+                                                         { mw_SipResponse(mw_100Trying_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_IBCF_100Trying_01",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+            }
+        } // End of function f_mtc_check_TP_MW_IBSCF_100Trying_01
+        
+    } // End of group ims100Trying
+
+    group ims180Ringing {
+        
+        /**
+         * @desc Verify that the E-CSCF successfully processes a 180 (Ringing) provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_E_CSCF_A entity receives a 180_Ringing containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE
+         *             ;
+         *         from the IMS_IBCF_A entity
+         *     }
+         *     then {
+         *         the IMS_E_CSCF_A entity sends a 180_Ringing containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE
+         *             ;
+         *         to the IMS_P_CSCF_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_IBCF_180RINGING_01(
+                                                       in SipInterfaceMonitor p_monitorCompRef,
+                                                       in boolean p_checkMessage := false,
+                                                       in SipMessage p_sip
+                                                       ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                // Check the 180 RINGING
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipResponse(mw_TP_MW_IBCF_180Ringing_01(
+                                                                                                       p_sip.request.msgHeader.cSeq,
+                                                                                                       p_sip.request.msgHeader.fromField,
+                                                                                                       mw_To_NameAddr_TelUrl(
+                                                                                                                             -,
+                                                                                                                             p_sip.request.msgHeader.toField.addressField.addrSpecUnion.components.tel.subscriber
+                                                                          ))) 
+                                                         },
+                                                         { mw_SipResponse(mw_180Ringing_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_IBCF_180RINGING_01",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+            }
+        } // End of function f_mtc_check_TP_MW_IBCF_180RINGING_01
+        
+    } // End of group ims180Ringing
+
+    group ims183SessionProgress {
+        
+        /**
+         * @desc Verify that the E-CSCF successfully processes a 183 (Ringing) provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_E_CSCF_A entity receives a 183_SessionProgress containing
+         *             From indicating value PX_SAP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_SAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE
+         *             ;
+         *         from the IMS_IBCF_A entity
+         *     }
+         *     then {
+         *         the IMS_E_CSCF_A entity sends a 183_SessionProgress containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE
+         *             ;
+         *         to the IMS_P_CSCF_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_IBCF_183SESSION_PROGRESS_01(
+                                                                in SipInterfaceMonitor p_monitorCompRef,
+                                                                in boolean p_checkMessage := false,
+                                                                in SipMessage p_sip
+                                                                ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                // Check the 183 SESSION_PROGRESS
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipResponse(mw_TP_MW_IBCF_183SessionProgress_01(
+                                                                                                               p_sip.request.msgHeader.cSeq,
+                                                                                                               p_sip.request.msgHeader.fromField,
+                                                                                                               p_sip.request.msgHeader.toField
+                                                                                                               )) 
+                                                         },
+                                                         { mw_SipResponse(mw_183SessionProgress_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_IBCF_183SESSION_PROGRESS_01",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+            }
+        } // End of function f_mtc_check_TP_MW_IBCF_183SESSION_PROGRESS_01
+
+    } // End of group ims183SessionProgress
+    
+    group ims200Ok {
+        
+        /**
+         * @desc Verify that the E-CSCF successfully processes a 200 (OK) provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_EP_CSCF_A entity receives a 200_Ok containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE,
+         *             not PChargingVector,
+         *             not PChargingFunctionAddresses,
+         *             not PPreferredIdentity
+         *             ;
+         *         from the IMS_IBCF_A entity
+         *     }
+         *     then {
+         *         the IMS_E_CSCF_A entity sends a 200_Ok containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE,
+         *             PChargingVector,
+         *             PChargingFunctionAddresses,
+         *             PPreferredIdentity
+         *             ;
+         *         to the IMS_P_CSCF_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_IBCF_200OK_01(
+                                                  in SipInterfaceMonitor p_monitorCompRef,
+                                                  in boolean p_checkMessage := false,
+                                                  in SipMessage p_sip
+                                                  ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
+                
+                // Check the 200 OK
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipResponse(mw_200OK(
+                                                                                   p_sip.request.msgHeader.cSeq,
+                                                                                   p_sip.request.msgHeader.callId,
+                                                                                   p_sip.request.msgHeader.fromField,
+                                                                                   (
+                                                                                      mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}),
+                                                                                      mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId),
+                                                                                      p_sip.request.msgHeader.toField
+                                                                                    )
+                                                                                   )) 
+                                                         },
+                                                         { mw_SipResponse(mw_200OK_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_IBCF_200OK_01",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+                
+            }
+        } // End of function f_mtc_check_TP_MW_IBCF_200OK_01
+        
+    } // End of group ims200Ok
+    
+    group imsAck {
+        
+        /**
+         * @desc Verify that the E-CSCF successfully processes a ACK provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_E_CSCF_A entity receives an ACK containing
+         *             From indicating value PX_UE_A_SIP_URI,
+         *             To indicating value PX_PSAP_SIP_URI,
+         *             CallId indicating value PX_UE_A_CALLID,
+         *             Via indicating value PX_UE_A_VIA,
+         *             Route indicating value PX_UE_A_SERVICE_ROUTE
+         *             ;
+         *         from the IMS_P_CSCF_A entity
+         *     }
+         *     then {
+         *         the IMS_E_CSCF_A entity sends an ACK containing
+         *             From indicating value PX_UE_A_SIP_URI,
+         *             To indicating value PX_PSAP_SIP_URI,
+         *             CallId indicating value PX_UE_A_CALLID,
+         *             Via indicating value PX_UE_A_VIA,
+         *             Route indicating value PX_UE_A_SERVICE_ROUTE
+         *             ;
+         *         from the IMS_IBCF_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_IBCF_ACK_01(
+                                                in SipInterfaceMonitor p_monitorCompRef,
+                                                in boolean p_checkMessage := false,
+                                                in SipMessage p_sip
+                                                ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                // Check the ACK
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipRequest(mw_TP_MW_IBCF_ACK_01(
+                                                                                               p_sip.request.msgHeader.callId,
+                                                                                               p_sip.request.msgHeader.cSeq,
+                                                                                               -, // FIXME To be set
+                                                                                               p_sip.request.msgHeader.fromField,
+                                                                                               p_sip.request.msgHeader.toField
+                                                                                               )) 
+                                                         },
+                                                         { mw_SipRequest(mw_ACK_Request_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_IBCF_ACK_01 - Request",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+            }
+        } // End of function f_mtc_check_TP_MW_IBCF_ACK_01
+        
+    } // End of group imsAck
+    
+} // End of module AtsImsIot_TP_behavior_MW_EB
\ No newline at end of file
diff --git a/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EC.ttcn b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EC.ttcn
new file mode 100644
index 0000000..83ca8b7
--- /dev/null
+++ b/ttcn/AtsImsIot/AtsImsIot_TP_behavior_MW_EC.ttcn
@@ -0,0 +1,433 @@
+/**
+ *  @author     TTF T010
+ *  @version    $Id$
+ *  @desc       This module provides the TP behaviour functions at Mw interface at P-CSCF/E-CSCF
+ */
+
+module AtsImsIot_TP_behavior_MW_EC {
+
+    // LibIms
+    import from LibIms_Templates all;
+    import from LibIms_UpperTester all;
+    // LibIot
+    import from LibIot_TypesAndValues all;
+    import from LibIot_Functions all;
+    import from LibIot_TestInterface all;
+    import from LibIot_PIXITS all;
+    // LibSip
+    import from LibSip_SIPTypesAndValues all;
+    import from LibSip_Templates all;
+    import from LibSip_Common all;
+    import from LibSip_SDPTypes all;
+    // LibMsrp
+    import from LibMsrp_TypesAndValues all;
+    import from LibMsrp_Functions all;
+    import from LibMsrp_Templates all;
+    // AtsImsIot
+    import from AtsImsIot_TestSystem all;
+    import from AtsImsIot_Templates_MW all;
+    import from AtsImsIot_Templates all;
+    import from AtsImsIot_TypesAndValues all;
+    import from AtsImsIot_Functions all;
+
+    group imsInvite {
+        
+        /**
+         * @desc Verify that the P-CSCF successfully processes an initial INVITE (Originating Leg)..
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_P_CSCF_A entity receives an INVITE containing
+         *             From indicating value PX_UE_A_SIP_URI,
+         *             To indicating value PX_PSAP_SIP_URI,
+         *             CallId indicating value PX_UE_A_CALLID,
+         *             Via indicating value PX_UE_A_VIA,
+         *             Route indicating value PX_UE_A_SERVICE_ROUTE,
+         *             PAccessNetworkInfo,
+         *             MessageBody containing
+         *                 SDP containing
+         *                     Version indicating value "0" 
+         *                         ;
+         *             ;;
+         *         from the UE_A entity
+         *     }
+         *     then {
+         *         the IMS_P_CSCF_A entity sends an INVITE containing
+         *             From indicating value PX_UE_A_SIP_URI,
+         *             To indicating value PX_PSAP_SIP_URI,
+         *             CallId indicating value PX_UE_A_CALLID,
+         *             Via indicating value PX_UE_A_VIA,
+         *             Route indicating value PX_UE_A_SERVICE_ROUTE,
+         *             PAccessNetworkInfo,
+         *             MessageBody containing
+         *                 SDP containing
+         *                     Version indicating value "0" 
+         *                         ;
+         *             ;;
+         *         to the IMS_EBCF_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_ECSCF_INVITE_01(
+                                                   in SipInterfaceMonitor p_monitorCompRef,
+                                                   in boolean p_checkMessage := false,
+                                                   out SipMessage p_sip
+                                                   ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                var ImsUserInfo v_userInfoA := f_getTelUserId(PX_EUT_A);
+                var ImsUserInfo v_userInfoB := f_getTelUserId(PX_PSAP);
+                
+                // Check the INVITE
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                        { mw_SipRequest(mw_TP_MW_ECSCF_INVITE_01(
+                                                                                                 -, // FIXME Set expected value
+                                                                                                 mw_From_AddrUnion_TelUrl(-), // v_userInfoA.publicId
+                                                                                                 mw_To_AddrUnion_TelUrl(-) // v_userInfoB.publicId
+                                                                                                 ))
+                                                        },
+                                                        { mw_SipRequest(mw_INVITE_Request_Base) },
+                                                        {0, omit},
+                                                        "TP_MW_ECSCF_INVITE_01 - Request",
+                                                        true,
+                                                        p_checkMessage
+                                                        )
+                                       );
+                p_monitorCompRef.done;
+                // Retrieve messge
+                f_getSipMsgFromMonitor(p_monitorCompRef, p_sip);
+                log("##### p_sip: ", p_sip);
+            }
+        } // End of function f_mtc_check_TP_MW_ECSCF_INVITE_01
+
+    } // End of group imsInvite
+
+    group ims100Trying {
+        
+        /**
+         * @desc Verify that the P-CSCF successfully processes a 100 (Trying) provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_P_CSCF_A entity receives a 100_Trying
+         *         from the IMS_E_CSCF_A entity
+         *     }
+         *     then {
+         *         the IMS_P_CSCF_A entity sends a 100_Trying
+         *         to the UE_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_ECSCF_100Trying_01(
+                                                      in SipInterfaceMonitor p_monitorCompRef,
+                                                      in boolean p_checkMessage := false,
+                                                      in SipMessage p_sip
+                                                      ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                // Check the 100 TRYING
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipResponse(mw_TP_MW_ECSCF_100Trying_01(
+                                                                                                      p_sip.request.msgHeader.cSeq,
+                                                                                                      p_sip.request.msgHeader.fromField,
+                                                                                                      p_sip.request.msgHeader.toField
+                                                                          )) 
+                                                         },
+                                                         { mw_SipResponse(mw_100Trying_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_ECSCF_100Trying_01",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+            }
+        } // End of function f_mtc_check_TP_MW_ECSCF_100Trying_01
+        
+    } // End of group ims100Trying
+   
+    group ims180Ringing {
+        
+        /**
+         * @desc Verify that the P-CSCF successfully processes a 180 (Ringing) provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_P_CSCF_A entity receives a 180_Ringing containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE
+         *             ;
+         *         from the IMS_E_CSCF_A entity
+         *     }
+         *     then {
+         *         the IMS_P_CSCF_A entity sends a 180_Ringing containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE
+         *             ;
+         *         to the UE_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_ECSCF_180RINGING_01(
+                                                       in SipInterfaceMonitor p_monitorCompRef,
+                                                       in boolean p_checkMessage := false,
+                                                       in SipMessage p_sip
+                                                       ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                // Check the 180 RINGING
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipResponse(mw_TP_MW_ECSCF_180Ringing_01(
+                                                                                                       p_sip.request.msgHeader.cSeq,
+                                                                                                       p_sip.request.msgHeader.fromField,
+                                                                                                       mw_To_NameAddr_TelUrl(
+                                                                                                                             -,
+                                                                                                                             p_sip.request.msgHeader.toField.addressField.addrSpecUnion.components.tel.subscriber
+                                                                          ))) 
+                                                         },
+                                                         { mw_SipResponse(mw_180Ringing_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_ECSCF_180RINGING_01",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+            }
+        } // End of function f_mtc_check_TP_MW_ECSCF_180RINGING_01
+        
+    } // End of group ims180Ringing
+    
+    group ims183SessionProgress {
+        
+        /**
+         * @desc Verify that the P-CSCF successfully processes a 183 (Ringing) provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_P_CSCF_A entity receives a 183_SessionProgress containing
+         *             From indicating value PX_SAP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_SAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE
+         *             ;
+         *         from the IMS_E_CSCF_A entity
+         *     }
+         *     then {
+         *         the IMS_P_CSCF_A entity sends a 183_SessionProgress containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE
+         *             ;
+         *         to the UE_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_ECSCF_183SESSION_PROGRESS_01(
+                                                                in SipInterfaceMonitor p_monitorCompRef,
+                                                                in boolean p_checkMessage := false,
+                                                                in SipMessage p_sip
+                                                                ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                // Check the 183 SESSION_PROGRESS
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipResponse(mw_TP_MW_ECSCF_183SessionProgress_01(
+                                                                                                               p_sip.request.msgHeader.cSeq,
+                                                                                                               p_sip.request.msgHeader.fromField,
+                                                                                                               p_sip.request.msgHeader.toField
+                                                                                                               )) 
+                                                         },
+                                                         { mw_SipResponse(mw_183SessionProgress_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_ECSCF_183SESSION_PROGRESS_01",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+            }
+        } // End of function f_mtc_check_TP_MW_ECSCF_183SESSION_PROGRESS_01
+
+    } // End of group ims183SessionProgress
+    
+    group ims200Ok {
+        
+        /**
+         * @desc Verify that the P-CSCF successfully processes a 200 (OK) provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_P_CSCF_A entity receives a 200_Ok containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE,
+         *             not PChargingVector,
+         *             not PChargingFunctionAddresses,
+         *             not PPreferredIdentity
+         *             ;
+         *         from the IMS_E_CSCF_A entity
+         *     }
+         *     then {
+         *         the IMS_P_CSCF_A entity sends a 200_Ok containing
+         *             From indicating value PX_PSAP_SIP_URI,
+         *             To indicating value PX_UE_A_SIP_URI,
+         *             CallId indicating value PX_PSAP_CALLID,
+         *             Via indicating value PX_PSAP_VIA,
+         *             Route indicating value PX_PSAP_SERVICE_ROUTE,
+         *             PChargingVector,
+         *             PChargingFunctionAddresses,
+         *             PPreferredIdentity
+         *             ;
+         *         to the UE_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_ECSCF_200OK_01(
+                                                  in SipInterfaceMonitor p_monitorCompRef,
+                                                  in boolean p_checkMessage := false,
+                                                  in SipMessage p_sip
+                                                  ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                var ImsUserInfo v_userInfoB := f_getSipUserId(PX_EUT_B);
+                
+                // Check the 200 OK
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipResponse(mw_200OK(
+                                                                                   p_sip.request.msgHeader.cSeq,
+                                                                                   p_sip.request.msgHeader.callId,
+                                                                                   p_sip.request.msgHeader.fromField,
+                                                                                   (
+                                                                                      mw_To_NameAddr_TelUrl({quotedString:=f_getSipUserId(PX_EUT_B).publicId}),
+                                                                                      mw_To_AddrUnion_TelUrl(f_getTelUserId(PX_EUT_B).publicId),
+                                                                                      p_sip.request.msgHeader.toField
+                                                                                    )
+                                                                                   )) 
+                                                         },
+                                                         { mw_SipResponse(mw_200OK_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_ECSCF_200OK_01",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+                
+            }
+        } // End of function f_mtc_check_TP_MW_ECSCF_200OK_01
+        
+    } // End of group ims200Ok
+    
+    group imsAck {
+        
+        /**
+         * @desc Verify that the P-CSCF successfully processes a ACK provisional response on initial INVITE (Originating Leg).
+         * Initial conditions with {
+         *     the UE_A entity isAttachedTo the EPC_A and
+         *     the PSAP entity isAttachedTo the EPC_B and
+         *     the UE_A entity isRegisteredTo the IMS_A and
+         *     the PSAP entity isRegisteredTo the IMS_B
+         * }
+         * 
+         * Expected behaviour
+         * ensure that {
+         *     when {
+         *         the IMS_P_CSCF_A entity receives an ACK containing
+         *             From indicating value PX_UE_A_SIP_URI,
+         *             To indicating value PX_PSAP_SIP_URI,
+         *             CallId indicating value PX_UE_A_CALLID,
+         *             Via indicating value PX_UE_A_VIA,
+         *             Route indicating value PX_UE_A_SERVICE_ROUTE
+         *             ;
+         *         from the UE_A entity
+         *     }
+         *     then {
+         *         the IMS_P_CSCF_A entity sends an ACK containing
+         *             From indicating value PX_UE_A_SIP_URI,
+         *             To indicating value PX_PSAP_SIP_URI,
+         *             CallId indicating value PX_UE_A_CALLID,
+         *             Via indicating value PX_UE_A_VIA,
+         *             Route indicating value PX_UE_A_SERVICE_ROUTE
+         *             ;
+         *         from the IMS_E_CSCF_A entity
+         *         }
+         *     }
+         */
+        function f_mtc_check_TP_MW_ECSCF_ACK_01(
+                                                in SipInterfaceMonitor p_monitorCompRef,
+                                                in boolean p_checkMessage := false,
+                                                in SipMessage p_sip
+                                                ) runs on ImsTestCoordinator {
+            if (isvalue(p_monitorCompRef)) {
+                // Check the ACK
+                p_monitorCompRef.start(
+                                       f_Iot_Sip_receive(
+                                                         { mw_SipRequest(mw_TP_MW_ECSCF_ACK_01(
+                                                                                               p_sip.request.msgHeader.callId,
+                                                                                               p_sip.request.msgHeader.cSeq,
+                                                                                               -, // FIXME To be set
+                                                                                               p_sip.request.msgHeader.fromField,
+                                                                                               p_sip.request.msgHeader.toField
+                                                                                               )) 
+                                                         },
+                                                         { mw_SipRequest(mw_ACK_Request_Base) },
+                                                         { 0, omit },
+                                                         "TP_MW_ECSCF_ACK_01 - Request",
+                                                         false,
+                                                         p_checkMessage
+                                                         )
+                                        );
+                p_monitorCompRef.done;
+            }
+        } // End of function f_mtc_check_TP_MW_ECSCF_ACK_01
+        
+    } // End of group imsAck
+    
+} // End of module AtsImsIot_TP_behavior_MW_EC
\ No newline at end of file
diff --git a/ttcn/AtsImsIot/AtsImsIot_Templates_MW.ttcn b/ttcn/AtsImsIot/AtsImsIot_Templates_MW.ttcn
index 4d82cc0..64b7ee0 100644
--- a/ttcn/AtsImsIot/AtsImsIot_Templates_MW.ttcn
+++ b/ttcn/AtsImsIot/AtsImsIot_Templates_MW.ttcn
@@ -891,4 +891,261 @@ module AtsImsIot_Templates_MW {
         
     } // End of group g_icscf
     
+    group g_ecscf {
+
+        template (present) INVITE_Request mw_TP_MW_ECSCF_INVITE_01(
+                                                                   template (present) SipUrl p_invite_uri := ?,
+                                                                   template (present) From p_from := ?,
+                                                                   template (present) To p_to := ?
+        ) modifies mw_INVITE_Request_Base := {
+            requestLine := {
+                method := INVITE_E,
+                requestUri := p_invite_uri, // @TODO
+                sipVersion := c_sipNameVersion
+            },
+            msgHeader := {
+                fromField := p_from,
+                toField := p_to
+            }
+        } // End of template mw_TP_MW_ECSCF_INVITE_01
+        
+        template (present) INVITE_Request mw_TP_MW_ECSCF_INVITE_02( // TODO To be enforced
+                                                                   template (present) SipUrl p_invite_uri := ?,
+                                                                   template (present) From p_from := ?,
+                                                                   template (present) To p_to := ?
+                                                                   ) modifies mw_TP_MW_ECSCF_INVITE_01 := {
+        } // End of template mw_TP_MW_ECSCF_INVITE_02
+
+        
+        template (present) INVITE_Request mw_TP_MW_ECSCF_RE_INVITE_01( // TODO To be enforced
+                                                                      template (present) SipUrl p_invite_uri := ?,
+                                                                      template (present) From p_from := ?,
+                                                                      template (present) To p_to := ?
+                                                                      ) modifies mw_TP_MW_ECSCF_INVITE_01 := {
+        } // End of template mw_TP_MW_ECSCF_RE_INVITE_01
+        
+        template (present) INVITE_Request mw_TP_MW_ECSCF_RE_INVITE_02( // TODO To be enforced
+                                                                      template (present) SipUrl p_invite_uri := ?,
+                                                                      template (present) From p_from := ?,
+                                                                      template (present) To p_to := ?
+                                                                      ) modifies mw_TP_MW_ECSCF_INVITE_01 := {
+        } // End of template mw_TP_MW_ECSCF_RE_INVITE_02
+        
+        template (present) Response mw_TP_MW_ECSCF_100Trying_01(
+                                                                template (present) CSeq p_cSeq := ?,
+                                                                template (present) From p_from := ?,
+                                                                template (present) To p_to := ?
+                                                                ) modifies mw_100Trying_Base := {
+            msgHeader := {
+                cSeq      := p_cSeq,
+                fromField := p_from,
+                toField   := p_to
+            }
+        } // End of template mw_TP_MW_ECSCF_100Trying_01
+        
+        template (present) Response mw_TP_MW_ECSCF_100Trying_02(
+                                                                template (present) CSeq p_cSeq := ?,
+                                                                template (present) From p_from := ?,
+                                                                template (present) To p_to := ?
+                                                                ) modifies mw_TP_MW_ECSCF_100Trying_01 := {
+        } // End of template mw_TP_MW_ECSCF_100Trying_02
+        
+        template (present) Response mw_TP_MW_ECSCF_180Ringing_01(
+                                                                 template (present) CSeq p_cSeq := ?,
+                                                                 template (present) From p_from := ?,
+                                                                 template (present) To p_to := ?
+                                                                 ) modifies mw_180Ringing_Base := {
+            msgHeader := {
+                cSeq      := p_cSeq,
+                fromField := p_from,
+                toField   := p_to
+            }
+        } // End of template mw_TP_MW_ECSCF_180Ringing_01
+        
+        template (present) Response mw_TP_MW_ECSCF_180Ringing_02(
+                                                                 template (present) CSeq p_cSeq := ?,
+                                                                 template (present) From p_from := ?,
+                                                                 template (present) To p_to := ?
+                                                                 ) modifies mw_TP_MW_ECSCF_180Ringing_01 := {
+        } // End of template mw_TP_MW_ECSCF_180Ringing_02
+        
+        template (present) Response mw_TP_MW_ECSCF_183SessionProgress_01(
+                                                                 template (present) CSeq p_cSeq := ?,
+                                                                 template (present) From p_from := ?,
+                                                                 template (present) To p_to := ?
+                                                                 ) modifies mw_183SessionProgress_Base := {
+            msgHeader := {
+                cSeq      := p_cSeq,
+                fromField := p_from,
+                toField   := p_to
+            }
+        } // End of template mw_TP_MW_ECSCF_183SessionProgress_01
+        
+        template (present) Response mw_TP_MW_ECSCF_183SessionProgress_02(
+                                                                 template (present) CSeq p_cSeq := ?,
+                                                                 template (present) From p_from := ?,
+                                                                 template (present) To p_to := ?
+                                                                 ) modifies mw_TP_MW_ECSCF_183SessionProgress_01 := {
+        } // End of template mw_TP_MW_ECSCF_183SessionProgress_02
+        
+        template (present) ACK_Request mw_TP_MW_ECSCF_ACK_01( // TODO To be enforced
+                                                             template (present) CallId p_callId := ?,
+                                                             template (present) CSeq p_cSeq := ?,
+                                                             template (present) SipUrl p_ack_uri := ?,
+                                                             template (present) From p_from := ?,
+                                                             template (present) To p_to := ?
+                                                             ) modifies mw_ACK_Request_Base := {
+            requestLine := {
+                method := ACK_E,
+                requestUri := p_ack_uri, // @TODO
+                sipVersion := c_sipNameVersion
+            },
+            msgHeader := {
+                callId := p_callId,
+                fromField := p_from,
+                toField := p_to,
+                route := {
+                    fieldName := ROUTE_E,
+                    routeBody := {
+                        *, 
+                        ?,
+                        *
+                    }
+                }
+            }
+        } // End of template mw_TP_MW_ECSCF_ACK_01
+        
+        template (present) ACK_Request mw_TP_MW_ECSCF_ACK_02( // TODO To be enforced
+                                                             template (present) CallId p_callId := ?,
+                                                             template (present) CSeq p_cSeq := ?,
+                                                             template (present) SipUrl p_ack_uri := ?,
+                                                             template (present) From p_from := ?,
+                                                             template (present) To p_to := ?
+                                                             ) modifies mw_TP_MW_ECSCF_ACK_01 := {
+            msgHeader := {
+                route := omit
+            }
+        } // End of template mw_TP_MW_ECSCF_ACK_02
+
+    }
+
+    group g_ibcf {
+
+        /**
+          * @desc INVITE Request checking TP_MW_IBCF_INVITE_01
+          */
+         template(present)  INVITE_Request mdw_TP_MW_IBCF_INVITE_01 (template (present) SipUrl p_ECSCF_SIP_URI := ?,
+                                                                     template (present) From p_from := ?,
+                                                                     template (present) To p_to := ?)
+          modifies mw_INVITE_Request_Base := {
+           msgHeader := {
+             fromField := p_from,
+             toField := p_to,
+             route := ({
+                 fieldName := ROUTE_E,
+                 routeBody := {
+                     *, 
+                     complement(mw_routeBody(p_ECSCF_SIP_URI)),
+                     *
+                 }
+             }, omit),
+             recordRoute := {
+                 fieldName := RECORD_ROUTE_E,
+                 routeBody := {mw_routeBody(p_ECSCF_SIP_URI), *}             
+             },        
+             pChargingVector := {
+                 fieldName := P_CHARGING_VECTOR_E,
+                 chargeParams := {
+                     *,
+//                     {id := "icid-value", paramValue := ?},
+                     *,
+                     {id := "orig-ioi", paramValue := ?},
+                     *,
+//                     complement({id := "term-ioi", paramValue := ?}),
+                     *,
+                     complement({id := "access-network-charging-info", paramValue := ?}),
+                     *
+                 }
+             },
+            pAccessNetworkInfo := omit
+           }
+         }
+
+        template (present) Response mw_TP_MW_IBCF_100Trying_01(
+                                                                template (present) CSeq p_cSeq := ?,
+                                                                template (present) From p_from := ?,
+                                                                template (present) To p_to := ?
+                                                                ) modifies mw_100Trying_Base := {
+            msgHeader := {
+                cSeq      := p_cSeq,
+                fromField := p_from,
+                toField   := p_to
+            }
+        } // End of template mw_TP_MW_IBCF_100Trying_01
+        
+        template (present) Response mw_TP_MW_IBCF_180Ringing_01(
+                                                                 template (present) CSeq p_cSeq := ?,
+                                                                 template (present) From p_from := ?,
+                                                                 template (present) To p_to := ?
+                                                                 ) modifies mw_180Ringing_Base := {
+            msgHeader := {
+                cSeq      := p_cSeq,
+                fromField := p_from,
+                toField   := p_to
+            }
+        } // End of template mw_TP_MW_IBCF_180Ringing_01
+        
+        template (present) Response mw_TP_MW_IBCF_183SessionProgress_01(
+                                                                 template (present) CSeq p_cSeq := ?,
+                                                                 template (present) From p_from := ?,
+                                                                 template (present) To p_to := ?
+                                                                 ) modifies mw_183SessionProgress_Base := {
+            msgHeader := {
+                cSeq      := p_cSeq,
+                fromField := p_from,
+                toField   := p_to
+            }
+        } // End of template mw_TP_MW_IBCF_183SessionProgress_01
+    
+        template (present) ACK_Request mw_TP_MW_IBCF_ACK_01( // TODO To be enforced
+                                                             template (present) CallId p_callId := ?,
+                                                             template (present) CSeq p_cSeq := ?,
+                                                             template (present) SipUrl p_ack_uri := ?,
+                                                             template (present) From p_from := ?,
+                                                             template (present) To p_to := ?
+                                                             ) modifies mw_ACK_Request_Base := {
+            requestLine := {
+                method := ACK_E,
+                requestUri := p_ack_uri, // @TODO
+                sipVersion := c_sipNameVersion
+            },
+            msgHeader := {
+                callId := p_callId,
+                fromField := p_from,
+                toField := p_to,
+                route := {
+                    fieldName := ROUTE_E,
+                    routeBody := {
+                        *, 
+                        ?,
+                        *
+                    }
+                }
+            }
+        } // End of template mw_TP_MW_IBCF_ACK_01
+        
+        template (present) ACK_Request mw_TP_MW_IBCF_ACK_02( // TODO To be enforced
+                                                             template (present) CallId p_callId := ?,
+                                                             template (present) CSeq p_cSeq := ?,
+                                                             template (present) SipUrl p_ack_uri := ?,
+                                                             template (present) From p_from := ?,
+                                                             template (present) To p_to := ?
+                                                             ) modifies mw_TP_MW_IBCF_ACK_01 := {
+            msgHeader := {
+                route := omit
+            }
+        } // End of template mw_TP_MW_IBCF_ACK_02
+
+    }
+
 } // End of module AtsImsIot_Templates_MW 
\ No newline at end of file
-- 
GitLab