diff --git a/SCCP_Test/SCCP_Testcases.cfg b/SCCP_Test/SCCP_Testcases.cfg
new file mode 100644
index 0000000..ce35486
--- /dev/null
+++ b/SCCP_Test/SCCP_Testcases.cfg
@@ -0,0 +1,54 @@
+[LOGGING]
+#FileName := "SCCP_selftest.cfg"
+FileMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING
+#ConsoleMask := LOG_ALL
+#ConsoleMask := TTCN_TESTCASE | TTCN_PORTEVENT | TTCN_DEBUG | TTCN_MATCHING 
+#ConsoleMask :=  TTCN_WARNING | TTCN_ERROR | TTCN_TESTCASE | TTCN_STATISTICS | TTCN_PORTEVENT
+#ConsoleMask := LOG_ALL | TTCN_DEBUG | TTCN_MATCHING 
+LogSourceInfo := Yes
+
+[EXECUTE]
+#SCCP_selftest.tc_ConnlessSendingShortASP
+#SCCP_selftest.tc_ConnlessSendingLongASP
+#SCCP_selftest.tc_ConnOrientedShortASPSending
+#SCCP_Testcases.tc_ConnlessSendingLongASP
+SCCP_Testcases.tc_ConnOrientedShortASPSending
+
+[TESTPORT_PARAMETERS]
+
+system.sctp.debug := "yes"
+
+//see documentation (User guide) for the parameters)
+
+
+[MODULE_PARAMETERS]
+
+M3UA_Emulation.tsp_logVerbose := true;
+M3UA_Emulation.tsp_M3UA_Server_Mode := false;
+SCCP_Testcases.tsp_address :=
+{
+  local_sctp_port   := 2905,
+  local_ip_addr  := "10.6.70.19",
+  remote_sctp_port  := 2905,
+  remote_ip_addr := "159.107.193.33"
+}
+
+
+SCCP_Testcases.tsp_own_GT := '14377760'H
+SCCP_Testcases.tsp_remote_GT := '14375760'H
+SCCP_Testcases.tsp_SSN := 8 //8:MSC 5:MAP see 3.4.2.2/Q.713
+SCCP_Testcases.tsp_SIO := '83'O //SCCP national
+SCCP_Testcases.tsp_own_SPC := 2351
+SCCP_Testcases.tsp_remote_SPC := 2300// max value on 14 bits
+SCCP_Testcases.tsp_SLS := 0
+#[tsp_sccp_serviceType := "mtp3_itu" |"mtp3b_itu"|"mtp3_ansi"|"mtp3b_ansi"|  "mtp3b_tcc"]
+SCCP_Testcases.tsp_sccp_serviceType := "mtp3_ttc"
+
+#for mtp3_itu/gti0011 or mtp3_ansi/gti0001 :
+#tsp_translationType := 7
+SCCP_Emulation.tsp_SIF_MaxLength := 272
+SCCP_Emulation.tsp_force_xudt := 0 // 1:yes, 0:no 
+
+[MAIN_CONTROLLER]
+//TCPPort := 7145
+//NumHCs := 1
diff --git a/SCCP_Test/SCCP_Testcases.ttcn b/SCCP_Test/SCCP_Testcases.ttcn
new file mode 100644
index 0000000..0cf1c7a
--- /dev/null
+++ b/SCCP_Test/SCCP_Testcases.ttcn
@@ -0,0 +1,505 @@
+///////////////////////////////////////////////////////////////////////////////
+//
+//
+// Copyright Test Competence Center (TCC) ETH 2007
+//
+//
+//
+// The copyright to the computer  program(s) herein  is the property of TCC. //
+// The program(s) may be used and/or copied only with the written permission //
+// of TCC or in accordance with  the terms and conditions  stipulated in the //
+// agreement/contract under which the program(s) have been supplied
+//
+//
+//
+///////////////////////////////////////////////////////////////////////////////
+//
+//  File: 		    SCCP_TestCases.ttcn
+//  Description:  SS7 SCCP basic SEA test
+//                according to specification ITU-T SS7 SCCP, ANSI ..., TCC ... 
+//  References:   ITU-T: Recommendation Q.711-Q.714, 
+//                ANSI  T1.112-2001, 
+//                TCC   
+//  Rev:          <RnXnn>
+//  Updated:	    2007.04.12
+//  Contact:      http://ttcn.ericsson.se
+//
+
+
+
+
+//Note : this has been modified to include M3UA Emulation and SCTP Test port  
+//Elemer Lelik 12.04.2017
+
+
+
+module SCCP_Testcases
+{//startmodule
+
+modulepar 
+{
+  hexstring tsp_own_GT := '0614377760'H;
+  hexstring tsp_remote_GT := '0614375760'H;
+  integer tsp_SSN := 2; //8:MSC 5:MAP see 3.4.2.2/Q.713
+  octetstring tsp_SIO := '83'O;//SCCP national
+  integer tsp_own_SPC := 461087; // =0x07091E 
+  integer tsp_remote_SPC := 461086; // =0x07091D
+  integer tsp_SLS := 0;
+  charstring tsp_sccp_serviceType := "mtp3_itu";
+  
+  octetstring MTP3_UserPart_SIO;
+  integer MTP3_UserPart_OPC,
+          MTP3_UserPart_DPC,
+          MTP3_UserPart_SLS
+
+
+  SCTP_Association_Address tsp_address := { 0, "", 0, "" };
+
+}//modulepar
+
+import from General_Types all;
+
+import from M3UA_Types all;
+import from M3UA_Emulation all;
+
+import from MTP3asp_Types all;
+import from MTP3asp_PortType all;
+
+
+import from SCCPasp_Types  all;
+import from SCCP_Types  all;
+import from SCCP_Emulation all;
+
+
+import from SCTPasp_Types all;
+import from SCTPasp_PortType  all;
+
+
+
+
+/*************************************
+*   Components
+**************************************/
+
+
+// Model of MSC:
+type component system_CT {
+ 
+     port SCTPasp_PT           sctp;        
+
+   
+};
+
+
+
+
+// Main test component with behaviour SCCPuserA andSCCPuserB
+type component MTC_CT {
+  var SCCP_PAR_Address v_CalledAddress, v_CallingAddress;
+  var integer v_testvalue;
+  var SCCP_CT vc_SCCP_A ;
+
+  var M3UA_CT vc_M3UA ;
+
+  var MSC_SCCP_MTP3_parameters v_BootA;  
+  var SCCP_PAR_Connection_Id v_cid_A ;
+  
+  port SCCPasp_PT A_PORT; //SCCPuserA   
+}
+
+function initBootParams() runs on MTC_CT 
+{
+  v_BootA :=
+  { sio:=
+    { ni:= substr(oct2bit(tsp_SIO),0,2),
+      prio:= substr(oct2bit(tsp_SIO),2,2),
+      si:= substr(oct2bit(tsp_SIO),4,4)
+    },
+    opc:=tsp_own_SPC,
+    dpc:=tsp_remote_SPC, 
+    sls:=tsp_SLS, 
+    sccp_serviceType:=tsp_sccp_serviceType,
+    ssn:= tsp_SSN
+  };
+  return;
+} //initBootParams
+
+function init() runs on MTC_CT //system system_CT
+{
+  initBootParams();
+  log("v_BootA:",v_BootA);
+   
+  // Protocol Stack  creation & connections:
+  vc_SCCP_A:=SCCP_CT.create;
+  vc_M3UA:=M3UA_CT.create;
+
+  connect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT);
+  connect(vc_M3UA:MTP3_SP_PORT,vc_SCCP_A:MTP3_SCCP_PORT);
+  map(vc_M3UA:SCTP_PORT,system:sctp); 
+  
+  vc_M3UA.start(f_M3UA_Emulation(tsp_address));
+  vc_SCCP_A.start( SCCPStart( v_BootA ) ); // Bootparameters 
+
+ 
+  log( "init() is done");
+  
+}// init
+
+function terminate( ) runs on MTC_CT //system system_CT
+{
+  log( "terminate() started");
+  /*while( all component.running != true )
+  {
+    //waits
+  }*/
+    all component.stop;
+
+  unmap(vc_M3UA:SCTP_PORT,system:sctp); 
+  disconnect(vc_M3UA:MTP3_SP_PORT,vc_SCCP_A:MTP3_SCCP_PORT); 
+  disconnect(self:A_PORT,vc_SCCP_A:SCCP_SP_PORT);
+
+  
+    log(" all components stopped");
+    self.stop;
+} //terminate
+
+// function getOddEven returns '0' 
+// if even number of dec digit can be found in GT see Q.713
+function getOddEven( in hexstring pl_GT) return bitstring
+{
+   return int2bit( (lengthof(pl_GT) mod 2) ,1);
+}
+
+function getOddEven_ansi( in hexstring pl_GT) return bitstring
+{
+   if( (lengthof(pl_GT) mod 2) == 0 ) { return '0010'B;} //even
+   else { return '0001'B;} //odd
+}
+
+//******************************************************************
+//function setAddresses_gti0001() runs on MTC_CT
+// Sets CalledAddress and CallingAddress as a gti001-type address
+// according to the cfg file.
+//******************************************************************
+
+function setAddresses_gti0001() runs on MTC_CT
+{
+    if( (tsp_sccp_serviceType == "mtp3_itu") or 
+        (tsp_sccp_serviceType == "mtp3b_itu") or
+        (tsp_sccp_serviceType == "mtp3_ttc") or
+        (tsp_sccp_serviceType == "mtp3b_ttc")
+      ) {
+      v_CalledAddress :={ 
+        addressIndicator  := {
+          pointCodeIndic := '1'B,
+          ssnIndicator := '1'B,
+          globalTitleIndic := '0001'B,
+          routingIndicator := '0'B
+        },//addressIndicator
+        signPointCode     := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn 
+        subsystemNumber   := tsp_SSN,
+        globalTitle := {
+          gti0001:= {
+            natureOfAddress := '0000011'B,
+            oddeven := getOddEven( tsp_remote_GT ),
+            globalTitleAddress := tsp_remote_GT
+          }
+        }//globalTitle
+      } // v_CalledAddress
+    
+      v_CallingAddress :={ 
+        addressIndicator  := {
+          pointCodeIndic := '1'B,
+          ssnIndicator := '1'B,
+          globalTitleIndic := '0001'B,
+          routingIndicator := '0'B
+        },//addressIndicator
+        signPointCode     := SCCP_SPC_int2bit(tsp_own_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn 
+        subsystemNumber   := tsp_SSN,
+        globalTitle:= { 
+          gti0001 := {
+            natureOfAddress := '0000011'B,
+            oddeven := getOddEven( tsp_own_GT ), 
+            globalTitleAddress := tsp_own_GT
+          }
+        }//globalTitle
+      } // v_CallingAddress
+      
+    } else if(
+        (tsp_sccp_serviceType == "mtp3_ansi") or
+        (tsp_sccp_serviceType == "mtp3b_ansi")          
+      ) {
+      
+      v_CalledAddress :={ 
+        addressIndicator  := {
+          pointCodeIndic := '1'B,
+          ssnIndicator := '1'B,
+          globalTitleIndic := '0001'B,
+          routingIndicator := '0'B
+        },//addressIndicator
+        signPointCode     := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn 
+        subsystemNumber   := tsp_SSN,
+        globalTitle := {
+          gti0011:= {
+            translationType   := int2oct(7,1),
+            encodingScheme    := getOddEven_ansi( tsp_remote_GT ),        
+            numberingPlan     := '0111'B,  //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1            
+            globalTitleAddress:= tsp_remote_GT
+          }
+        }//globalTitle
+      } // v_CalledAddress
+      
+      v_CallingAddress :={ 
+        addressIndicator  := {
+          pointCodeIndic := '1'B,
+          ssnIndicator := '1'B,
+          globalTitleIndic := '0001'B,
+          routingIndicator := '0'B
+        },//addressIndicator
+        signPointCode     := SCCP_SPC_int2bit(tsp_remote_SPC, tsp_sccp_serviceType, tsp_SIO), // see SCCP.ttcn 
+        subsystemNumber   := tsp_SSN,
+        globalTitle := {
+          gti0011:= {
+            translationType   := int2oct(7,1),
+            encodingScheme    := getOddEven_ansi( tsp_own_GT ),        
+            numberingPlan     := '0111'B,  //ISDN/mobile numbering plan, see T1.112.3-2001/3.4.2.3.1            
+            globalTitleAddress:= tsp_own_GT
+          }
+        }//globalTitle
+      } // v_CallingAddress
+    }//if
+    
+}//setAddresses_gti001
+
+function f_SendAndReceive1N_UNITDATA(in octetstring pl_userdata) runs on MTC_CT 
+{
+  var ASP_SCCP_N_UNITDATA_ind vl_N_UNITDATA_ind;
+  timer TL_timer:= 120.0;
+  TL_timer.start;
+  A_PORT.send( t_ASP_N_UNITDATA_req(  v_CalledAddress,
+                                      v_CallingAddress,
+                                      '00000001'B, //sequence control
+                                      '00000001'B, //return option
+                                      pl_userdata,
+                                      omit ) );
+  alt { 
+    [] A_PORT.receive( tr_ASP_N_UNITDATA_ind ) -> value vl_N_UNITDATA_ind
+      { 
+
+        if( (vl_N_UNITDATA_ind.calledAddress == v_CalledAddress ) and
+        (vl_N_UNITDATA_ind.callingAddress == v_CallingAddress) and 
+        (vl_N_UNITDATA_ind.userData == pl_userdata) )
+        {
+          log("Correct  CalledAddress, CallingAddress and userData received, data are correct");
+          setverdict(pass);
+        }
+        else
+        {
+          log("Some data corrupted");
+          setverdict( fail );
+        }
+      };       
+    [] TL_timer.timeout 
+      { 
+        setverdict( fail );
+        log("Timeout....");
+      };                                
+  } //alt  
+  TL_timer.stop;
+}//f_SendAndReceive1N_UNITDATA
+
+/****************************************************
+Connection Oriented Part
+****************************************************/
+
+/****************************************************
+function f_connect
+Establishes a connection
+(Sends an ASP_SCCP_N_CONNECT_req on A_PORT and waits for 
+N_CONNECT_ind on B_PORT. If it is received, 
+it sends back an ASP_SCCP_N_CONNECT_res on B_PORT and waits for
+N_CONNECT_cfm on A_PORT)
+****************************************************/
+function f_connect() runs on MTC_CT return boolean
+{
+  var ASP_SCCP_N_CONNECT_ind vl_N_CONNECT_ind;
+  var ASP_SCCP_N_CONNECT_cfm vl_N_CONNECT_cfm;
+  setverdict(none);
+  v_cid_A := 13;
+  timer TL_timer:= 120.0;
+  TL_timer.start; 
+  
+  A_PORT.send( t_ASP_N_CONNECT_req( v_CalledAddress,
+                                    v_CallingAddress,
+                                    omit, //expeditedDataSel
+                                    omit, //QoS
+                                    omit, //userData
+                                    v_cid_A, 
+                                    omit //importance
+                                    ) );
+
+  alt {
+    [] A_PORT.receive( tr_ASP_N_CONNECT_cfm ) -> value vl_N_CONNECT_cfm
+      {
+        setverdict( pass );
+        log("f_connect finished successfully");
+        return true;
+      }
+    [] TL_timer.timeout 
+      {
+        setverdict( fail );
+        log("Timeout....");
+        return false;
+      }
+  }// alt
+  log("f_connect finished");
+  return false;
+}//f_connect
+
+/****************************************************
+function f_send
+Sends an ASP_SCCP_N_DATA_req on A_PORT and waits for answer in
+A_PORT
+****************************************************/
+function f_send(in octetstring pl_userdata) runs on MTC_CT
+{
+  timer TL_timer:= 120.0;
+  TL_timer.start;
+  A_PORT.send( t_ASP_N_DATA_req ( pl_userdata, v_cid_A, omit) ) ;
+  alt {
+    [] A_PORT.receive
+      {
+        setverdict( pass );
+        log("f_connect finished successfully");
+         
+      }
+    [] TL_timer.timeout 
+      {
+        setverdict( fail );
+        log("Timeout....");
+         
+      }
+      
+  } //alt
+}//f_send
+
+//f_disconnect with timeout
+
+function f_disconnect( ) runs on MTC_CT 
+{
+  var ASP_SCCP_N_DISCONNECT_ind vl_N_DISCONNECT_ind;
+  timer TL_timer:= 25.0;
+  TL_timer.start;
+  A_PORT.send( t_ASP_N_DISCONNECT_req( omit, // respondingAddress
+                                      0,  //reason : end user originated, see 3.11/Q.713
+                                      omit, //userData
+                                      v_cid_A, 
+                                      omit ))
+  alt {
+ 
+    [] A_PORT.receive
+      {
+        repeat;
+      }
+    [] TL_timer.timeout 
+      { 
+        setverdict( pass );
+        log("Timeout....");
+      };           
+  }//alt
+  
+ 
+}//f_disconnect
+
+//===================================================
+// Testcases
+//===================================================
+
+/****************************************************
+tc_ConnlessSendingShortASP
+Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req
+and receives it in one ASP_SCCP_N_UNITDATA_req.
+SCCP transfers information 
+in udp or (forced) xudp packets.
+****************************************************/
+testcase tc_ConnlessSendingShortASP() runs on MTC_CT 
+{
+  var octetstring vl_userdata;
+  init();
+  setAddresses_gti0001();
+  vl_userdata :='12345678901234567890'O;  
+  f_SendAndReceive1N_UNITDATA( vl_userdata );
+  terminate(); 
+ } //tc_ConnlessSendingShortASP
+
+/****************************************************
+ tc_ConnlessSendingLongASP
+ Sends a 300 octet long userdata in one ASP_SCCP_N_UNITDATA_req
+ and receives it in one ASP_SCCP_N_UNITDATA_req.
+ It is used for segmentation and reassembly.
+ SCCP transfers information 
+in xudp packets 
+****************************************************/
+testcase tc_ConnlessSendingLongASP() runs on MTC_CT system system_CT
+{
+  var octetstring vl_userdata;
+  var integer vl_i;  
+  init();
+  setAddresses_gti0001();
+  vl_userdata := ''O;
+  for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) {
+    vl_userdata := vl_userdata &'12345678901234567890'O;  
+  }
+  f_SendAndReceive1N_UNITDATA( vl_userdata );
+  terminate(); 
+}//tc_ConnlessSendingLongASP
+
+/****************************************************
+tc_ConnOrientedShortASPSending
+****************************************************/
+testcase tc_ConnOrientedShortASPSending() runs on MTC_CT system system_CT
+{
+  var octetstring vl_userdata;
+  init();
+  setAddresses_gti0001();
+  vl_userdata := '12345678901234567890'O;
+  if(f_connect())
+  {
+    f_send(vl_userdata);
+    f_disconnect();
+  }
+  terminate(); 
+}
+/****************************************************
+tc_ConnOrientedLongASPSending
+****************************************************/
+testcase tc_ConnOrientedLongASPSending() runs on MTC_CT 
+{
+  var octetstring vl_userdata;
+  var integer vl_i;  
+  init();
+  setAddresses_gti0001();
+  vl_userdata := ''O;
+  for(vl_i:=0;vl_i<30;vl_i:=vl_i+1) {
+    vl_userdata := vl_userdata &'12345678901234567890'O;  
+  }
+  if(f_connect())
+  {
+    f_send(vl_userdata);
+    //f_SendAndReceive1N_UNITDATA( vl_userdata );
+    f_disconnect();
+  }
+  terminate(); 
+}
+/****************************************************
+ CONTROL
+****************************************************/
+control 
+{
+  execute( tc_ConnlessSendingShortASP() );
+  execute( tc_ConnlessSendingLongASP() );
+  execute( tc_ConnOrientedShortASPSending());
+  execute( tc_ConnOrientedLongASPSending());
+}
+
+}//module
