Support for SBc-AP protocol as used on the MME-CBC interface

This requires a recent libfftranscode (>=0.5) with SBC-AP support.

The asn files are obtained from 3GPP TS 29.168.

Related: osmo-cbc.git Ib278bc1d1a74459814016fef7a8fe21cc29d46c9
Related: docker-playground.git 5f3c78105836d1f2c229655df3f537a73ab6e12a
Change-Id: Ia6743e0a3e7974a5f2dd3ecf74ec331f646f6bc2
Related: OS#4945
diff --git a/cbc/CBC_Tests.ttcn b/cbc/CBC_Tests.ttcn
index 06fda92..b3ef64d 100644
--- a/cbc/CBC_Tests.ttcn
+++ b/cbc/CBC_Tests.ttcn
@@ -1,6 +1,7 @@
 module CBC_Tests {
 
 import from Osmocom_Types all;
+import from Socket_API_Definitions all;
 
 import from BSSAP_Types all;
 import from BSSMAP_Templates all;
@@ -8,7 +9,15 @@
 import from CBSP_Templates all;
 import from CBSP_Adapter all;
 import from CBSP_CodecPort all;
-import from Socket_API_Definitions all;
+
+import from SBC_AP_IEs all;
+import from SBC_AP_Constants all;
+import from SBC_AP_PDU_Contents all;
+import from SBC_AP_PDU_Descriptions all;
+import from SBC_AP_Types all;
+import from SBC_AP_Templates all;
+import from SBC_AP_CodecPort all;
+import from SBC_AP_Adapter all;
 
 import from HTTP_Adapter all;
 import from HTTPmsg_Types all;
@@ -17,11 +26,13 @@
 modulepar {
 	charstring mp_cbc_host := "127.0.0.1";
 	integer mp_cbc_cbsp_port := 48049;
+	integer mp_cbc_sbcap_port := c_SBC_AP_PORT;
 	integer mp_cbc_ecbe_port := 12345;
 	integer mp_local_cbsp_port := 9999;
+	integer mp_local_sbcap_port := 9998;
 };
 
-type component test_CT extends CBSP_Adapter_CT, http_CT {
+type component test_CT extends CBSP_Adapter_CT, SBC_AP_Adapter_CT, http_CT {
 };
 
 /*********************************************************************************
@@ -141,6 +152,7 @@
 private function f_init(boolean raw := false) runs on test_CT {
 	f_http_init(mp_cbc_host, mp_cbc_ecbe_port);
 	CBSP_Adapter.f_connect(mp_cbc_host, mp_cbc_cbsp_port, "", mp_local_cbsp_port);
+	SBC_AP_Adapter.f_connect(mp_cbc_host, mp_cbc_sbcap_port, "", mp_local_sbcap_port);
 
 	if (not raw) {
 		var BSSMAP_FIELD_CellIdentificationList cell_list := {
@@ -299,6 +311,63 @@
 	}
 }
 
+private function f_sbcap_tx_write_replace_warn_resp(CBS_Message msg, integer idx := 0)
+runs on test_CT {
+	var template (value) SBC_AP_PDU tx;
+	/* TODO: pass Unknown Tracking Area List as parameter above (omit by default) */
+	f_SBC_AP_send(tx, idx);
+}
+
+private function f_sbcap_tx_stop_warn_resp(integer idx := 0, CBS_Message msg)
+runs on test_CT {
+	var template (value) SBC_AP_PDU tx;
+	tx := ts_SBCAP_STOP_WARNING_RESP(int2bit(msg.msg_id, 16),
+					  int2bit(msg.ser_nr, 16));
+	f_SBC_AP_send(tx, idx);
+}
+
+/* handle a SBc-AP Write-Replace Request and respond to it with Response or FAILURE depending on arguments */
+private function f_sbcap_handle_write_replace_warn_req(CBS_Message msg, integer idx := 0,
+			      template (omit) BSSMAP_FIELD_CellIdentificationList tx_cell_list := omit)
+runs on test_CT {
+	var template (present) SBC_AP_PDU rx_templ;
+	var SBC_AP_RecvFrom rf;
+	rx_templ := tr_SBCAP_WRITE_WARNING(int2bit(msg.msg_id, 16),
+					   int2bit(msg.ser_nr, 16),
+					   msg.rep_period,
+					   msg.num_bcast_req);
+	alt {
+	[] SBC_AP[idx].receive(tr_SBC_AP_Recv(g_cbsp_conn_id[idx], rx_templ)) -> value rf {
+		var template (value) SBC_AP_PDU tx;
+		log ("received expected req:", rf);
+		f_sbcap_tx_write_replace_warn_resp(msg, idx);
+		}
+	[] SBC_AP[idx].receive {
+		setverdict(fail, "Received unexpected SBc-AP in index ", idx);
+		}
+	}
+}
+
+/* handle a SBc-AP Stop-Warning-Request and respond to it with Response or FAILURE depending on arguments */
+private function f_sbcap_handle_stop_warn_req(integer idx := 0, CBS_Message msg)
+runs on test_CT {
+	var template (present) SBC_AP_PDU rx_templ;
+	var SBC_AP_RecvFrom rf;
+
+	rx_templ := tr_SBCAP_STOP_WARNING(int2bit(msg.msg_id, 16),
+					  int2bit(msg.ser_nr, 16));
+	alt {
+	[] SBC_AP[idx].receive(tr_SBC_AP_Recv(g_cbsp_conn_id[idx], rx_templ)) -> value rf {
+		var template (value) SBC_AP_PDU tx;
+		log ("received expected req:", rf);
+		f_sbcap_tx_stop_warn_resp(idx, msg);
+		}
+	[] SBC_AP[idx].receive {
+		setverdict(fail, "Received unexpected SBc-AP in index ", idx);
+		}
+	}
+}
+
 private const BSSMAP_FIELD_CellIdentificationList cil_BSS := {
 	cIl_allInBSS := ''O
 };
@@ -396,6 +465,7 @@
 	var EcbeCbcMessage ecbe := f_cbs2ecbe(msg, "TTCN-3");
 	f_ecbe_tx_post_cbs(ecbe);
 	f_cbsp_handle_write(msg, 0, cell_list_success);
+	f_sbcap_handle_write_replace_warn_req(msg, 0);
 	f_ecbe_rx_resp(201);
 
 	f_sleep(2.0);
@@ -404,6 +474,7 @@
 	/* FIXME: cbc segfaults if we terminate here (if we don't wait for Connect_result? */
 	f_cbsp_handle_kill(0, msg.msg_id, msg.ser_nr, exp_list:=cell_list_success, tx_list:=cell_list_success,
 			   tx_fail_list:=omit, tx_compl_list:=omit, channel_ind:=msg.channel_ind);
+	f_sbcap_handle_stop_warn_req(0, msg);
 	f_ecbe_rx_resp(200);
 }
 
diff --git a/cbc/gen_links.sh b/cbc/gen_links.sh
index 8b88605..3bb9e77 100755
--- a/cbc/gen_links.sh
+++ b/cbc/gen_links.sh
@@ -34,6 +34,11 @@
 FILES+="SABP_CodecPort.ttcn SABP_CodecPort_CtrlFunct.ttcn SABP_CodecPort_CtrlFunctDef.cc SABP_Adapter.ttcn "
 gen_links $DIR $FILES
 
+DIR=../library/sbcap
+FILES="SBC_AP_CommonDataTypes.asn SBC_AP_Constants.asn SBC_AP_Containers.asn SBC_AP_IEs.asn SBC_AP_PDU_Contents.asn SBC_AP_PDU_Descriptions.asn "
+FILES+="SBC_AP_Types.ttcn SBC_AP_EncDec.cc SBC_AP_Templates.ttcn SBC_AP_CodecPort.ttcn SBC_AP_CodecPort_CtrlFunct.ttcn SBC_AP_CodecPort_CtrlFunctDef.cc SBC_AP_Adapter.ttcn "
+gen_links $DIR $FILES
+
 DIR=$BASEDIR/titan.TestPorts.Common_Components.Abstract_Socket/src
 FILES="Abstract_Socket.cc Abstract_Socket.hh "
 gen_links $DIR $FILES
diff --git a/cbc/regen_makefile.sh b/cbc/regen_makefile.sh
index 11a93c4..96900b3 100755
--- a/cbc/regen_makefile.sh
+++ b/cbc/regen_makefile.sh
@@ -15,6 +15,8 @@
 	Native_FunctionDefs.cc
 	SABP_CodecPort_CtrlFunctDef.cc
 	SABP_EncDec.cc
+	SBC_AP_CodecPort_CtrlFunctDef.cc
+	SBC_AP_EncDec.cc
 	SCTPasp_PT.cc
 	TCCConversion.cc
 	TCCEncoding.cc
diff --git a/library/sbcap/SBC_AP_Adapter.ttcn b/library/sbcap/SBC_AP_Adapter.ttcn
new file mode 100644
index 0000000..3217c5e
--- /dev/null
+++ b/library/sbcap/SBC_AP_Adapter.ttcn
@@ -0,0 +1,91 @@
+module SBC_AP_Adapter {
+
+/* SBC_AP Adapter layer, sitting on top of SBC_AP_CodecPort.
+ * test suites can 'inherit' in order to have a SBC_AP connection to the IUT which they're testing
+ *
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ */
+
+
+import from Osmocom_Types all;
+import from General_Types all;
+import from SBC_AP_Types all;
+import from SBC_AP_PDU_Descriptions all;
+import from SBC_AP_Templates all;
+import from SBC_AP_CodecPort all;
+import from SBC_AP_CodecPort_CtrlFunct all;
+import from IPL4asp_Types all;
+import from IPL4asp_PortType all;
+import from Socket_API_Definitions all;
+import from Misc_Helpers all;
+
+
+const integer SBC_AP_HDR_LEN := 3;
+
+const integer NUM_SBC_AP := 3;
+
+type component SBC_AP_Adapter_CT {
+	/* down-facing port to SBC_AP Codec port */
+	port SBC_AP_CODEC_PT SBC_AP[NUM_SBC_AP];
+	var IPL4asp_Types.ConnectionId g_SBC_AP_conn_id[NUM_SBC_AP] := { -1, -1, -1 };
+}
+
+private template Socket_API_Definitions.PortEvent tr_SctpAssocChange_COMM_UP(IPL4asp_Types.ConnectionId id) := {
+	sctpEvent := {
+		sctpAssocChange := {
+			clientId := id,
+			proto := {
+				sctp := ?
+			},
+			sac_state := SCTP_COMM_UP
+		}
+	}
+}
+
+function f_connect(charstring remote_host, IPL4asp_Types.PortNumber remote_port,
+		   charstring local_host, IPL4asp_Types.PortNumber local_port, integer idx := 0)
+runs on SBC_AP_Adapter_CT {
+	var IPL4asp_Types.Result res;
+	map(self:SBC_AP[idx], system:SBC_AP);
+	res := SBC_AP_CodecPort_CtrlFunct.f_IPL4_connect(SBC_AP[idx], remote_host, remote_port,
+							local_host, local_port, 0, { sctp := valueof(ts_SBC_AP_SctpTuple) });
+	if (not ispresent(res.connId)) {
+		setverdict(fail, "Could not connect to SBC_AP port, check your configuration");
+		mtc.stop;
+	}
+	g_SBC_AP_conn_id[idx] := res.connId;
+	timer Tcommup := 10.0;
+	Tcommup.start;
+	alt {
+	[] SBC_AP[idx].receive(tr_SctpAssocChange_COMM_UP(g_SBC_AP_conn_id[idx])) {}
+	[] Tcommup.timeout {
+		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting SCTP_COMM_UP");
+	}
+	}
+}
+
+/* Function to use to bind to a local port as IPA server, accepting remote clients */
+function f_bind(charstring local_host, IPL4asp_Types.PortNumber local_port, integer idx := 0)
+runs on SBC_AP_Adapter_CT {
+	var IPL4asp_Types.Result res;
+	map(self:SBC_AP[idx], system:SBC_AP);
+	res := SBC_AP_CodecPort_CtrlFunct.f_IPL4_listen(SBC_AP[idx], local_host, local_port, { sctp := valueof(ts_SBC_AP_SctpTuple) });
+	g_SBC_AP_conn_id[idx] := res.connId;
+}
+
+function f_SBC_AP_send(template (value) SBC_AP_PDU pdu, integer idx := 0) runs on SBC_AP_Adapter_CT {
+	SBC_AP[idx].send(ts_SBC_AP_Send(g_SBC_AP_conn_id[idx], pdu));
+}
+
+function f_SBC_AP_exp(template SBC_AP_PDU exp, integer idx := 0) runs on SBC_AP_Adapter_CT return SBC_AP_PDU {
+	var SBC_AP_RecvFrom rf;
+	SBC_AP[idx].receive(tr_SBC_AP_Recv(g_SBC_AP_conn_id[idx], exp)) -> value rf;
+	return rf.msg;
+}
+
+
+}
diff --git a/library/sbcap/SBC_AP_CodecPort.ttcn b/library/sbcap/SBC_AP_CodecPort.ttcn
new file mode 100644
index 0000000..bd17031
--- /dev/null
+++ b/library/sbcap/SBC_AP_CodecPort.ttcn
@@ -0,0 +1,84 @@
+module SBC_AP_CodecPort {
+
+/* Simple SBC AP Codec Port, translating between raw SCTP primitives with
+ * octetstring payload towards the IPL4asp provider, and SBC-AP primitives
+ * which carry the decoded SBC-AP data types as payload.
+ *
+ * (C) 2019 by Harald Welte <laforge@gnumonks.org>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+	import from IPL4asp_PortType all;
+	import from IPL4asp_Types all;
+	import from SBC_AP_PDU_Descriptions all;
+	import from SBC_AP_Types all;
+
+	type record SBC_AP_RecvFrom {
+		ConnectionId	connId,
+		HostName	remName,
+		PortNumber	remPort,
+		HostName	locName,
+		PortNumber	locPort,
+		SBC_AP_PDU	msg
+	};
+
+	type record SBC_AP_Send {
+		ConnectionId	connId,
+		SBC_AP_PDU	msg
+	};
+
+	template (value) SctpTuple ts_SBC_AP_SctpTuple := {
+		sinfo_stream := omit,
+		sinfo_ppid := c_SBC_AP_PPID,
+		remSocks := omit,
+		assocId := omit
+	};
+
+	template (value) SBC_AP_Send ts_SBC_AP_Send(ConnectionId connId, template (value) SBC_AP_PDU msg) := {
+		connId := connId,
+		msg := msg
+	}
+
+	template (present) SBC_AP_RecvFrom tr_SBC_AP_Recv(template ConnectionId connId, template SBC_AP_PDU msg) := {
+		connId := connId,
+		remName := ?,
+		remPort := ?,
+		locName := ?,
+		locPort := ?,
+		msg := msg
+	}
+
+	private function IPL4_to_SBC_AP_RecvFrom(in ASP_RecvFrom pin, out SBC_AP_RecvFrom pout) {
+		pout.connId := pin.connId;
+		pout.remName := pin.remName;
+		pout.remPort := pin.remPort;
+		pout.locName := pin.locName;
+		pout.locPort := pin.locPort;
+		pout.msg := dec_SBC_AP_PDU(pin.msg);
+	} with { extension "prototype(fast)" };
+
+	private function SBC_AP_to_IPL4_Send(in SBC_AP_Send pin, out ASP_Send pout) {
+		pout.connId := pin.connId;
+		pout.proto := {
+			sctp := valueof(ts_SBC_AP_SctpTuple)
+		};
+		pout.msg := enc_SBC_AP_PDU(pin.msg);
+	} with { extension "prototype(fast)" };
+
+	type port SBC_AP_CODEC_PT message {
+		out	SBC_AP_Send;
+		in	SBC_AP_RecvFrom,
+			ASP_ConnId_ReadyToRelease,
+			ASP_Event;
+	} with { extension "user IPL4asp_PT
+		out(SBC_AP_Send -> ASP_Send:function(SBC_AP_to_IPL4_Send))
+		in(ASP_RecvFrom -> SBC_AP_RecvFrom: function(IPL4_to_SBC_AP_RecvFrom);
+		   ASP_ConnId_ReadyToRelease -> ASP_ConnId_ReadyToRelease: simple;
+		   ASP_Event -> ASP_Event: simple)"
+	}
+}
diff --git a/library/sbcap/SBC_AP_CodecPort_CtrlFunct.ttcn b/library/sbcap/SBC_AP_CodecPort_CtrlFunct.ttcn
new file mode 100644
index 0000000..bdf1eec
--- /dev/null
+++ b/library/sbcap/SBC_AP_CodecPort_CtrlFunct.ttcn
@@ -0,0 +1,44 @@
+module SBC_AP_CodecPort_CtrlFunct {
+
+  import from SBC_AP_CodecPort all;
+  import from IPL4asp_Types all;
+
+  external function f_IPL4_listen(
+    inout SBC_AP_CODEC_PT portRef,
+    in HostName locName,
+    in PortNumber locPort,
+    in ProtoTuple proto,
+    in OptionList options := {}
+  ) return Result;
+
+  external function f_IPL4_connect(
+    inout SBC_AP_CODEC_PT portRef,
+    in HostName remName,
+    in PortNumber remPort,
+    in HostName locName,
+    in PortNumber locPort,
+    in ConnectionId connId,
+    in ProtoTuple proto,
+    in OptionList options := {}
+  ) return Result;
+
+  external function f_IPL4_close(
+    inout SBC_AP_CODEC_PT portRef,
+    in ConnectionId id,
+    in ProtoTuple proto := { unspecified := {} }
+  ) return Result;
+
+  external function f_IPL4_setUserData(
+    inout SBC_AP_CODEC_PT portRef,
+    in ConnectionId id,
+    in UserData userData
+  ) return Result;
+
+  external function f_IPL4_getUserData(
+    inout SBC_AP_CODEC_PT portRef,
+    in ConnectionId id,
+    out UserData userData
+  ) return Result;
+
+}
+
diff --git a/library/sbcap/SBC_AP_CodecPort_CtrlFunctDef.cc b/library/sbcap/SBC_AP_CodecPort_CtrlFunctDef.cc
new file mode 100644
index 0000000..4eb00c6
--- /dev/null
+++ b/library/sbcap/SBC_AP_CodecPort_CtrlFunctDef.cc
@@ -0,0 +1,55 @@
+#include "IPL4asp_PortType.hh"
+#include "SBC_AP_CodecPort.hh"
+#include "IPL4asp_PT.hh"
+
+namespace SBC__AP__CodecPort__CtrlFunct {
+
+  IPL4asp__Types::Result f__IPL4__listen(
+    SBC__AP__CodecPort::SBC__AP__CODEC__PT& portRef,
+    const IPL4asp__Types::HostName& locName,
+    const IPL4asp__Types::PortNumber& locPort,
+    const IPL4asp__Types::ProtoTuple& proto,
+    const IPL4asp__Types::OptionList& options)
+  {
+    return f__IPL4__PROVIDER__listen(portRef, locName, locPort, proto, options);
+  }
+
+  IPL4asp__Types::Result f__IPL4__connect(
+    SBC__AP__CodecPort::SBC__AP__CODEC__PT& portRef,
+    const IPL4asp__Types::HostName& remName,
+    const IPL4asp__Types::PortNumber& remPort,
+    const IPL4asp__Types::HostName& locName,
+    const IPL4asp__Types::PortNumber& locPort,
+    const IPL4asp__Types::ConnectionId& connId,
+    const IPL4asp__Types::ProtoTuple& proto,
+    const IPL4asp__Types::OptionList& options)
+  {
+    return f__IPL4__PROVIDER__connect(portRef, remName, remPort,
+                                      locName, locPort, connId, proto, options);
+  }
+
+  IPL4asp__Types::Result f__IPL4__close(
+    SBC__AP__CodecPort::SBC__AP__CODEC__PT& portRef,
+    const IPL4asp__Types::ConnectionId& connId,
+    const IPL4asp__Types::ProtoTuple& proto)
+  {
+      return f__IPL4__PROVIDER__close(portRef, connId, proto);
+  }
+
+  IPL4asp__Types::Result f__IPL4__setUserData(
+    SBC__AP__CodecPort::SBC__AP__CODEC__PT& portRef,
+    const IPL4asp__Types::ConnectionId& connId,
+    const IPL4asp__Types::UserData& userData)
+  {
+    return f__IPL4__PROVIDER__setUserData(portRef, connId, userData);
+  }
+
+  IPL4asp__Types::Result f__IPL4__getUserData(
+    SBC__AP__CodecPort::SBC__AP__CODEC__PT& portRef,
+    const IPL4asp__Types::ConnectionId& connId,
+    IPL4asp__Types::UserData& userData)
+  {
+    return f__IPL4__PROVIDER__getUserData(portRef, connId, userData);
+  }
+
+}
diff --git a/library/sbcap/SBC_AP_CommonDataTypes.asn b/library/sbcap/SBC_AP_CommonDataTypes.asn
new file mode 100644
index 0000000..e11f317
--- /dev/null
+++ b/library/sbcap/SBC_AP_CommonDataTypes.asn
@@ -0,0 +1,35 @@
+-- SBC-AP-CommonDataTypes.asn
+--
+-- Taken from 3GPP TS 29.168 V15.1.0 (2018-09)
+-- http://www.3gpp.org/ftp/Specs/archive/29_series/29.168/29168-930.zip
+--
+-- 4.4.6	Common Definitions
+--
+
+-- **************************************************************
+--
+-- Common definitions
+--
+-- **************************************************************
+
+SBC-AP-CommonDataTypes {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) sbc-AP (3) version1 (1) sbc-AP-CommonDataTypes (3)}
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+Criticality	::= ENUMERATED { reject, ignore, notify }
+
+Presence	::= ENUMERATED { optional, conditional, mandatory }
+
+ProcedureCode	::= INTEGER (0..255)
+
+ProtocolExtensionID	::= INTEGER (0..65535)
+
+ProtocolIE-ID	::= INTEGER (0..65535)
+
+TriggeringMessage	::= ENUMERATED {initiating-message, successful-outcome, unsuccessful-outcome, outcome}
+
+END
diff --git a/library/sbcap/SBC_AP_Constants.asn b/library/sbcap/SBC_AP_Constants.asn
new file mode 100644
index 0000000..447e1c4
--- /dev/null
+++ b/library/sbcap/SBC_AP_Constants.asn
@@ -0,0 +1,127 @@
+-- SBC-AP-Constants.asn
+--
+-- Taken from 3GPP TS 29.168 V15.1.0 (2018-09)
+-- http://www.3gpp.org/ftp/Specs/archive/29_series/29.168/29168-930.zip
+--
+-- 4.4.7	Constant Definitions
+--
+-- **************************************************************
+--
+-- Constant definitions
+--
+-- **************************************************************
+
+SBC-AP-Constants {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) sbc-AP (3) version1 (1) sbc-AP-Constants (4)}
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- Elementary Procedures
+--
+-- **************************************************************
+
+id-Write-Replace-Warning 	INTEGER ::= 0 
+id-Stop-Warning 		INTEGER ::= 1 
+id-Error-Indication 	INTEGER ::= 2
+id-Write-Replace-Warning-Indication	INTEGER ::= 3
+id-Stop-Warning-Indication	INTEGER ::= 4
+id-PWS-Restart-Indication	INTEGER ::= 5 
+id-PWS-Failure-Indication	INTEGER ::= 6
+
+-- **************************************************************
+--
+-- IEs
+--
+-- **************************************************************
+
+id-Broadcast-Message-Content	INTEGER ::= 0
+id-Cause 	INTEGER ::= 1
+id-Criticality-Diagnostics	INTEGER ::=2
+id-Data-Coding-Scheme 	INTEGER ::= 3
+id-Failure-List 	INTEGER ::= 4
+id-Message-Identifier 	INTEGER ::= 5
+id-Number-of-Broadcasts-Completed-List 	INTEGER ::= 6
+id-Number-of-Broadcasts-Requested 	INTEGER ::= 7
+id-Radio-Resource-Loading-List 	INTEGER ::= 8
+id-Recovery-Indication 	INTEGER ::= 9
+id-Repetition-Period 	INTEGER ::= 10
+id-Serial-Number 	INTEGER ::= 11
+id-Service-Areas-List 	INTEGER ::= 12
+id-TypeOfError		INTEGER ::= 13
+id-List-of-TAIs		INTEGER ::= 14
+id-Warning-Area-List 	INTEGER ::= 15
+id-Warning-Message-Content	INTEGER ::= 16
+id-Warning-Security-Information	INTEGER ::= 17
+id-Warning-Type		INTEGER ::= 18 
+id-Omc-Id 		INTEGER ::= 19 
+id-Concurrent-Warning-Message-Indicator INTEGER ::= 20 
+id-Extended-Repetition-Period	INTEGER ::= 21
+id-Unknown-Tracking-Area-List	INTEGER ::= 22 
+id-Broadcast-Scheduled-Area-List	INTEGER ::= 23
+id-Send-Write-Replace-Warning-Indication INTEGER ::= 24
+id-Broadcast-Cancelled-Area-List	INTEGER ::= 25
+id-Send-Stop-Warning-Indication	INTEGER ::= 26
+id-Stop-All-Indicator	INTEGER ::= 27 
+id-Global-ENB-ID		INTEGER ::= 28
+id-Broadcast-Empty-Area-List	INTEGER ::= 29
+id-Restarted-Cell-List	INTEGER ::= 30
+id-List-of-TAIs-Restart	INTEGER ::= 31
+id-List-of-EAIs-Restart	INTEGER ::= 32 
+id-Failed-Cell-List	INTEGER ::= 33
+id-List-of-5GS-TAIs	INTEGER ::= 34
+id-Warning-Area-List-5GS	INTEGER ::= 35
+id-Global-RAN-Node-ID	INTEGER ::= 36
+id-Global-GNB-ID	INTEGER ::= 37
+id-RAT-Selector-5GS		INTEGER ::= 38
+id-Unknown-5GS-Tracking-Area-List	INTEGER ::= 39
+id-Broadcast-Scheduled-Area-List-5GS	INTEGER ::= 40
+id-Broadcast-Cancelled-Area-List-5GS	INTEGER ::= 41
+id-Broadcast-Empty-Area-List-5GS	INTEGER ::= 42
+id-Restarted-Cell-List-NR	INTEGER ::= 43
+id-Failed-Cell-List-NR	INTEGER ::= 44
+id-List-of-5GS-TAI-for-Restart	INTEGER ::= 45
+id-Warning-Area-Coordinates	INTEGER ::= 46
+
+
+
+-- **************************************************************
+--
+-- Extension constants
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Lists
+--
+-- **************************************************************
+
+maxNrOfErrors	INTEGER ::= 256 
+maxnoofCellID	INTEGER	::= 65535 
+maxnoofCellinEAI	INTEGER ::= 65535
+maxnoofCellinTAI	INTEGER ::= 65535
+maxNrOfTAIs		INTEGER ::= 65535
+maxnoofEmergencyAreaID	INTEGER	::= 65535
+maxnoofTAIforWarning	INTEGER ::= 65535
+
+maxProtocolExtensions 	INTEGER ::= 65535
+maxProtocolIEs	INTEGER ::= 65535 
+maxnoofeNBIds	INTEGER ::= 256
+maxnoofRestartedCells	INTEGER ::= 256
+maxnoofRestartTAIs	INTEGER ::= 2048
+maxnoofRestartEAIs	INTEGER ::= 256 
+maxnoofFailedCells	INTEGER ::= 256
+maxnoof5GSTAIs	INTEGER ::= 2048
+maxnoofCellsingNB	INTEGER ::= 16384
+maxnoofCellsin5GS	INTEGER ::= 16776960
+maxnoofCellsin5GSTAI	INTEGER ::= 65535
+maxnoofRANNodes	INTEGER ::= 65535
+maxnoofRestart5GSTAIs	INTEGER ::= 2048maxnoofCellsforRestartNR 	INTEGER ::= 16384
+
+
+END
diff --git a/library/sbcap/SBC_AP_Containers.asn b/library/sbcap/SBC_AP_Containers.asn
new file mode 100644
index 0000000..8b71821
--- /dev/null
+++ b/library/sbcap/SBC_AP_Containers.asn
@@ -0,0 +1,121 @@
+-- SBC-AP-Containers.asn
+--
+-- Taken from 3GPP TS 29.168 V15.1.0 (2018-09)
+-- http://www.3gpp.org/ftp/Specs/archive/29_series/29.168/29168-930.zip
+--
+-- 4.4.8	Container Definitions
+--
+
+-- **************************************************************
+--
+-- Container definitions
+--
+-- **************************************************************
+
+SBC-AP-Containers {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) sbc-AP (3) version1 (1) sbc-AP-Containers (5)}
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+	Criticality,
+	Presence,
+	ProtocolExtensionID,
+	ProtocolIE-ID
+FROM SBC-AP-CommonDataTypes
+
+	maxProtocolExtensions,
+	maxProtocolIEs
+FROM SBC-AP-Constants;
+
+-- **************************************************************
+--
+-- Class Definition for Protocol IEs
+--
+-- **************************************************************
+
+SBC-AP-PROTOCOL-IES ::= CLASS {
+	&id	ProtocolIE-ID 	UNIQUE,
+	&criticality	Criticality	DEFAULT ignore,
+	&Value,
+	&presence	Presence
+}
+WITH SYNTAX {
+	ID	&id
+	CRITICALITY	&criticality
+	TYPE	&Value
+	PRESENCE	&presence
+}
+
+-- **************************************************************
+--
+-- Class Definition for Protocol Extensions
+--
+-- **************************************************************
+
+SBC-AP-PROTOCOL-EXTENSION ::= CLASS {
+	&id	ProtocolExtensionID 	UNIQUE,
+	&criticality	Criticality	DEFAULT ignore,
+	&Extension,
+	&presence	Presence
+}
+WITH SYNTAX {
+	ID	&id
+	CRITICALITY	&criticality
+	EXTENSION	&Extension
+	PRESENCE	&presence
+}
+
+-- **************************************************************
+--
+-- Container for Protocol IEs
+--
+-- **************************************************************
+
+ProtocolIE-Container {SBC-AP-PROTOCOL-IES : IEsSetParam} ::= 
+	SEQUENCE (SIZE (0..maxProtocolIEs)) OF
+	ProtocolIE-Field {{IEsSetParam}}
+
+ProtocolIE-Field {SBC-AP-PROTOCOL-IES : IEsSetParam} ::= SEQUENCE {
+	id	SBC-AP-PROTOCOL-IES.&id	({IEsSetParam}),
+	criticality	SBC-AP-PROTOCOL-IES.&criticality	({IEsSetParam}{@id}),
+	value	SBC-AP-PROTOCOL-IES.&Value	        	({IEsSetParam}{@id})
+}
+
+-- **************************************************************
+--
+-- Container Lists for Protocol IE Containers
+--
+-- **************************************************************
+
+ProtocolIE-ContainerList {INTEGER : lowerBound, INTEGER : upperBound, SBC-AP-PROTOCOL-IES : IEsSetParam} ::=
+	SEQUENCE (SIZE (lowerBound..upperBound)) OF
+	ProtocolIE-Container {{IEsSetParam}}
+
+-- **************************************************************
+--
+-- Container for Protocol Extensions
+--
+-- **************************************************************
+
+ProtocolExtensionContainer {SBC-AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= 
+	SEQUENCE (SIZE (1..maxProtocolExtensions)) OF
+	ProtocolExtensionField {{ExtensionSetParam}}
+
+ProtocolExtensionField {SBC-AP-PROTOCOL-EXTENSION : ExtensionSetParam} ::= SEQUENCE {
+	id	SBC-AP-PROTOCOL-EXTENSION.&id	({ExtensionSetParam}),
+	criticality	SBC-AP-PROTOCOL-EXTENSION.&criticality	({ExtensionSetParam}{@id}),
+	extensionValue	SBC-AP-PROTOCOL-EXTENSION.&Extension	({ExtensionSetParam}{@id})
+}
+
+
+END
diff --git a/library/sbcap/SBC_AP_EncDec.cc b/library/sbcap/SBC_AP_EncDec.cc
new file mode 100644
index 0000000..08ee75f
--- /dev/null
+++ b/library/sbcap/SBC_AP_EncDec.cc
@@ -0,0 +1,64 @@
+
+#include <string.h>
+#include <stdarg.h>
+#include "SBC_AP_PDU_Descriptions.hh"
+
+extern "C" {
+#include <fftranscode/transcode.h>
+}
+
+namespace SBC__AP__Types {
+
+TTCN_Module SBC__AP__EncDec("SBC_AP_EncDec", __DATE__, __TIME__);
+
+OCTETSTRING enc__SBC__AP__PDU(const SBC__AP__PDU__Descriptions::SBC__AP__PDU &pdu)
+{
+	uint8_t *aper_buf;
+	int aper_buf_len;
+	TTCN_Buffer TTCN_buf;
+	TTCN_buf.clear();
+
+	/* Encode from abstract data type into BER/DER */
+	pdu.encode(SBC__AP__PDU__Descriptions::SBC__AP__PDU_descr_, TTCN_buf,
+		   TTCN_EncDec::CT_BER, BER_ENCODE_DER);
+
+	aper_buf_len = fftranscode_ber2aper(FFTRANSC_T_SBCAP, &aper_buf, TTCN_buf.get_data(), TTCN_buf.get_len());
+	if (aper_buf_len < 0) {
+		TTCN_error("fftranscode failed.");
+	}
+
+	/* make octetstring from output buffer */
+	OCTETSTRING ret_val(aper_buf_len, aper_buf);
+
+	/* release dynamically-allocated output buffer */
+	fftranscode_free(aper_buf);
+
+	return ret_val;
+}
+
+SBC__AP__PDU__Descriptions::SBC__AP__PDU dec__SBC__AP__PDU(const OCTETSTRING &stream)
+{
+	uint8_t *ber_buf;
+	int ber_buf_len;
+
+	/* First, decode APER + re-encode as BER */
+	ber_buf_len = fftranscode_aper2ber(FFTRANSC_T_SBCAP, &ber_buf, (const unsigned char *)stream, stream.lengthof());
+	if (ber_buf_len < 0) {
+		TTCN_error("fftranscode failed.");
+	}
+
+	/* Then, re-encode from BER to TITAN representation */
+	SBC__AP__PDU__Descriptions::SBC__AP__PDU ret_dcc;
+	TTCN_Buffer TTCN_buf;
+	TTCN_buf.clear();
+	TTCN_buf.put_s(ber_buf_len, ber_buf);
+
+	ret_dcc.decode(SBC__AP__PDU__Descriptions::SBC__AP__PDU_descr_, TTCN_buf,
+			TTCN_EncDec::CT_BER, BER_ACCEPT_ALL);
+
+	fftranscode_free(ber_buf);
+
+	return ret_dcc;
+}
+
+}
diff --git a/library/sbcap/SBC_AP_IEs.asn b/library/sbcap/SBC_AP_IEs.asn
new file mode 100644
index 0000000..3cfa847
--- /dev/null
+++ b/library/sbcap/SBC_AP_IEs.asn
@@ -0,0 +1,650 @@
+-- SBC-AP-IEs.asn
+--
+-- Taken from 3GPP TS 29.168 V15.1.0 (2018-09)
+-- http://www.3gpp.org/ftp/Specs/archive/29_series/29.168/29168-930.zip
+--
+-- 4.4.5	Information Element Definitions
+--
+
+-- **************************************************************
+--
+-- Information Element Definitions
+--
+-- **************************************************************
+
+SBC-AP-IEs {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) sbc-AP (3) version1 (1) sbc-AP-IEs (2)}
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+IMPORTS
+	maxNrOfErrors,
+	maxNrOfTAIs,
+	maxnoofTAIforWarning,
+	maxnoofCellID,
+	maxnoofEmergencyAreaID,
+
+	id-TypeOfError,
+ 	maxnoofCellinEAI,
+	maxnoofCellinTAI,
+	maxnoofeNBIds,
+	maxnoofRestartTAIs,
+	maxnoofRestartEAIs,
+	maxnoofRestartedCells,
+	maxnoofFailedCells,
+	maxnoof5GSTAIs,
+	maxnoofCellsingNB,
+	maxnoofCellsin5GS,
+	maxnoofCellsforRestartNR,
+	maxnoofRANNodes,
+	maxnoofRestart5GSTAIs,
+	maxnoofCellsin5GSTAI
+
+FROM SBC-AP-Constants
+
+	Criticality,
+	ProcedureCode,
+	TriggeringMessage,
+	ProtocolIE-ID
+FROM SBC-AP-CommonDataTypes
+
+	ProtocolExtensionContainer{},
+
+	SBC-AP-PROTOCOL-EXTENSION
+FROM SBC-AP-Containers;
+
+
+-- A
+
+-- B
+
+Broadcast-Scheduled-Area-List ::= SEQUENCE {
+	cellId-Broadcast-List           CellId-Broadcast-List           OPTIONAL,
+    tAI-Broadcast-List              TAI-Broadcast-List              OPTIONAL,
+    emergencyAreaID-Broadcast-List  EmergencyAreaID-Broadcast-List  OPTIONAL,
+	iE-Extensions	   ProtocolExtensionContainer {{Broadcast-Scheduled-Area-List-ExtIEs}} OPTIONAL,
+    ...
+}
+
+Broadcast-Scheduled-Area-List-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+Broadcast-Scheduled-Area-List-5GS ::= SEQUENCE {
+	cellId-Broadcast-List-5GS       CellId-Broadcast-List-5GS       OPTIONAL,
+    tAI-Broadcast-List-5GS          TAI-Broadcast-List-5GS          OPTIONAL,
+    emergencyAreaID-Broadcast-List  EmergencyAreaID-Broadcast-List  OPTIONAL,
+	iE-Extensions	   ProtocolExtensionContainer {{Broadcast-Scheduled-Area-List-5GS-ExtIEs}} OPTIONAL,
+    ...
+}
+
+Broadcast-Scheduled-Area-List-5GS-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+Broadcast-Cancelled-Area-List ::= SEQUENCE {
+	cellID-Cancelled-List	CellID-Cancelled-List	OPTIONAL,
+	tAI-Cancelled-List	TAI-Cancelled-List	OPTIONAL,
+	emergencyAreaID-Cancelled-List	EmergencyAreaID-Cancelled-List	OPTIONAL,
+	iE-Extensions	ProtocolExtensionContainer {{Broadcast-Cancelled-Area-List-ExtIEs}} OPTIONAL,
+	...
+}
+
+Broadcast-Cancelled-Area-List-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+Broadcast-Cancelled-Area-List-5GS ::= SEQUENCE {
+	cellID-Cancelled-List-5GS	CellID-Cancelled-List-5GS	OPTIONAL,
+	tAI-Cancelled-List-5GS	TAI-Cancelled-List-5GS	OPTIONAL,
+	emergencyAreaID-Cancelled-List	EmergencyAreaID-Cancelled-List	OPTIONAL,
+	iE-Extensions	ProtocolExtensionContainer {{Broadcast-Cancelled-Area-List-5GS-ExtIEs}} OPTIONAL,
+	...
+}
+
+Broadcast-Cancelled-Area-List-5GS-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+
+Broadcast-Empty-Area-List	::= SEQUENCE (SIZE (1.. maxnoofeNBIds)) OF Global-ENB-ID
+
+Broadcast-Empty-Area-List-5GS	::= SEQUENCE (SIZE (1.. maxnoofRANNodes)) OF Global-RAN-Node-ID
+
+
+-- C
+
+CancelledCellinEAI ::= SEQUENCE (SIZE(1..maxnoofCellinEAI)) OF CancelledCellinEAI-Item
+
+CancelledCellinEAI-Item ::= SEQUENCE {
+	eCGI		EUTRAN-CGI,
+	numberOfBroadcasts	NumberOfBroadcasts,
+	iE-Extensions	ProtocolExtensionContainer { {CancelledCellinEAI-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+CancelledCellinEAI-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+CancelledCellinTAI ::= SEQUENCE (SIZE(1..maxnoofCellinTAI)) OF CancelledCellinTAI-Item
+
+CancelledCellinTAI-Item ::= SEQUENCE{
+	eCGI	EUTRAN-CGI,
+	numberOfBroadcasts	NumberOfBroadcasts,
+	iE-Extensions	ProtocolExtensionContainer { {CancelledCellinTAI-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+CancelledCellinTAI-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+CancelledCellinTAI-5GS ::= SEQUENCE (SIZE(1..maxnoofCellsin5GSTAI)) OF
+	SEQUENCE{
+	nR-CGI	NR-CGI,
+	numberOfBroadcasts	NumberOfBroadcasts,
+	iE-Extensions	ProtocolExtensionContainer { {CancelledCellinTAI-5GS-ExtIEs} } OPTIONAL,
+	...
+}
+
+CancelledCellinTAI-5GS-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+Cause 		::= INTEGER {
+	message-accepted			(0),
+	parameter-not-recognised		(1),
+	parameter-value-invalid		(2),
+	valid-message-not-identified 		(3),
+	tracking-area-not-valid	 		(4),
+	unrecognised-message 		(5),
+	missing-mandatory-element 		(6),
+	mME-capacity-exceeded 		(7),
+	mME-memory-exceeded 		(8),
+	warning-broadcast-not-supported	 	(9),
+	warning-broadcast-not-operational 		(10),
+	message-reference-already-used 		(11),
+	unspecifed-error 			(12),
+	transfer-syntax-error		(13),
+	semantic-error			(14),
+	message-not-compatible-with-receiver-state	(15),
+	abstract-syntax-error-reject		(16),
+	abstract-syntax-error-ignore-and-notify	(17),
+	abstract-syntax-error-falsely-constructed-message	(18)
+} (0..255)
+
+CellId-Broadcast-List ::= SEQUENCE (SIZE(1..maxnoofCellID)) OF CellId-Broadcast-List-Item
+
+CellId-Broadcast-List-Item ::= SEQUENCE {
+	eCGI	EUTRAN-CGI,
+	iE-Extensions	ProtocolExtensionContainer { {CellId-Broadcast-List-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+CellId-Broadcast-List-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+CellId-Broadcast-List-5GS ::= SEQUENCE (SIZE(1..maxnoofCellsin5GS)) OF 
+	SEQUENCE {
+	nR-CGI	NR-CGI,
+	iE-Extensions	ProtocolExtensionContainer { {CellId-Broadcast-List-5GS-ExtIEs} } OPTIONAL,
+	...
+}
+
+CellId-Broadcast-List-5GS-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+CellID-Cancelled-List ::= SEQUENCE (SIZE(1..maxnoofCellID)) OF CellID-Cancelled-Item
+
+CellID-Cancelled-Item ::= SEQUENCE {
+	eCGI	EUTRAN-CGI,
+	numberOfBroadcasts	NumberOfBroadcasts,
+	iE-Extensions	ProtocolExtensionContainer { {CellID-Cancelled-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+CellID-Cancelled-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+CellID-Cancelled-List-5GS ::= SEQUENCE (SIZE(1..maxnoofCellsin5GS)) OF 
+	SEQUENCE {
+	nR-CGI	NR-CGI,
+	numberOfBroadcasts	NumberOfBroadcasts,
+	iE-Extensions	ProtocolExtensionContainer { {CellID-Cancelled-5GS-ExtIEs} } OPTIONAL,
+	...
+}
+
+CellID-Cancelled-5GS-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+
+
+CellIdentity	::= BIT STRING (SIZE (28))
+
+Concurrent-Warning-Message-Indicator ::= ENUMERATED {true}
+
+Criticality-Diagnostics	::= SEQUENCE {
+	procedureCode	ProcedureCode	OPTIONAL,
+	triggeringMessage	TriggeringMessage	OPTIONAL,
+	procedureCriticality	Criticality	OPTIONAL,
+	iE-CriticalityDiagnostics	CriticalityDiagnostics-IE-List 	OPTIONAL,
+	iE-Extensions	ProtocolExtensionContainer { {CriticalityDiagnostics-ExtIEs} } OPTIONAL,
+	...
+}
+
+CriticalityDiagnostics-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+CriticalityDiagnostics-IE-List ::= SEQUENCE (SIZE (1..maxNrOfErrors)) OF
+	SEQUENCE {
+	iECriticality	Criticality,
+	iE-ID	ProtocolIE-ID,
+	typeOfError 	TypeOfError,
+	iE-Extensions	ProtocolExtensionContainer {{CriticalityDiagnostics-IE-Item-ExtIEs}} OPTIONAL,
+	...
+}
+
+CriticalityDiagnostics-IE-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+
+
+-- D
+
+Data-Coding-Scheme	::= BIT STRING (SIZE (8))
+
+-- E
+
+ECGIList		::= SEQUENCE (SIZE(1..maxnoofCellID)) OF EUTRAN-CGI
+
+Emergency-Area-ID-List	::=	SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF Emergency-Area-ID
+
+Emergency-Area-ID	::=	OCTET STRING (SIZE (3)) 
+
+EmergencyAreaID-Broadcast-List ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaID-Broadcast-List-Item
+
+EmergencyAreaID-Broadcast-List-Item ::= SEQUENCE {
+	emergencyAreaID	Emergency-Area-ID,
+	scheduledCellinEAI	ScheduledCellinEAI,
+	iE-Extensions	ProtocolExtensionContainer { {EmergencyAreaID-Broadcast-List-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+EmergencyAreaID-Broadcast-List-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+EmergencyAreaID-Cancelled-List ::= SEQUENCE (SIZE(1..maxnoofEmergencyAreaID)) OF EmergencyAreaID-Cancelled-Item
+
+EmergencyAreaID-Cancelled-Item ::= SEQUENCE {
+	emergencyAreaID	Emergency-Area-ID,
+	cancelledCellinEAI	CancelledCellinEAI,
+	iE-Extensions	ProtocolExtensionContainer { {EmergencyAreaID-Cancelled-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+EmergencyAreaID-Cancelled-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+EUTRAN-CGI ::= SEQUENCE {
+	pLMNidentity	PLMNidentity,
+	cell-ID		CellIdentity,
+	iE-Extensions	ProtocolExtensionContainer { {EUTRAN-CGI-ExtIEs} } OPTIONAL,
+	...
+}
+
+EUTRAN-CGI-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+Extended-Repetition-Period ::= INTEGER (4096..131071)
+
+ENB-ID ::= CHOICE {
+	macroENB-ID	BIT STRING (SIZE(20)),
+	homeENB-ID	BIT STRING (SIZE(28)),
+	...,
+	short-macroENB-ID 	BIT STRING (SIZE(18)),
+	long-macroENB-ID	BIT STRING (SIZE(21))
+}
+
+
+-- F
+
+Failed-Cell-List	::= SEQUENCE (SIZE(1..maxnoofFailedCells)) OF EUTRAN-CGI
+
+Failed-Cell-List-NR	::= SEQUENCE (SIZE(1..maxnoofCellsingNB)) OF NR-CGI  
+
+-- G
+
+Global-ENB-ID ::= SEQUENCE {
+	pLMNidentity	PLMNidentity,
+	eNB-ID		ENB-ID,
+	iE-Extensions	ProtocolExtensionContainer { {GlobalENB-ID-ExtIEs} }	OPTIONAL,
+	...
+}
+
+GlobalENB-ID-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+Global-RAN-Node-ID 	::= CHOICE {
+	global-GNB-ID	Global-GNB-ID,
+	global-NgENB-ID	Global-NgENB-ID,
+	...
+}
+
+Global-GNB-ID 	::= SEQUENCE {
+	pLMNidentity	PLMNidentity,
+	gNB-ID	GNB-ID,
+	iE-Extensions	ProtocolExtensionContainer { {Global-GNB-ID-ExtIEs} } OPTIONAL,
+	...
+}
+
+Global-GNB-ID-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+GNB-ID 	::= CHOICE {
+	gNB-ID	BIT STRING (SIZE(22..32)),
+	...
+}
+Global-NgENB-ID	::= SEQUENCE {
+	pLMNidentity	PLMNidentity,
+	ngENB-ID	ENB-ID,
+	iE-Extensions	ProtocolExtensionContainer { {Global-NgENB-ID-ExtIEs} } OPTIONAL,
+	...
+}
+
+Global-NgENB-ID-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+
+
+-- H
+
+-- I
+
+-- J
+
+-- K
+
+-- L
+
+List-of-TAIs	::= SEQUENCE (SIZE (1..maxNrOfTAIs)) OF
+	SEQUENCE {
+	tai		TAI
+}
+
+List-of-TAIs-Restart	::= SEQUENCE (SIZE (1..maxnoofRestartTAIs)) OF
+	SEQUENCE {
+	tai		TAI
+}
+
+
+List-of-EAIs-Restart	::= SEQUENCE (SIZE(1..maxnoofRestartEAIs)) OF Emergency-Area-ID
+
+List-of-5GS-TAIs	::= SEQUENCE (SIZE (1..maxnoof5GSTAIs)) OF TAI-5GS
+
+List-of-5GS-Cells-for-Failure ::= SEQUENCE ( SIZE(1..maxnoofCellsingNB)) OF NR-CGI
+
+List-of-5GS-TAI-for-Restart ::= SEQUENCE (SIZE (1..maxnoofRestart5GSTAIs)) OF TAI-5GS
+
+
+-- M
+
+Message-Identifier ::= BIT STRING (SIZE (16))
+
+-- N
+
+Number-of-Broadcasts-Requested	::= INTEGER (0..65535)
+
+-- For Number-of-Broadcasts-Requested = 0 and Repetition-Period = 0, then eNB action is no broadcast
+--  for ETWS Secondary and CMAS.
+--
+-- For Number-of-Broadcasts-Requested = 1 and Repetition-Period = 0, then eNB action is broadcast
+-- only once for ETWS and CMAS.
+--
+-- For Number-of-Broadcasts-Requested = 0 and Repetition-Period > 0, then eNB action is no broadcast
+-- for the ETWS Secondary, and broadcast until further notice for the CMAS.
+--
+-- For Number-of-Broadcasts-Requested > 0 and Repetition-Period > 0, then eNB action is normal
+-- broadcast.
+-- All other combinations of Number-of-Broadcasts-Requested and Repetition-Period are considered
+-- invalid. 
+
+NumberOfBroadcasts ::= INTEGER (0..65535)
+
+NR-CGIList ::= SEQUENCE (SIZE(1..maxnoofCellsingNB)) OF NR-CGI
+
+NR-CGI ::= SEQUENCE {
+	pLMNidentity	PLMNidentity,
+	nRCellIdentity	NRCellIdentity,
+	iE-Extensions	ProtocolExtensionContainer { {NR-CGI-ExtIEs} } OPTIONAL,
+	...
+}
+
+NR-CGI-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+NRCellIdentity 	::= BIT STRING (SIZE(36))
+
+NgENB-ID 	::= CHOICE {
+	macroNgENB-ID	BIT STRING (SIZE(20)),
+	shortMacroNgENB-ID 	BIT STRING (SIZE(18)),
+	longMacroNgENB-ID	BIT STRING (SIZE(21)),
+	...
+}
+
+-- O 
+Omc-Id		::=	OCTET STRING (SIZE (1..20))
+
+
+-- P
+PLMNidentity 	::= TBCD-STRING 
+
+-- Q
+
+-- R
+
+Repetition-Period	::= INTEGER (0..4096)
+-- 1 to 4096: Each unit represents a repetition of one second to a maximum of
+-- once per 4096 seconds (~1 hour). 
+-- 0: no repetition
+-- A CBC compliant to this version or later of this specification shall not send a repetition period 
+-- greater than 4095.
+-- For backwards compatibility with a CBC compliant to an earlier version of this specification the 
+-- maximum value of the repetition period defined in ASN.1 remains at 4096.
+-- If the value of the Repetition Period IE received in the WRITE-REPLACE WARNING REQUEST message is 
+-- set to 4096, the MME shall set the Repetition Period IE to the maximum value 4095 supported on   
+-- the S1-MME interface as defined in [7] before forwarding to the selected eNBs. 
+
+Restarted-Cell-List	::= SEQUENCE (SIZE(1.. maxnoofRestartedCells)) OF EUTRAN-CGI
+
+RAT-Selector-5GS ::= ENUMERATED {true}
+
+Restarted-Cell-List-NR ::= SEQUENCE (SIZE(1.. maxnoofCellsforRestartNR)) OF NR-CGI
+
+  
+ 
+-- S
+
+ScheduledCellinEAI ::= SEQUENCE (SIZE(1..maxnoofCellinEAI)) OF ScheduledCellinEAI-Item
+
+ScheduledCellinEAI-Item ::= SEQUENCE {
+	eCGI		EUTRAN-CGI,
+	iE-Extensions	ProtocolExtensionContainer { {ScheduledCellinEAI-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+ScheduledCellinEAI-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+ScheduledCellinTAI ::= SEQUENCE (SIZE(1..maxnoofCellinTAI)) OF ScheduledCellinTAI-Item
+
+ScheduledCellinTAI-Item ::= SEQUENCE{
+	eCGI	EUTRAN-CGI,
+	iE-Extensions	ProtocolExtensionContainer { {ScheduledCellinTAI-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+ScheduledCellinTAI-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+ScheduledCellinTAI-5GS ::= SEQUENCE (SIZE(1..maxnoofCellsin5GSTAI)) OF 
+	SEQUENCE{
+	nR-CGI	NR-CGI,
+	iE-Extensions	ProtocolExtensionContainer { {ScheduledCellinTAI-5GS-ExtIEs} } OPTIONAL,
+	...
+}
+
+ScheduledCellinTAI-5GS-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+Send-Write-Replace-Warning-Indication ::= ENUMERATED {true}
+
+Send-Stop-Warning-Indication ::= ENUMERATED {true}
+
+Serial-Number	::= BIT STRING (SIZE (16))
+
+Stop-All-Indicator ::= ENUMERATED {true}
+
+-- T
+
+TAC ::= OCTET STRING (SIZE (2)) 
+
+TAC-5GS ::= OCTET STRING (SIZE (3)) 
+
+TAI-Broadcast-List ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAI-Broadcast-List-Item
+
+TAI-Broadcast-List-Item ::= SEQUENCE {
+	tAI		TAI,
+	scheduledCellinTAI	ScheduledCellinTAI,
+	iE-Extensions	ProtocolExtensionContainer { {TAI-Broadcast-List-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+TAI-Broadcast-List-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+TAI-Broadcast-List-5GS ::= SEQUENCE (SIZE(1..maxnoof5GSTAIs)) OF 
+	SEQUENCE {
+	tAI-5GS		TAI-5GS,
+	scheduledCellinTAI-5GS	ScheduledCellinTAI-5GS,
+	iE-Extensions	ProtocolExtensionContainer { {TAI-Broadcast-List-5GS-ExtIEs} } OPTIONAL,
+	...
+}
+
+TAI-Broadcast-List-5GS-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+
+TAI-Cancelled-List ::= SEQUENCE (SIZE(1..maxnoofTAIforWarning)) OF TAI-Cancelled-List-Item
+
+TAI-Cancelled-List-Item ::= SEQUENCE {
+	tAI		TAI,
+	cancelledCellinTAI	CancelledCellinTAI,
+	iE-Extensions	ProtocolExtensionContainer { {TAI-Cancelled-List-Item-ExtIEs} } OPTIONAL,
+	...
+}
+
+TAI-Cancelled-List-Item-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+TAI-Cancelled-List-5GS ::= SEQUENCE (SIZE(1..maxnoof5GSTAIs)) OF 
+	SEQUENCE {
+	tAI-5GS		TAI-5GS,
+	cancelledCellinTAI-5GS	CancelledCellinTAI-5GS,
+	iE-Extensions	ProtocolExtensionContainer { {TAI-Cancelled-List-5GS-ExtIEs} } OPTIONAL,
+	...
+}
+
+TAI-Cancelled-List-5GS-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+TAI-List-for-Warning	::= SEQUENCE (SIZE(1.. maxnoofTAIforWarning)) OF TAI
+
+TAI ::= SEQUENCE {
+	pLMNidentity	PLMNidentity,
+	tAC		TAC,
+	iE-Extensions	ProtocolExtensionContainer { {TAI-ExtIEs} } OPTIONAL
+}
+
+TAI-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+TBCD-STRING ::= OCTET STRING (SIZE (3))
+
+TypeOfError ::= ENUMERATED {
+	not-understood,
+	missing,
+	...
+}
+TAI-5GS ::= SEQUENCE {
+	pLMNidentity	PLMNidentity,
+	tAC-5GS		TAC-5GS,
+	iE-Extensions	ProtocolExtensionContainer { {TAI-5GS-ExtIEs} } OPTIONAL
+}
+
+TAI-5GS-ExtIEs SBC-AP-PROTOCOL-EXTENSION ::= {
+	...
+}
+
+
+-- U
+
+Unknown-Tracking-Area-List	::= SEQUENCE (SIZE(1.. maxNrOfTAIs)) OF TAI
+
+Unknown-5GS-Tracking-Area-List	::= SEQUENCE (SIZE(1.. maxnoof5GSTAIs)) OF TAI-5GS
+
+
+-- V
+
+-- W
+
+Warning-Area-List	::= CHOICE {
+	cell-ID-List	ECGIList,
+	tracking-Area-List-for-Warning		TAI-List-for-Warning,
+	emergency-Area-ID-List	Emergency-Area-ID-List,
+	...
+}
+
+Warning-Message-Content	::= OCTET STRING (SIZE (1..9600)) 
+Warning-Area-Coordinates	::= OCTET STRING (SIZE (1..1024))
+Warning-Security-Information	::= OCTET STRING (SIZE (50)) 
+Warning-Type		::=  OCTET STRING (SIZE (2))
+
+Warning-Area-List-5GS	::= CHOICE {
+	cell-ID-List		ECGIList,
+	nR-CGIList		NR-CGIList,
+	tAIList-5GS		TAI-5GS,
+	emergencyAreaIDList	Emergency-Area-ID-List,
+	...
+}
+
+
+
+-- X
+
+-- Y
+
+END
diff --git a/library/sbcap/SBC_AP_PDU_Contents.asn b/library/sbcap/SBC_AP_PDU_Contents.asn
new file mode 100644
index 0000000..1117432
--- /dev/null
+++ b/library/sbcap/SBC_AP_PDU_Contents.asn
@@ -0,0 +1,374 @@
+-- SBC-AP-PDU-Contents.asn
+--
+-- Taken from 3GPP TS 29.168  V15.1.0 (2018-09)
+-- http://www.3gpp.org/ftp/Specs/archive/29_series/29.168/29168-930.zip
+--
+-- 4.4.4	PDU Definitions
+--
+
+-- **************************************************************
+--
+-- PDU definitions for SBC-AP.
+--
+-- **************************************************************
+
+SBC-AP-PDU-Contents {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) sbc-AP (3) version1 (1) sbc-AP-PDU-Contents (1)}
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+	
+	Cause,
+	Concurrent-Warning-Message-Indicator,
+	Criticality-Diagnostics,
+	Data-Coding-Scheme,
+	Message-Identifier,
+	Serial-Number,
+	List-of-TAIs,
+	Warning-Area-List, 
+	Omc-Id,
+	Repetition-Period, 
+	Extended-Repetition-Period,
+	Number-of-Broadcasts-Requested,
+	Warning-Type,
+	Warning-Security-Information,
+	Warning-Message-Content,
+	Warning-Area-Coordinates,
+	Send-Write-Replace-Warning-Indication,
+	Broadcast-Scheduled-Area-List,
+	Unknown-Tracking-Area-List,
+	Send-Stop-Warning-Indication,
+	Broadcast-Cancelled-Area-List,
+	Stop-All-Indicator,
+	Broadcast-Empty-Area-List,
+	Restarted-Cell-List,
+	Global-ENB-ID,
+	List-of-TAIs-Restart,
+	List-of-EAIs-Restart,
+	Failed-Cell-List,
+	List-of-5GS-TAIs,
+	Warning-Area-List-5GS,
+	Global-RAN-Node-ID,
+	Global-GNB-ID,
+	RAT-Selector-5GS,
+	Unknown-5GS-Tracking-Area-List,
+	Broadcast-Scheduled-Area-List-5GS,
+	Broadcast-Cancelled-Area-List-5GS,
+	Broadcast-Empty-Area-List-5GS,
+	Restarted-Cell-List-NR,
+	Failed-Cell-List-NR,
+	List-of-5GS-TAI-for-Restart
+
+FROM SBC-AP-IEs
+
+	ProtocolExtensionContainer{},
+	ProtocolIE-Container{},
+	SBC-AP-PROTOCOL-EXTENSION,
+	SBC-AP-PROTOCOL-IES
+FROM SBC-AP-Containers
+
+	id-Concurrent-Warning-Message-Indicator,
+	id-Criticality-Diagnostics,
+	id-Cause,
+	id-Data-Coding-Scheme,
+	id-List-of-TAIs,
+	id-Message-Identifier,
+	id-Serial-Number,
+	id-Number-of-Broadcasts-Requested, 
+	id-Omc-Id,
+	id-Radio-Resource-Loading-List,
+	id-Recovery-Indication,
+	id-Repetition-Period, 
+	id-Extended-Repetition-Period,
+	id-Warning-Area-List,
+	id-Warning-Message-Content, 
+	id-Warning-Area-Coordinates,
+	id-Warning-Security-Information,
+	id-Warning-Type, 
+	id-Send-Write-Replace-Warning-Indication,
+	id-Broadcast-Scheduled-Area-List,
+	id-Unknown-Tracking-Area-List,
+	id-Send-Stop-Warning-Indication,
+	id-Broadcast-Cancelled-Area-List,
+	id-Stop-All-Indicator,
+	id-Broadcast-Empty-Area-List,
+	id-Global-ENB-ID,
+	id-Restarted-Cell-List,
+	id-List-of-TAIs-Restart,
+	id-List-of-EAIs-Restart,
+	id-Failed-Cell-List,
+	id-List-of-5GS-TAIs,
+	id-Warning-Area-List-5GS,
+	id-Global-RAN-Node-ID,
+	id-Global-GNB-ID,
+	id-RAT-Selector-5GS,
+	id-Unknown-5GS-Tracking-Area-List,
+	id-Broadcast-Scheduled-Area-List-5GS,
+	id-Broadcast-Cancelled-Area-List-5GS,
+	id-Broadcast-Empty-Area-List-5GS,
+	id-Restarted-Cell-List-NR,
+	id-Failed-Cell-List-NR,
+	id-List-of-5GS-TAI-for-Restart
+
+FROM SBC-AP-Constants;
+
+-- **************************************************************
+--
+-- Write-Replace-Warning-Request
+--
+-- **************************************************************
+
+Write-Replace-Warning-Request ::= SEQUENCE {
+	protocolIEs	ProtocolIE-Container      { {Write-Replace-Warning-Request-IEs} },
+	protocolExtensions	ProtocolExtensionContainer { {Write-Replace-Warning-Request-Extensions} } OPTIONAL,
+	...
+}
+
+Write-Replace-Warning-Request-IEs SBC-AP-PROTOCOL-IES ::= {
+	{ ID id-Message-Identifier	CRITICALITY reject	TYPE Message-Identifier	PRESENCE mandatory } |
+	{ ID id-Serial-Number	CRITICALITY reject	TYPE Serial-Number	PRESENCE mandatory } |
+	{ ID id-List-of-TAIs	CRITICALITY reject	TYPE List-of-TAIs	PRESENCE optional } |
+	{ ID id-Warning-Area-List	CRITICALITY ignore	TYPE Warning-Area-List	PRESENCE optional } |
+	{ ID id-Repetition-Period	CRITICALITY reject	TYPE Repetition-Period	PRESENCE mandatory  } |
+	{ ID id-Extended-Repetition-Period	CRITICALITY reject	TYPE Extended-Repetition-Period	PRESENCE optional  } |
+
+	{ ID id-Number-of-Broadcasts-Requested
+		CRITICALITY reject	TYPE Number-of-Broadcasts-Requested	PRESENCE mandatory } |
+	{ ID id-Warning-Type	CRITICALITY ignore	TYPE Warning-Type	PRESENCE optional } |
+	{ ID id-Warning-Security-Information	CRITICALITY ignore	TYPE Warning-Security-Information	PRESENCE optional } |
+	{ ID id-Data-Coding-Scheme	CRITICALITY ignore	TYPE Data-Coding-Scheme	PRESENCE optional } |
+	{ ID id-Warning-Message-Content
+		CRITICALITY ignore	TYPE Warning-Message-Content	PRESENCE optional } |
+	{ ID id-Omc-Id  CRITICALITY ignore TYPE Omc-Id PRESENCE optional } |
+	{ ID id-Concurrent-Warning-Message-Indicator  CRITICALITY reject TYPE Concurrent-Warning-Message-Indicator PRESENCE optional }	|
+	{ ID id-Send-Write-Replace-Warning-Indication	CRITICALITY ignore	TYPE Send-Write-Replace-Warning-Indication	PRESENCE optional }	|
+	{ ID id-Global-ENB-ID	CRITICALITY ignore	TYPE Global-ENB-ID	PRESENCE optional },
+	... ,
+	{ID id-Warning-Area-Coordinates	CRITICALITY ignore TYPE Warning-Area-Coordinates PRESENCE optional}
+}
+
+Write-Replace-Warning-Request-Extensions SBC-AP-PROTOCOL-EXTENSION ::= {
+	{ ID id-List-of-5GS-TAIs	CRITICALITY ignore	EXTENSION List-of-5GS-TAIs	PRESENCE optional }|
+	{ ID id-Warning-Area-List-5GS	CRITICALITY ignore	EXTENSION Warning-Area-List-5GS	PRESENCE optional }|
+	{ ID id-Global-RAN-Node-ID	CRITICALITY ignore	EXTENSION Global-RAN-Node-ID	PRESENCE optional }|
+	{ ID id-RAT-Selector-5GS	CRITICALITY ignore	EXTENSION RAT-Selector-5GS	PRESENCE optional },
+	...
+}
+
+-- **************************************************************
+--
+-- Write-Replace-Warning-Response
+--
+-- **************************************************************
+
+Write-Replace-Warning-Response ::= SEQUENCE {
+	protocolIEs	ProtocolIE-Container       { {Write-Replace-Warning-Response-IEs} },
+	protocolExtensions	ProtocolExtensionContainer { {Write-Replace-Warning-Response-Extensions} } OPTIONAL,
+	...
+}
+
+Write-Replace-Warning-Response-IEs SBC-AP-PROTOCOL-IES ::= {
+	{ ID id-Message-Identifier	CRITICALITY reject	TYPE Message-Identifier	PRESENCE mandatory } |
+	{ ID id-Serial-Number	CRITICALITY reject	TYPE Serial-Number	PRESENCE mandatory } |
+	{ ID id-Cause	CRITICALITY reject	TYPE Cause		PRESENCE mandatory }	|
+	{ ID id-Criticality-Diagnostics	CRITICALITY ignore	TYPE Criticality-Diagnostics	PRESENCE optional } |
+	{ ID id-Unknown-Tracking-Area-List CRITICALITY ignore	TYPE List-of-TAIs	PRESENCE optional },
+	...
+}
+
+Write-Replace-Warning-Response-Extensions SBC-AP-PROTOCOL-EXTENSION ::= {
+	{ ID id-Unknown-5GS-Tracking-Area-List	CRITICALITY ignore	EXTENSION Unknown-5GS-Tracking-Area-List	PRESENCE optional },
+	...
+}
+
+-- **************************************************************
+--
+-- Stop-Warning-Request
+--
+-- **************************************************************
+
+Stop-Warning-Request ::= SEQUENCE {
+	protocolIEs	ProtocolIE-Container      { {Stop-Warning-Request-IEs} },
+	protocolExtensions	ProtocolExtensionContainer { {Stop-Warning-Request-Extensions} } OPTIONAL,
+	...
+}
+
+Stop-Warning-Request-IEs SBC-AP-PROTOCOL-IES ::= {
+	{ ID id-Message-Identifier	CRITICALITY reject	TYPE Message-Identifier	PRESENCE mandatory } |
+	{ ID id-Serial-Number	CRITICALITY reject	TYPE Serial-Number	PRESENCE mandatory } |
+	{ ID id-List-of-TAIs	CRITICALITY reject	TYPE List-of-TAIs	PRESENCE optional } |
+	{ ID id-Warning-Area-List	CRITICALITY ignore	TYPE Warning-Area-List	PRESENCE optional }|
+	{ ID id-Omc-Id  CRITICALITY ignore TYPE Omc-Id PRESENCE optional } |
+	{ ID id-Send-Stop-Warning-Indication	CRITICALITY ignore	TYPE Send-Stop-Warning-Indication	PRESENCE optional } |
+	{ ID id-Stop-All-Indicator	CRITICALITY reject 	TYPE Stop-All-Indicator	PRESENCE optional},
+	...	
+}
+
+Stop-Warning-Request-Extensions SBC-AP-PROTOCOL-EXTENSION ::= {
+	{ ID id-List-of-5GS-TAIs	CRITICALITY ignore	EXTENSION List-of-5GS-TAIs	PRESENCE optional }|
+	{ ID id-Warning-Area-List-5GS	CRITICALITY ignore	EXTENSION Warning-Area-List-5GS	PRESENCE optional } |	{ ID id-RAT-Selector-5GS	CRITICALITY ignore	EXTENSION RAT-Selector-5GS	PRESENCE optional },
+	...
+}
+
+-- **************************************************************
+--
+-- Stop-Warning-Response
+--
+-- **************************************************************
+
+Stop-Warning-Response ::= SEQUENCE {
+	protocolIEs	ProtocolIE-Container       { {Stop-Warning-Response-IEs} },
+	protocolExtensions	ProtocolExtensionContainer { {Stop-Warning-Response-Extensions} } OPTIONAL,
+	...
+}
+
+Stop-Warning-Response-IEs SBC-AP-PROTOCOL-IES ::= {
+	{ ID id-Message-Identifier	CRITICALITY reject	TYPE Message-Identifier	PRESENCE mandatory } |
+	{ ID id-Serial-Number	CRITICALITY reject	TYPE Serial-Number	PRESENCE mandatory } |
+	{ ID id-Cause	CRITICALITY reject	TYPE Cause		PRESENCE mandatory }	|
+	{ ID id-Criticality-Diagnostics	CRITICALITY ignore	TYPE Criticality-Diagnostics	PRESENCE optional } |
+	{ ID id-Unknown-Tracking-Area-List CRITICALITY ignore	TYPE List-of-TAIs	PRESENCE optional },
+	...
+}
+
+Stop-Warning-Response-Extensions SBC-AP-PROTOCOL-EXTENSION ::= {
+	{ ID id-Unknown-5GS-Tracking-Area-List	CRITICALITY ignore	EXTENSION Unknown-5GS-Tracking-Area-List	PRESENCE optional },
+	...
+}
+
+-- **************************************************************
+--
+-- Write-Replace-Warning-Indication
+--
+-- **************************************************************
+
+Write-Replace-Warning-Indication ::= SEQUENCE {
+	protocolIEs	ProtocolIE-Container       { {Write-Replace-Warning-Indication-IEs} },
+	protocolExtensions	ProtocolExtensionContainer { {Write-Replace-Warning-Indication-Extensions} } OPTIONAL,
+	...
+}
+
+Write-Replace-Warning-Indication-IEs SBC-AP-PROTOCOL-IES ::= {
+	{ ID id-Message-Identifier	CRITICALITY reject	TYPE Message-Identifier	PRESENCE mandatory } |
+	{ ID id-Serial-Number	CRITICALITY reject	TYPE Serial-Number	PRESENCE mandatory } |
+	{ ID id-Broadcast-Scheduled-Area-List	CRITICALITY reject	TYPE Broadcast-Scheduled-Area-List	PRESENCE optional },
+	...
+}
+
+Write-Replace-Warning-Indication-Extensions SBC-AP-PROTOCOL-EXTENSION ::= {
+	{ ID id-Broadcast-Scheduled-Area-List-5GS	CRITICALITY ignore	EXTENSION Broadcast-Scheduled-Area-List-5GS	PRESENCE optional },
+
+	...
+}
+
+-- **************************************************************
+--
+-- Stop-Warning-Indication
+--
+-- **************************************************************
+
+Stop-Warning-Indication ::= SEQUENCE {
+	protocolIEs	ProtocolIE-Container       { {Stop-Warning-Indication-IEs} },
+	protocolExtensions	ProtocolExtensionContainer { {Stop-Warning-Indication-Extensions} } OPTIONAL,
+	...
+}
+
+Stop-Warning-Indication-IEs SBC-AP-PROTOCOL-IES ::= {
+	{ ID id-Message-Identifier	CRITICALITY reject	TYPE Message-Identifier	PRESENCE mandatory } |
+	{ ID id-Serial-Number	CRITICALITY reject	TYPE Serial-Number	PRESENCE mandatory } |
+	{ ID id-Broadcast-Cancelled-Area-List	CRITICALITY reject	TYPE Broadcast-Cancelled-Area-List	PRESENCE optional }|
+	{ ID id-Broadcast-Empty-Area-List	CRITICALITY ignore	TYPE Broadcast-Empty-Area-List	PRESENCE optional },
+	...
+}
+
+Stop-Warning-Indication-Extensions SBC-AP-PROTOCOL-EXTENSION ::= {
+	{ ID id-Broadcast-Cancelled-Area-List-5GS	CRITICALITY ignore	EXTENSION Broadcast-Cancelled-Area-List-5GS	PRESENCE optional }|
+	{ ID id-Broadcast-Empty-Area-List-5GS	CRITICALITY ignore	EXTENSION Broadcast-Empty-Area-List-5GS	PRESENCE optional },
+	...
+}
+
+-- **************************************************************
+--
+-- PWS-Restart-Indication
+--
+-- **************************************************************
+
+PWS-Restart-Indication ::= SEQUENCE {
+	protocolIEs	ProtocolIE-Container       { {PWS-Restart-Indication-IEs} },
+	protocolExtensions	ProtocolExtensionContainer { {PWS-Restart-Indication-Extensions} } OPTIONAL,
+	...
+}
+
+PWS-Restart-Indication-IEs SBC-AP-PROTOCOL-IES ::= {
+	{ ID id-Restarted-Cell-List	CRITICALITY reject	TYPE Restarted-Cell-List	PRESENCE mandatory }|
+	{ ID id-Global-ENB-ID	CRITICALITY reject	TYPE Global-ENB-ID	PRESENCE mandatory } |
+	{ ID id-List-of-TAIs-Restart	CRITICALITY reject	TYPE List-of-TAIs-Restart	PRESENCE mandatory } |
+	{ ID id-List-of-EAIs-Restart	CRITICALITY reject	TYPE List-of-EAIs-Restart	PRESENCE optional },
+	...
+}
+
+PWS-Restart-Indication-Extensions SBC-AP-PROTOCOL-EXTENSION ::= {
+	{ ID id-Restarted-Cell-List-NR	CRITICALITY ignore	EXTENSION Restarted-Cell-List-NR	PRESENCE optional }|
+	{ ID id-List-of-5GS-TAI-for-Restart	CRITICALITY ignore	EXTENSION List-of-5GS-TAI-for-Restart	PRESENCE optional }|
+{ ID id-Global-GNB-ID	CRITICALITY ignore	EXTENSION Global-GNB-ID	PRESENCE optional },
+	...
+}
+
+-- **************************************************************
+--
+-- PWS-Failure-Indication
+--
+-- **************************************************************
+
+PWS-Failure-Indication ::= SEQUENCE {
+	protocolIEs	ProtocolIE-Container       { {PWS-Failure-Indication-IEs} },
+	protocolExtensions	ProtocolExtensionContainer { {PWS-Failure-Indication-Extensions} } OPTIONAL,
+	...
+}
+
+PWS-Failure-Indication-IEs SBC-AP-PROTOCOL-IES ::= {
+	{ ID id-Failed-Cell-List	CRITICALITY reject	TYPE Failed-Cell-List	PRESENCE mandatory }|
+	{ ID id-Global-ENB-ID	CRITICALITY reject	TYPE Global-ENB-ID	PRESENCE mandatory },
+	...
+}
+
+PWS-Failure-Indication-Extensions SBC-AP-PROTOCOL-EXTENSION ::= {
+	{ ID id-Failed-Cell-List-NR	CRITICALITY ignore	EXTENSION Failed-Cell-List-NR	PRESENCE optional }|
+	{ ID id-Global-GNB-ID	CRITICALITY ignore	EXTENSION Global-GNB-ID	PRESENCE optional },
+	...
+}
+
+-- **************************************************************
+--
+-- ERROR INDICATION ELEMENTARY PROCEDURE
+--
+-- **************************************************************
+
+-- **************************************************************
+--
+-- Error Indication
+--
+-- **************************************************************
+
+Error-Indication ::= SEQUENCE {
+	protocolIEs	ProtocolIE-Container       {{ErrorIndicationIEs}},
+	...
+}
+
+ErrorIndicationIEs SBC-AP-PROTOCOL-IES ::= {
+	{ ID id-Cause		CRITICALITY ignore	TYPE Cause		PRESENCE optional	} |
+	{ ID id-Criticality-Diagnostics	CRITICALITY ignore	TYPE Criticality-Diagnostics	PRESENCE optional	} ,
+	...
+}
+
+END
diff --git a/library/sbcap/SBC_AP_PDU_Descriptions.asn b/library/sbcap/SBC_AP_PDU_Descriptions.asn
new file mode 100644
index 0000000..fbb80d5
--- /dev/null
+++ b/library/sbcap/SBC_AP_PDU_Descriptions.asn
@@ -0,0 +1,179 @@
+-- SBC-AP-PDU-Descriptions.asn
+--
+-- Taken from 3GPP TS 29.168 V15.1.0 (2018-09)
+-- http://www.3gpp.org/ftp/Specs/archive/29_series/29.168/29168-930.zip
+--
+-- 4.4.3	Elementary Procedure Definitions
+--
+
+-- **************************************************************
+--
+-- Elementary Procedure definitions
+--
+-- **************************************************************
+
+SBC-AP-PDU-Descriptions {
+itu-t (0) identified-organization (4) etsi (0) mobileDomain (0) 
+eps-Access (21) modules (3) sbc-AP (3) version1 (1) sbc-AP-PDU-Descriptions (0)}
+
+DEFINITIONS AUTOMATIC TAGS ::= 
+
+BEGIN
+
+-- **************************************************************
+--
+-- IE parameter types from other modules.
+--
+-- **************************************************************
+
+IMPORTS
+	Criticality,
+	ProcedureCode
+FROM SBC-AP-CommonDataTypes
+
+	Write-Replace-Warning-Request,
+	Write-Replace-Warning-Response,
+	Stop-Warning-Request,
+	Stop-Warning-Response,
+	Error-Indication,
+	Write-Replace-Warning-Indication,
+	Stop-Warning-Indication,
+	PWS-Restart-Indication,
+	PWS-Failure-Indication
+FROM SBC-AP-PDU-Contents
+
+	id-Write-Replace-Warning, 
+	id-Stop-Warning,
+	id-Error-Indication,
+	id-Write-Replace-Warning-Indication,
+	id-Stop-Warning-Indication,
+	id-PWS-Restart-Indication,
+	id-PWS-Failure-Indication
+FROM SBC-AP-Constants;
+
+-- **************************************************************
+--
+-- Interface Elementary Procedure Class
+--
+-- **************************************************************
+
+SBC-AP-ELEMENTARY-PROCEDURE ::= CLASS {
+	&InitiatingMessage	,
+	&SuccessfulOutcome	OPTIONAL,
+	&UnsuccessfulOutcome	OPTIONAL,
+	&procedureCode	ProcedureCode 	UNIQUE,
+	&criticality	Criticality 	DEFAULT ignore
+}
+WITH SYNTAX {
+	INITIATING MESSAGE	&InitiatingMessage
+	[SUCCESSFUL OUTCOME	&SuccessfulOutcome]
+	[UNSUCCESSFUL OUTCOME	&UnsuccessfulOutcome]
+	PROCEDURE CODE	&procedureCode
+	[CRITICALITY	&criticality]
+}
+
+-- **************************************************************
+--
+-- Interface PDU Definition
+--
+-- **************************************************************
+
+SBC-AP-PDU ::= CHOICE {
+	initiatingMessage	InitiatingMessage,
+	successfulOutcome	SuccessfulOutcome,
+	unsuccessfulOutcome	UnsuccessfulOutcome,
+	...
+}
+
+InitiatingMessage ::= SEQUENCE {
+	procedureCode	SBC-AP-ELEMENTARY-PROCEDURE.&procedureCode	({SBC-AP-ELEMENTARY-PROCEDURES}),
+	criticality	SBC-AP-ELEMENTARY-PROCEDURE.&criticality	({SBC-AP-ELEMENTARY-PROCEDURES}{@procedureCode}),
+	value	SBC-AP-ELEMENTARY-PROCEDURE.&InitiatingMessage	({SBC-AP-ELEMENTARY-PROCEDURES}{@procedureCode})
+}
+
+SuccessfulOutcome ::= SEQUENCE {
+	procedureCode	SBC-AP-ELEMENTARY-PROCEDURE.&procedureCode	({SBC-AP-ELEMENTARY-PROCEDURES}),
+	criticality	SBC-AP-ELEMENTARY-PROCEDURE.&criticality	({SBC-AP-ELEMENTARY-PROCEDURES}{@procedureCode}),
+	value	SBC-AP-ELEMENTARY-PROCEDURE.&SuccessfulOutcome	({SBC-AP-ELEMENTARY-PROCEDURES}{@procedureCode})
+}
+
+UnsuccessfulOutcome ::= SEQUENCE {
+	procedureCode	SBC-AP-ELEMENTARY-PROCEDURE.&procedureCode	({SBC-AP-ELEMENTARY-PROCEDURES}),
+	criticality	SBC-AP-ELEMENTARY-PROCEDURE.&criticality	({SBC-AP-ELEMENTARY-PROCEDURES}{@procedureCode}),
+	value	SBC-AP-ELEMENTARY-PROCEDURE.&UnsuccessfulOutcome	({SBC-AP-ELEMENTARY-PROCEDURES}{@procedureCode})
+}
+
+-- **************************************************************
+--
+-- Interface Elementary Procedure List
+--
+-- **************************************************************
+
+SBC-AP-ELEMENTARY-PROCEDURES SBC-AP-ELEMENTARY-PROCEDURE ::= {
+	SBC-AP-ELEMENTARY-PROCEDURES-CLASS-1	|
+	SBC-AP-ELEMENTARY-PROCEDURES-CLASS-2	,
+	...
+}
+
+SBC-AP-ELEMENTARY-PROCEDURES-CLASS-1 SBC-AP-ELEMENTARY-PROCEDURE ::= {
+	write-Replace-Warning 	|
+	stop-Warning	,
+	...
+}
+
+SBC-AP-ELEMENTARY-PROCEDURES-CLASS-2 SBC-AP-ELEMENTARY-PROCEDURE ::= {
+	error-Indication	|
+	write-Replace-Warning-Indication	|
+	stop-Warning-Indication	|
+	pws-Restart-Indication |
+	pws-Failure-Indication,
+	...
+	}
+
+write-Replace-Warning SBC-AP-ELEMENTARY-PROCEDURE ::= {
+	INITIATING MESSAGE	Write-Replace-Warning-Request
+	SUCCESSFUL OUTCOME	Write-Replace-Warning-Response
+	
+	PROCEDURE CODE	id-Write-Replace-Warning
+	CRITICALITY	reject
+}
+
+stop-Warning SBC-AP-ELEMENTARY-PROCEDURE ::= {
+	INITIATING MESSAGE	Stop-Warning-Request
+	SUCCESSFUL OUTCOME	Stop-Warning-Response
+	
+	PROCEDURE CODE	id-Stop-Warning
+	CRITICALITY	reject
+}
+
+error-Indication SBC-AP-ELEMENTARY-PROCEDURE ::= {
+	INITIATING MESSAGE	Error-Indication
+	PROCEDURE CODE	id-Error-Indication
+	CRITICALITY	ignore
+}
+
+write-Replace-Warning-Indication SBC-AP-ELEMENTARY-PROCEDURE	::= {
+	INITIATING MESSAGE	Write-Replace-Warning-Indication
+	PROCEDURE CODE	id-Write-Replace-Warning-Indication
+	CRITICALITY	ignore
+}
+
+stop-Warning-Indication SBC-AP-ELEMENTARY-PROCEDURE	::= {
+	INITIATING MESSAGE	Stop-Warning-Indication
+	PROCEDURE CODE	id-Stop-Warning-Indication
+	CRITICALITY	ignore
+}
+
+pws-Restart-Indication SBC-AP-ELEMENTARY-PROCEDURE ::= {
+	INITIATING MESSAGE	PWS-Restart-Indication
+	PROCEDURE CODE	id-PWS-Restart-Indication
+	CRITICALITY	ignore
+}
+
+pws-Failure-Indication SBC-AP-ELEMENTARY-PROCEDURE ::= {
+	INITIATING MESSAGE	PWS-Failure-Indication
+	PROCEDURE CODE	id-PWS-Failure-Indication
+	CRITICALITY	ignore
+}
+
+END
diff --git a/library/sbcap/SBC_AP_Templates.ttcn b/library/sbcap/SBC_AP_Templates.ttcn
new file mode 100644
index 0000000..c0c0837
--- /dev/null
+++ b/library/sbcap/SBC_AP_Templates.ttcn
@@ -0,0 +1,276 @@
+module SBC_AP_Templates {
+
+import from General_Types all;
+import from Osmocom_Types all;
+
+import from SBC_AP_IEs all;
+import from SBC_AP_Constants all;
+import from SBC_AP_Containers all;
+import from SBC_AP_PDU_Contents all;
+import from SBC_AP_PDU_Descriptions all;
+
+import from SBC_AP_Types all;
+
+template (value) SBC_AP_PDU
+ts_SBCAP_PWS_RESTART(
+			template (value) Restarted_Cell_List restart_cl,
+			template (value) Global_ENB_ID global_enb_id) := {
+	initiatingMessage := {
+		procedureCode := id_PWS_Restart_Indication,
+		criticality := reject,
+		value_ := {
+			PWS_Restart_Indication := {
+				protocolIEs := {
+					{
+						id := SBC_AP_Constants.id_Restarted_Cell_List,
+						criticality := reject,
+						value_ := { Restarted_Cell_List := restart_cl }
+					}, {
+						id := SBC_AP_Constants.id_Global_ENB_ID,
+						criticality := reject,
+						value_ := { Global_ENB_ID := global_enb_id }
+					}
+					/* List of TAIs (mandatory) */
+					/* List of EAIs (optional) */
+				},
+				protocolExtensions := omit
+			}
+		}
+	}
+}
+
+template (value) SBC_AP_PDU
+ts_SBCAP_PWS_FAILURE(
+			template (value) Failed_Cell_List fail_cl,
+			template (value) Global_ENB_ID global_enb_id) := {
+	initiatingMessage := {
+		procedureCode := id_PWS_Failure_Indication,
+		criticality := reject,
+		value_ := {
+			PWS_Failure_Indication := {
+				protocolIEs := {
+					{
+						id := SBC_AP_Constants.id_Failed_Cell_List,
+						criticality := reject,
+						value_ := { Failed_Cell_List := fail_cl }
+					}, {
+						id := SBC_AP_Constants.id_Global_ENB_ID,
+						criticality := reject,
+						value_ := { Global_ENB_ID := global_enb_id }
+					}
+				},
+				protocolExtensions := omit
+			}
+		}
+	}
+}
+
+/* 4.3.4.2.1 WRITE-REPLACE WARNING REQUEST */
+template (value) SBC_AP_PDU
+ts_SBCAP_WRITE_WARNING(template (value) BIT16 p_msg_id, template (value) BIT16 p_ser_nr,
+		       template (value) uint12_t p_rep_per, template (value) uint16_t p_num_bcast,
+		       template (value) OCT2 p_w_type, OCT1 p_dcs,
+		       template (value) octetstring p_msg_content) := {
+	initiatingMessage := {
+		procedureCode := id_Write_Replace_Warning,
+		criticality := reject,
+		value_ := {
+			write_Replace_Warning_Request := {
+				protocolIEs := {
+					{
+						id := SBC_AP_Constants.id_Message_Identifier,
+						criticality := reject,
+						value_ := { Message_Identifier := p_msg_id }
+					}, {
+						id := SBC_AP_Constants.id_Serial_Number,
+						criticality := reject,
+						value_ := { Serial_Number := p_ser_nr }
+						/* List of TAIs */
+						/* Warning Area List */
+					}, {
+						id := SBC_AP_Constants.id_Repetition_Period,
+						criticality := reject,
+						value_ := { Repetition_Period := p_rep_per }
+						/* Extended Repetition Period */
+					}, {
+						id := SBC_AP_Constants.id_Number_of_Broadcasts_Requested,
+						criticality := reject,
+						value_ := { Number_of_Broadcasts_Requested := p_num_bcast }
+					}, {
+						id := SBC_AP_Constants.id_Warning_Type,
+						criticality := ignore,
+						value_ := { Warning_Type := p_w_type }
+					}, {
+						/* Warning Security Info */
+						/* Data Coding Scheme */
+						id := SBC_AP_Constants.id_Data_Coding_Scheme,
+						criticality := ignore,
+						value_ := { Data_Coding_Scheme := oct2bit(p_dcs) }
+					}, {
+						/* Warning Message Content */
+						id := SBC_AP_Constants.id_Warning_Message_Content,
+						criticality := ignore,
+						value_ := { Warning_Message_Content := p_msg_content }
+					}
+						/* OMC ID */
+						/* Concurrent Warning Message Indicator */
+						/* Send Write Replace Warning Indication */
+						/* Global eNB ID */
+						/* Warning Area Coordinates */
+				},
+				protocolExtensions := omit
+			}
+		}
+	}
+}
+
+template (present) SBC_AP_PDU
+tr_SBCAP_WRITE_WARNING(template (present) BIT16 p_msg_id, template (present) BIT16 p_ser_nr,
+		       template (present) uint12_t p_rep_per,
+		       template (present) uint16_t p_num_bcast,
+		       template (present) BIT8 dcs := ?,
+		       template (present) octetstring p_msg_content := ?
+		       ) := {
+	initiatingMessage := {
+		procedureCode := id_Write_Replace_Warning,
+		criticality := reject,
+		value_ := {
+			write_Replace_Warning_Request := {
+				protocolIEs := {
+					{
+						id := SBC_AP_Constants.id_Message_Identifier,
+						criticality := reject,
+						value_ := { Message_Identifier := p_msg_id }
+					}, {
+						id := SBC_AP_Constants.id_Serial_Number,
+						criticality := reject,
+						value_ := { Serial_Number := p_ser_nr }
+						/* List of TAIs */
+						/* Warning Area List */
+					}, {
+						id := SBC_AP_Constants.id_Repetition_Period,
+						criticality := reject,
+						value_ := { Repetition_Period := p_rep_per }
+						/* Extended Repetition Period */
+					}, {
+						id := SBC_AP_Constants.id_Number_of_Broadcasts_Requested,
+						criticality := reject,
+						value_ := { Number_of_Broadcasts_Requested := p_num_bcast }
+					}/*, {
+						id := SBC_AP_Constants.id_Warning_Type,
+						criticality := ignore,
+						value_ := { Warning_Type := warn_type }
+					}, {
+						id := SBC_AP_Constants.id_Warning_Security_Information,
+						criticality := reject,
+						value_ := { Warning_Security_Information := ? }
+					}*/, {
+						id := SBC_AP_Constants.id_Data_Coding_Scheme,
+						criticality := ignore,
+						value_ := { Data_Coding_Scheme := dcs }
+					}, {
+						/* Warning Message Content */
+						id := SBC_AP_Constants.id_Warning_Message_Content,
+						criticality := ignore,
+						value_ := { Warning_Message_Content := p_msg_content }
+					}
+						/* Warning Message Content */
+						/* OMC ID */
+						/* Concurrent Warning Message Indicator */
+						/* Send Write Replace Warning Indication */
+						/* Global eNB ID */
+						/* Warning Area Coordinates */
+				},
+				protocolExtensions := omit
+			}
+		}
+	}
+}
+
+/* 4.3.4.2.3 STOP WARNING REQUEST */
+template (value) SBC_AP_PDU
+ts_SBCAP_WRITE_WARNING_RESP(template (value) BIT16 p_msg_id, template (value) BIT16 p_ser_nr,
+		       template (value) SBC_AP_Cause cause := SBC_AP_Cause_message_accepted) := {
+	successfulOutcome := {
+		procedureCode := id_Write_Replace_Warning,
+		criticality := reject,
+		value_ := {
+			write_Replace_Warning_Response := {
+				protocolIEs := {
+					{
+						id := SBC_AP_Constants.id_Message_Identifier,
+						criticality := reject,
+						value_ := { Message_Identifier := p_msg_id }
+					}, {
+						id := SBC_AP_Constants.id_Serial_Number,
+						criticality := reject,
+						value_ := { Serial_Number := p_ser_nr }
+					}, {
+						id := SBC_AP_Constants.id_Cause,
+						criticality := reject,
+						value_ := { Cause := enum2int(valueof(cause)) }
+					}
+				},
+				protocolExtensions := omit
+			}
+		}
+	}
+}
+
+template (present) SBC_AP_PDU
+tr_SBCAP_STOP_WARNING(template (present) BIT16 p_msg_id, template (present) BIT16 p_ser_nr) := {
+	initiatingMessage := {
+		procedureCode := id_Stop_Warning,
+		criticality := reject,
+		value_ := {
+			stop_Warning_Request := {
+				protocolIEs := {
+					{
+						id := SBC_AP_Constants.id_Message_Identifier,
+						criticality := reject,
+						value_ := { Message_Identifier := p_msg_id }
+					}, {
+						id := SBC_AP_Constants.id_Serial_Number,
+						criticality := reject,
+						value_ := { Serial_Number := p_ser_nr }
+						/* List of TAIs */
+						/* Warning Area List */
+					}
+				},
+				protocolExtensions := omit
+			}
+		}
+	}
+}
+
+/* 4.3.4.2.4 STOP WARNING RESPONSE */
+template (value) SBC_AP_PDU
+ts_SBCAP_STOP_WARNING_RESP(template (value) BIT16 p_msg_id, template (value) BIT16 p_ser_nr,
+		       template (value) SBC_AP_Cause cause := SBC_AP_Cause_message_accepted) := {
+	successfulOutcome := {
+		procedureCode := id_Stop_Warning,
+		criticality := reject,
+		value_ := {
+			stop_Warning_Response := {
+				protocolIEs := {
+					{
+						id := SBC_AP_Constants.id_Message_Identifier,
+						criticality := reject,
+						value_ := { Message_Identifier := p_msg_id }
+					}, {
+						id := SBC_AP_Constants.id_Serial_Number,
+						criticality := reject,
+						value_ := { Serial_Number := p_ser_nr }
+					}, {
+						id := SBC_AP_Constants.id_Cause,
+						criticality := reject,
+						value_ := { Cause := enum2int(valueof(cause)) }
+					}
+				},
+				protocolExtensions := omit
+			}
+		}
+	}
+}
+
+}
diff --git a/library/sbcap/SBC_AP_Types.ttcn b/library/sbcap/SBC_AP_Types.ttcn
new file mode 100644
index 0000000..cfb043d
--- /dev/null
+++ b/library/sbcap/SBC_AP_Types.ttcn
@@ -0,0 +1,15 @@
+module SBC_AP_Types {
+
+	import from SBC_AP_PDU_Descriptions language "ASN.1:1997" all;
+
+	external function enc_SBC_AP_PDU(in SBC_AP_PDU pdu) return octetstring;
+	external function dec_SBC_AP_PDU(in octetstring stream) return SBC_AP_PDU;
+
+	const integer c_SBC_AP_PPID := 24;
+	const integer c_SBC_AP_PORT := 29168;
+
+	/* 3GPP TS 29.168 4.3.4.3.2 Cause */
+	type enumerated SBC_AP_Cause {
+		SBC_AP_Cause_message_accepted			('00'O)
+	}
+}
diff --git a/library/sbcap/regen_makefile.sh b/library/sbcap/regen_makefile.sh
new file mode 100755
index 0000000..0cd6083
--- /dev/null
+++ b/library/sbcap/regen_makefile.sh
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+FILES="*.asn *.ttcn SBC_AP_EncDec.cc"
+
+../../regen-makefile.sh $FILES
+
+sed -i -e '/^CPPFLAGS/ s/$/ `pkg-config --cflags libfftranscode`/' Makefile
+sed -i -e '/^LDFLAGS/ s/$/ `pkg-config --libs libfftranscode`/' Makefile
+sed -i -e '/^LINUX_LIBS/ s/$/ `pkg-config --libs libfftranscode`/' Makefile