ipa: Pull everything together: L3->BSSAP->SCCP->IPA
diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn
new file mode 100644
index 0000000..8f60b5c
--- /dev/null
+++ b/library/L3_Templates.ttcn
@@ -0,0 +1,112 @@
+module L3_Templates {
+
+import from General_Types all;
+import from MobileL3_Types all;
+import from MobileL3_CommonIE_Types all;
+import from MobileL3_MM_Types all;
+import from MobileL3_RRM_Types all;
+
+type enumerated CmServiceType {
+	CM_TYPE_MO_CALL		('0001'B),
+	CM_TYPE_EMERG_CALL	('0010'B),
+	CM_TYPE_MO_SMS		('0100'B),
+	CM_TYPE_SS_ACT		('1000'B)
+}
+
+
+/* send template fro Mobile Identity (TMSI) */
+template MobileIdentityLV ts_MI_TMSI_LV(OCT4 tmsi) := {
+	lengthIndicator := 0, /* overwritten */
+	mobileIdentityV := {
+		typeOfIdentity := '000'B,	/* overwritten */
+		oddEvenInd_identity := {
+			tmsi_ptmsi := {
+				oddevenIndicator := '0'B,
+				fillerDigit := '1111'B,
+				octets := tmsi
+			}
+		}
+	}
+}
+
+private function f_enc_IMSI_L3(hexstring digits) return IMSI_L3 {
+	var IMSI_L3 l3;
+	var integer len := lengthof(digits);
+	if (len rem 2 == 1) {	/* modulo remainder */
+		l3.oddevenIndicator := '0'B;
+		l3.fillerDigit := '1111'B;
+	} else {
+		l3.oddevenIndicator := '1'B;
+		l3.fillerDigit := omit;
+	}
+	l3.digits := digits;
+	return l3;
+}
+
+/* send template fro Mobile Identity (IMSI) */
+template (value) MobileIdentityLV ts_MI_IMSI_LV(hexstring imsi_digits) := {
+	lengthIndicator := 0, /* overwritten */
+	mobileIdentityV := {
+		typeOfIdentity := '000'B, /* overwritten */
+		oddEvenInd_identity := {
+			imsi := f_enc_IMSI_L3(imsi_digits)
+		}
+	}
+}
+
+/* Send template for Classmark 2 */
+template (value) MobileStationClassmark2_LV ts_CM2 := {
+	lengthIndicator := 0,
+	rf_PowerCapability := '000'B,
+	a5_1 := '0'B,
+	esind := '1'B,
+	revisionLevel := '10'B,
+	spare1_1 := '0'B,
+	mobileStationClassmark2_oct4 := omit,
+	mobileStationClassmark2_oct5 := omit
+};
+
+/* Send template for CM SERVICE REQUEST */
+template (value) PDU_ML3_MS_NW ts_CM_SERV_REQ(BIT4 serv_type, MobileIdentityLV mi_lv) := {
+	discriminator := '0000'B, /* overwritten */
+	tiOrSkip := {
+		skipIndicator := '0000'B
+	},
+	msgs := {
+		mm := {
+			cMServiceRequest := {
+				messageType := '000000'B, /* overwritten */
+				nsd := '00'B,
+				cm_ServiceType := serv_type,
+				cipheringKeySequenceNumber := { '000'B, '0'B },
+				mobileStationClassmark2 := ts_CM2,
+				mobileIdentity := mi_lv,
+				priorityLevel := omit,
+				additionalUpdateParameterTV := omit,
+				deviceProperties := omit
+			}
+		}
+	}
+}
+
+/* Send template for PAGING RESPONSE */
+template (value) PDU_ML3_MS_NW ts_PAG_RESP(MobileIdentityLV mi_lv) := {
+	discriminator := '0000'B, /* overwritten */
+	tiOrSkip := {
+		skipIndicator := '0000'B
+	},
+	msgs := {
+		rrm := {
+			pagingResponse := {
+				messageType := '00000000'B, /* overwritten */
+				cipheringKeySequenceNumber := { '000'B, '0'B },
+				spare1_4 := '0000'B,
+				mobileStationClassmark := ts_CM2,
+				mobileIdentity := mi_lv,
+				additionalUpdateParameters := omit
+			}
+		}
+	}
+}
+
+}