diff --git a/library/CBSP_Templates.ttcn b/library/CBSP_Templates.ttcn
new file mode 100644
index 0000000..3c60f14
--- /dev/null
+++ b/library/CBSP_Templates.ttcn
@@ -0,0 +1,744 @@
+module CBSP_Templates {
+
+import from Osmocom_Types all;
+import from BSSAP_Types all;
+import from CBSP_Types all;
+
+/* TODO: receive templates must match IEs in any arbitrary order */
+
+/* For some reason the TTCN-3 RAW codec cannot automatically figure out the IEI
+ * that it needs to set for a given union-choice (body).  So we have to explicitly
+ * specify the IEI by the caller :( */
+template (value) CBSP_IE ts_CBSP_IE(CBSP_IEI iei, template (value) CBSP_IE_Body body) := {
+	iei := iei,
+	body := body
+}
+
+template CBSP_IE tr_CBSP_IE(template CBSP_IE_Body body) := {
+	iei := ?,
+	body := body
+}
+
+
+template (value) CBSP_IE ts_CbspMsgId(template (value) uint16_t val) :=
+	ts_CBSP_IE(CBSP_IEI_MSG_ID, {msg_id := val});
+template CBSP_IE tr_CbspMsgId(template uint16_t val := ?) :=
+	tr_CBSP_IE({msg_id := val});
+
+template (value) CBSP_IE ts_NewSerNo(template (value) uint16_t val) :=
+	ts_CBSP_IE(CBSP_IEI_NEW_SERIAL_NR, {new_ser_nr := val});
+template CBSP_IE tr_NewSerNo(template uint16_t val := ?) :=
+	tr_CBSP_IE({new_ser_nr := val});
+
+template (value) CBSP_IE ts_OldSerNo(template (value) uint16_t val) :=
+	ts_CBSP_IE(CBSP_IEI_OLD_SERIAL_NR, {old_ser_nr := val});
+template CBSP_IE tr_OldSerNo(template uint16_t val := ?) :=
+	tr_CBSP_IE({old_ser_nr := val});
+
+template (value) CBSP_IE ts_CbspKARepPeriod(template (value) uint8_t rep_per) :=
+	ts_CBSP_IE(CBSP_IEI_KEEP_ALIVE_REP_PERIOD, {keep_alive_rep_period := rep_per});
+template CBSP_IE tr_CbspKARepPeriod(template uint8_t rep_per := ?) :=
+	tr_CBSP_IE({keep_alive_rep_period := rep_per});
+
+function ts_CbspChannelInd(template (omit) uint8_t val) return template (omit) CBSP_IE {
+	var template (omit) CBSP_IE ie;
+	if (istemplatekind(val, "omit")) {
+		ie := omit;
+	} else {
+		ie := ts_CBSP_IE(CBSP_IEI_CHANNEL_IND, {channel_ind := val});
+	}
+	return ie;
+}
+function tr_CbspChannelInd(template uint8_t val := ?) return template CBSP_IE {
+	var template CBSP_IE ie;
+	if (istemplatekind(val, "omit")) {
+		ie := omit;
+	} else if (istemplatekind(val, "*")) {
+		ie := tr_CBSP_IE({channel_ind := ?}) ifpresent;
+	} else {
+		ie := tr_CBSP_IE({channel_ind := val});
+	}
+	return ie;
+}
+
+template (value) CBSP_IE ts_CbspCause(template (value) CBSP_Cause c) :=
+	ts_CBSP_IE(CBSP_IEI_CAUSE, {cause := c});
+template CBSP_IE tr_CbspCause(template CBSP_Cause c := ?) :=
+	tr_CBSP_IE({cause := c});
+
+template (value) CBSP_IE ts_CbspCellList(template (value) BSSMAP_FIELD_CellIdentificationList list) :=
+	ts_CBSP_IE(CBSP_IEI_CELL_LIST, {
+			cell_list := {
+				len := 0,
+				spare1_4 := '0000'B,
+				cell_id_discr := '0000'B,
+				cell_id := list
+			}});
+template CBSP_IE tr_CbspCellList(template BSSMAP_FIELD_CellIdentificationList list := ?) :=
+	tr_CBSP_IE({
+			cell_list := {
+				len := ?,
+				spare1_4 := ?,
+				cell_id_discr := ?,
+				cell_id := list
+			}});
+
+template (value) CBSP_IE ts_CbspCategory(template (value) CBSP_Category cat) :=
+	ts_CBSP_IE(CBSP_IEI_CATEGORY, {category := cat});
+template CBSP_IE tr_CbspCategory(template CBSP_Category cat := ?) :=
+	tr_CBSP_IE({category := cat});
+
+template (value) CBSP_IE ts_CbspRepetitionPeriod(template (value) uint16_t per) :=
+	ts_CBSP_IE(CBSP_IEI_REP_PERIOD, {rep_period := per});
+template CBSP_IE tr_CbspRepetitionPeriod(template uint16_t per := ?) :=
+	tr_CBSP_IE({rep_period := per});
+
+template (value) CBSP_IE ts_CbspNumBcastReq(template (value) uint16_t num) :=
+	ts_CBSP_IE(CBSP_IEI_NUM_BCAST_REQ, {num_bcast_req := num});
+template CBSP_IE tr_CbspNumBcastReq(template uint16_t num := ?) :=
+	tr_CBSP_IE({num_bcast_req := num});
+
+template (value) CBSP_IE ts_CbspNumPages(template (value) uint8_t num) :=
+	ts_CBSP_IE(CBSP_IEI_NUM_OF_PAGES, {num_of_pages := num});
+template CBSP_IE tr_CbspNumPages(template uint16_t num := ?) :=
+	tr_CBSP_IE({num_of_pages := num});
+
+template (value) CBSP_IE ts_EmergencyInd(template (value) uint8_t val) :=
+	ts_CBSP_IE(CBSP_IEI_EMERG_IND, {emerg_ind := val});
+template CBSP_IE tr_EmergencyInd(template uint8_t val := ?) :=
+	tr_CBSP_IE({emerg_ind := val});
+
+template (value) CBSP_IE ts_WarningType(template (value) uint16_t val) :=
+	ts_CBSP_IE(CBSP_IEI_WARN_TYPE, {warn_type := val});
+template CBSP_IE tr_WarningType(template uint16_t val) :=
+	tr_CBSP_IE({warn_type := val});
+
+template (value) CBSP_IE ts_WarnSecInfo(template (value) octetstring payl := ''O) :=
+	ts_CBSP_IE(CBSP_IEI_WARN_SEC_INFO, {warn_sec_info := payl});
+template CBSP_IE tr_WarnSecInfo(template octetstring payl := ?) :=
+	tr_CBSP_IE({warn_sec_info := payl});
+
+template (value) CBSP_IE ts_WarningPeriod(template (value) uint8_t val) :=
+	ts_CBSP_IE(CBSP_IEI_WARNING_PERIOD, {warning_period := val});
+template CBSP_IE tr_WarningPeriod(template uint8_t val := ?) :=
+	tr_CBSP_IE({warning_period := val});
+
+template (value) CBSP_IE ts_CbspFailList(template (value) CBSP_FailureListItems items) :=
+	ts_CBSP_IE(CBSP_IEI_FAILURE_LIST, {failure_list := {
+						len := 0,
+						list := items
+				}});
+template CBSP_IE tr_CbspFailList(template CBSP_FailureListItems items := ?) :=
+	tr_CBSP_IE({failure_list := {
+						len := 0,
+						list := items
+				}});
+
+template (value) CBSP_IE ts_CbspNumComplList(template (value) CBSP_IE_NumBcastComplList list) :=
+	ts_CBSP_IE(CBSP_IEI_NUM_BCAST_COMPL_LIST, {num_bcast_compl_list := list});
+template CBSP_IE tr_CbspNumComplList(template CBSP_IE_NumBcastComplList list := ?) :=
+	tr_CBSP_IE({num_bcast_compl_list := list});
+
+template (value) CBSP_IE ts_CbspBcastMsgType(template (value) CBSP_BcastMsgType bi) :=
+	ts_CBSP_IE(CBSP_IEI_BCAST_MSG_TYPE, {bcast_msg_type := {
+			spare1_4 := '0000'B,
+			msg_type := bi
+		}});
+template CBSP_IE tr_CbspBcastMsgType(template CBSP_BcastMsgType bi := ?) :=
+	tr_CBSP_IE({bcast_msg_type := {
+			spare1_4 := ?,
+			msg_type := bi
+		}});
+
+template (value) CBSP_IE ts_CbspRecoveryInd(template (value) CBSP_RecoveryInd ri) :=
+	ts_CBSP_IE(CBSP_IEI_RECOVERY_IND, {recovery_ind := {
+			spare1_4 := '0000'B,
+			recovery := ri
+		}});
+template CBSP_IE tr_CbspRecoveryInd(template CBSP_RecoveryInd ri) :=
+	tr_CBSP_IE({recovery_ind := {
+			spare1_4 := ?,
+			recovery := ri
+		}});
+
+template (value) CBSP_IE ts_CbspMsgContent(template (value) octetstring payload, uint8_t user_len) :=
+	ts_CBSP_IE(CBSP_IEI_MSG_CONTENT, {msg_content := {
+			user_len := user_len,
+			val := payload
+		}});
+template CBSP_IE tr_CbspMsgContent(template octetstring payload := ?, template uint8_t user_len := ?) :=
+	tr_CBSP_IE({msg_content := {
+			user_len := user_len,
+			val := payload
+		}});
+
+template (value) CBSP_IE ts_CbspDCS(template (value) uint8_t dcs) :=
+	ts_CBSP_IE(CBSP_IEI_DCS, {dcs := dcs});
+template CBSP_IE tr_CbspDCS(template uint8_t dcs := ?) :=
+	tr_CBSP_IE({dcs := dcs});
+
+
+template (value) CBSP_PDU ts_CBSP(CBSP_MessageType msg_type, template (value) CBSP_IEs ies) := {
+	msg_type := msg_type,
+	len := 0, /* overwritten */
+	ies := ies
+}
+template CBSP_PDU tr_CBSP(template CBSP_MessageType msg_type := ?, template CBSP_IEs ies := *) := {
+	msg_type := msg_type,
+	len := ?,
+	ies := ies
+}
+
+
+
+/* 8.1.3.1 WRITE REPLACE */
+function ts_CBSP_WRITE_CBS(template (value) uint16_t msg_id,
+			    template (value) uint16_t new_ser_nr,
+			    template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+			    template (value) uint8_t channel_ind,
+			    template (value) CBSP_Category category,
+			    template (value) uint16_t rep_period,
+			    template (value) uint16_t num_bcast_req,
+			    template (value) uint8_t dcs,
+			    template (value) CBSP_IEs content) return template (value) CBSP_PDU {
+	var template (value) CBSP_IEs ies := {
+		ts_CbspMsgId(msg_id),
+		ts_NewSerNo(new_ser_nr),
+		ts_CbspCellList(cell_list),
+		ts_CbspChannelInd(channel_ind),
+		ts_CbspCategory(category),
+		ts_CbspRepetitionPeriod(rep_period),
+		ts_CbspNumBcastReq(num_bcast_req),
+		ts_CbspDCS(dcs),
+		ts_CbspNumPages(lengthof(content))
+	};
+	return ts_CBSP(CBSP_MSGT_WRITE_REPLACE, valueof(ies) & valueof(content));
+}
+template CBSP_PDU tr_CBSP_WRITE_CBS(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?,
+				    template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+				    template uint8_t channel_ind := ?,
+				    template CBSP_Category category := ?,
+				    template uint16_t rep_period := ?,
+				    template uint16_t num_bcast_req := ?,
+				    template uint8_t dcs := ?,
+				    template CBSP_IEs content := ?
+				    ) :=
+	tr_CBSP(CBSP_MSGT_WRITE_REPLACE, ({
+			tr_CbspMsgId(msg_id),
+			tr_NewSerNo(new_ser_nr),
+			tr_CbspCellList(cell_list),
+			tr_CbspChannelInd(channel_ind),
+			tr_CbspCategory(category),
+			tr_CbspRepetitionPeriod(rep_period),
+			tr_CbspNumBcastReq(num_bcast_req),
+			tr_CbspDCS(dcs),
+			tr_CbspNumPages(lengthof(content)), all from content }));
+
+
+function ts_CBSP_REPLACE_CBS(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr,
+			    template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+			    template (value) uint8_t channel_ind,
+			    template (value) CBSP_Category category,
+			    template (value) uint16_t rep_period,
+			    template (value) uint16_t num_bcast_req,
+			    template (value) uint8_t dcs,
+			    template (value) CBSP_IEs content) return template (value) CBSP_PDU {
+	var template (value) CBSP_IEs ies := {
+		ts_CbspMsgId(msg_id),
+		ts_NewSerNo(new_ser_nr),
+		ts_OldSerNo(old_ser_nr),
+		ts_CbspCellList(cell_list),
+		ts_CbspChannelInd(channel_ind),
+		ts_CbspCategory(category),
+		ts_CbspRepetitionPeriod(rep_period),
+		ts_CbspNumBcastReq(num_bcast_req),
+		ts_CbspDCS(dcs),
+		ts_CbspNumPages(lengthof(content))
+	};
+	return ts_CBSP(CBSP_MSGT_WRITE_REPLACE, valueof(ies) & valueof(content));
+}
+template CBSP_PDU tr_CBSP_REPLACE_CBS(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?,
+				      template uint16_t old_ser_nr := ?,
+				      template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+				      template uint8_t channel_ind := ?,
+				      template CBSP_Category category := ?,
+				      template uint16_t rep_period := ?,
+				      template uint16_t num_bcast_req := ?,
+				      template uint8_t dcs := ?,
+				      template CBSP_IEs content := ?
+				    ) :=
+	tr_CBSP(CBSP_MSGT_WRITE_REPLACE, ({
+			tr_CbspMsgId(msg_id),
+			tr_NewSerNo(new_ser_nr),
+			tr_OldSerNo(old_ser_nr),
+			tr_CbspCellList(cell_list),
+			tr_CbspChannelInd(channel_ind),
+			tr_CbspCategory(category),
+			tr_CbspRepetitionPeriod(rep_period),
+			tr_CbspNumBcastReq(num_bcast_req),
+			tr_CbspDCS(dcs),
+			tr_CbspNumPages(lengthof(content)), all from content }));
+
+template (value) CBSP_PDU ts_CBSP_WRITE_EMERG(uint16_t msg_id, uint16_t new_ser_nr,
+						template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+						template (value) uint8_t emerg_ind,
+						template (value) uint16_t warn_type,
+						template (value) uint16_t num_bcast_req,
+						template (value) uint8_t warn_per
+					    ) :=
+	ts_CBSP(CBSP_MSGT_WRITE_REPLACE, {
+			ts_CbspMsgId(msg_id),
+			ts_NewSerNo(new_ser_nr),
+			ts_CbspCellList(cell_list),
+			ts_EmergencyInd(emerg_ind),
+			ts_WarningType(warn_type),
+			ts_WarnSecInfo,
+			ts_WarningPeriod(warn_per) });
+template CBSP_PDU tr_CBSP_WRITE_EMERG(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?,
+					template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+					template uint8_t emerg_ind := ?,
+					template uint16_t warn_type := ?,
+					template uint16_t num_bcast_req := ?,
+					template uint8_t warn_per := ?
+				    ) :=
+	tr_CBSP(CBSP_MSGT_WRITE_REPLACE, {
+			tr_CbspMsgId(msg_id),
+			tr_NewSerNo(new_ser_nr),
+			tr_CbspCellList(cell_list),
+			tr_EmergencyInd(emerg_ind),
+			tr_WarningType(warn_type),
+			tr_WarnSecInfo,
+			tr_WarningPeriod(warn_per) });
+
+
+template (value) CBSP_PDU ts_CBSP_REPLACE_EMERG(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr,
+						template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+						template (value) uint8_t emerg_ind,
+						template (value) uint16_t warn_type,
+						template (value) uint16_t num_bcast_req,
+						template (value) uint8_t warn_per
+					    ) :=
+	ts_CBSP(CBSP_MSGT_WRITE_REPLACE, {
+			ts_CbspMsgId(msg_id),
+			ts_NewSerNo(new_ser_nr),
+			ts_OldSerNo(old_ser_nr),
+			ts_CbspCellList(cell_list),
+			ts_EmergencyInd(emerg_ind),
+			ts_WarningType(warn_type),
+			ts_WarnSecInfo,
+			ts_WarningPeriod(warn_per) });
+template CBSP_PDU tr_CBSP_REPLACE_EMERG(template uint16_t msg_id := ?, template uint16_t new_ser_nr := ?,
+					template uint16_t old_ser_nr := ?,
+					template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+					template uint8_t emerg_ind := ?,
+					template uint16_t warn_type := ?,
+					template uint16_t num_bcast_req := ?,
+					template uint8_t warn_per := ?
+				    ) :=
+	tr_CBSP(CBSP_MSGT_WRITE_REPLACE, {
+			tr_CbspMsgId(msg_id),
+			tr_NewSerNo(new_ser_nr),
+			tr_OldSerNo(old_ser_nr),
+			tr_CbspCellList(cell_list),
+			tr_EmergencyInd(emerg_ind),
+			tr_WarningType(warn_type),
+			tr_WarnSecInfo,
+			tr_WarningPeriod(warn_per) });
+
+/* 8.1.3.2 WRITE-REPLACE COMPLETE */
+function ts_CBSP_WRITE_CBS_COMPL(uint16_t msg_id, uint16_t new_ser_nr,
+				 template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+				 template (value) uint8_t channel_ind)
+return template (value) CBSP_PDU {
+	var template (value) CBSP_IEs ies := {
+		ts_CbspMsgId(msg_id),
+		ts_NewSerNo(new_ser_nr)
+	};
+	if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspCellList(cell_list);
+	}
+	ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
+	return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
+}
+function tr_CBSP_WRITE_CBS_COMPL(template uint16_t msg_id, template uint16_t new_ser_nr,
+				 template BSSMAP_FIELD_CellIdentificationList cell_list,
+				 template uint8_t channel_ind)
+return template CBSP_PDU {
+	var template CBSP_IEs ies := {
+		tr_CbspMsgId(msg_id),
+		tr_NewSerNo(new_ser_nr)
+	};
+	if (istemplatekind(cell_list, "*")) {
+		ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+	} else if (istemplatekind(cell_list, "?")) {
+		ies[lengthof(ies)] := tr_CbspCellList(?);
+	} else if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspCellList(cell_list);
+	}
+	ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
+	return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
+}
+
+
+function ts_CBSP_REPLACE_CBS_COMPL(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr,
+				   template (value) CBSP_IE_NumBcastComplList compl_list,
+				   template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+				   template (value) uint8_t channel_ind)
+return template (value) CBSP_PDU {
+	var template (value) CBSP_IEs ies := {
+		ts_CbspMsgId(msg_id),
+		ts_NewSerNo(new_ser_nr),
+		ts_OldSerNo(old_ser_nr),
+		ts_CbspNumComplList(compl_list)
+	};
+	if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspCellList(cell_list);
+	}
+	ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
+	return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
+}
+function tr_CBSP_REPLACE_CBS_COMPL(template uint16_t msg_id, template uint16_t new_ser_nr,
+				   template uint16_t old_ser_nr,
+				   template CBSP_IE_NumBcastComplList compl_list,
+				   template BSSMAP_FIELD_CellIdentificationList cell_list,
+				   template uint8_t channel_ind)
+return template CBSP_PDU {
+	var template CBSP_IEs ies := {
+		tr_CbspMsgId(msg_id),
+		tr_NewSerNo(new_ser_nr),
+		tr_OldSerNo(old_ser_nr),
+		tr_CbspNumComplList(compl_list)
+	};
+	if (istemplatekind(cell_list, "*")) {
+		ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+	} else if (istemplatekind(cell_list, "?")) {
+		ies[lengthof(ies)] := tr_CbspCellList(?);
+	} else if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspCellList(cell_list);
+	}
+	ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
+	return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_COMPL, ies);
+}
+
+
+/* 8.1.3.3 WRITE-REPLACE FAILURE */
+function ts_CBSP_WRITE_CBS_FAIL(uint16_t msg_id, uint16_t new_ser_nr,
+				template (value) CBSP_FailureListItems fail_list,
+				template (omit) CBSP_IE_NumBcastComplList compl_list,
+				template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+				template (value) uint8_t channel_ind)
+return template (value) CBSP_PDU {
+	var template (value) CBSP_IEs ies := {
+		ts_CbspMsgId(msg_id),
+		ts_NewSerNo(new_ser_nr),
+		ts_CbspFailList(fail_list)
+	};
+	if (not istemplatekind(compl_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspNumComplList(compl_list);
+	}
+	if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspCellList(cell_list);
+	}
+	ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
+	return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
+}
+function tr_CBSP_WRITE_CBS_FAIL(template uint16_t msg_id, template uint16_t new_ser_nr,
+				template CBSP_FailureListItems fail_list,
+				template CBSP_IE_NumBcastComplList compl_list,
+				template BSSMAP_FIELD_CellIdentificationList cell_list,
+				template uint8_t channel_ind)
+return template CBSP_PDU {
+	var template CBSP_IEs ies := {
+		tr_CbspMsgId(msg_id),
+		tr_NewSerNo(new_ser_nr),
+		tr_CbspFailList(fail_list)
+	};
+	if (istemplatekind(compl_list, "*")) {
+		ies[lengthof(ies)] := tr_CbspNumComplList ifpresent;
+	} else if (istemplatekind(compl_list, "?")) {
+		ies[lengthof(ies)] := tr_CbspNumComplList(?);
+	} else if (not istemplatekind(compl_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspNumComplList(compl_list);
+	}
+	if (istemplatekind(cell_list, "*")) {
+		ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+	} else if (istemplatekind(cell_list, "?")) {
+		ies[lengthof(ies)] := tr_CbspCellList(?);
+	} else if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspCellList(cell_list);
+	}
+	ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
+	return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
+}
+
+
+function ts_CBSP_REPLACE_CBS_FAIL(uint16_t msg_id, uint16_t new_ser_nr, uint16_t old_ser_nr,
+				   template (value) CBSP_FailureListItems fail_list,
+				   template (omit) CBSP_IE_NumBcastComplList compl_list,
+				   template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+				   template (value) uint8_t channel_ind)
+return template (value) CBSP_PDU {
+	var template (value) CBSP_IEs ies := {
+		ts_CbspMsgId(msg_id),
+		ts_NewSerNo(new_ser_nr),
+		ts_OldSerNo(old_ser_nr),
+		ts_CbspFailList(fail_list)
+	};
+	if (not istemplatekind(compl_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspNumComplList(compl_list);
+	}
+	if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspCellList(cell_list);
+	}
+	ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
+	return ts_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
+}
+function tr_CBSP_REPLACE_CBS_FAIL(template uint16_t msg_id, template uint16_t new_ser_nr,
+				   template uint16_t old_ser_nr,
+				   template CBSP_FailureListItems fail_list,
+				   template CBSP_IE_NumBcastComplList compl_list,
+				   template BSSMAP_FIELD_CellIdentificationList cell_list,
+				   template uint8_t channel_ind)
+return template CBSP_PDU {
+	var template CBSP_IEs ies := {
+		tr_CbspMsgId(msg_id),
+		tr_NewSerNo(new_ser_nr),
+		tr_OldSerNo(old_ser_nr),
+		tr_CbspFailList(fail_list)
+	};
+	if (istemplatekind(compl_list, "*")) {
+		ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+	} else if (istemplatekind(compl_list, "?")) {
+		ies[lengthof(ies)] := tr_CbspNumComplList(?);
+	} else if (not istemplatekind(compl_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspNumComplList(compl_list);
+	}
+	if (istemplatekind(cell_list, "*")) {
+		ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+	} else if (istemplatekind(cell_list, "?")) {
+		ies[lengthof(ies)] := tr_CbspCellList(?);
+	} else if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspCellList(cell_list);
+	}
+	ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
+	return tr_CBSP(CBSP_MSGT_WRITE_REPLACE_FAIL, ies);
+}
+
+/* 8.1.3.4 KILL */
+template (value) CBSP_PDU ts_CBSP_KILL(template (value) uint16_t msg_id,
+					template (value) uint16_t old_ser_nr,
+					template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+					template (omit) uint8_t channel_ind) :=
+	ts_CBSP(CBSP_MSGT_KILL, {
+			ts_CbspMsgId(msg_id),
+			ts_OldSerNo(old_ser_nr),
+			ts_CbspCellList(cell_list),
+			ts_CbspChannelInd(channel_ind)});
+template CBSP_PDU tr_CBSP_KILL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?,
+				template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+				template uint8_t channel_ind := ?) :=
+	tr_CBSP(CBSP_MSGT_KILL, {
+			tr_CbspMsgId(msg_id),
+			tr_OldSerNo(old_ser_nr),
+			tr_CbspCellList(cell_list),
+			tr_CbspChannelInd(channel_ind) });
+
+/* 8.1.3.5 KILL COMPLETE */
+function ts_CBSP_KILL_COMPL(template (value) uint16_t msg_id, template (value) uint16_t old_ser_nr,
+			    template (omit) CBSP_IE_NumBcastComplList compl_list,
+			    template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+			    template (omit) uint8_t channel_ind)
+return template (value) CBSP_PDU {
+	var template (value) CBSP_IEs ies := {
+		ts_CbspMsgId(msg_id),
+		ts_OldSerNo(old_ser_nr)
+	};
+	if (not istemplatekind(compl_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspNumComplList(compl_list);
+	}
+	if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspCellList(cell_list);
+	}
+	if (not istemplatekind(channel_ind, "omit")) {
+		ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
+	}
+	return ts_CBSP(CBSP_MSGT_KILL_COMPL, ies);
+}
+function tr_CBSP_KILL_COMPL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?,
+			    template CBSP_IE_NumBcastComplList compl_list := ?,
+			    template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+			    template uint8_t channel_ind)
+return template CBSP_PDU {
+	var template CBSP_IEs ies := {
+		tr_CbspMsgId(msg_id),
+		tr_OldSerNo(old_ser_nr)
+	};
+	if (istemplatekind(compl_list, "*")) {
+		ies[lengthof(ies)] := *;
+	} else if (not istemplatekind(compl_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspNumComplList(compl_list);
+	}
+	if (istemplatekind(cell_list, "*")) {
+		ies[lengthof(ies)] := *;
+	} else if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspCellList(cell_list);
+	}
+	if (istemplatekind(channel_ind, "*")) {
+		ies[lengthof(ies)] := *;
+	} else if (not istemplatekind(channel_ind, "omit")) {
+		ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
+	}
+	return tr_CBSP(CBSP_MSGT_KILL_COMPL, ies);
+}
+
+/* 8.1.3.6 KILL FAILURE */
+function ts_CBSP_KILL_FAIL(template (value) uint16_t msg_id, template (value) uint16_t old_ser_nr,
+			   template (value) CBSP_FailureListItems fail_list,
+			   template (omit) CBSP_IE_NumBcastComplList compl_list,
+			   template (omit) BSSMAP_FIELD_CellIdentificationList cell_list,
+			   template (omit) uint8_t channel_ind)
+return template (value) CBSP_PDU {
+	var template (value) CBSP_IEs ies := {
+		ts_CbspMsgId(msg_id),
+		ts_OldSerNo(old_ser_nr),
+		ts_CbspFailList(fail_list)
+	};
+	if (not istemplatekind(compl_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspNumComplList(compl_list);
+	}
+	if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := ts_CbspCellList(cell_list);
+	}
+	if (not istemplatekind(channel_ind, "omit")) {
+		ies[lengthof(ies)] := ts_CbspChannelInd(channel_ind);
+	}
+	return ts_CBSP(CBSP_MSGT_KILL_FAIL, ies);
+}
+function tr_CBSP_KILL_FAIL(template uint16_t msg_id := ?, template uint16_t old_ser_nr := ?,
+			   template CBSP_FailureListItems fail_list := ?,
+			   template CBSP_IE_NumBcastComplList compl_list := *,
+			   template BSSMAP_FIELD_CellIdentificationList cell_list := *,
+			   template uint8_t channel_ind := *)
+return template CBSP_PDU {
+	var template CBSP_IEs ies := {
+		tr_CbspMsgId(msg_id),
+		tr_OldSerNo(old_ser_nr),
+		tr_CbspFailList(fail_list)
+	};
+	if (istemplatekind(compl_list, "*")) {
+		ies[lengthof(ies)] := tr_CbspNumComplList ifpresent;
+	} else if (not istemplatekind(compl_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspNumComplList(compl_list);
+	}
+	if (istemplatekind(compl_list, "*")) {
+		ies[lengthof(ies)] := tr_CbspCellList ifpresent;
+	} else if (not istemplatekind(cell_list, "omit")) {
+		ies[lengthof(ies)] := tr_CbspCellList(cell_list);
+	}
+	if (istemplatekind(channel_ind, "*")) {
+		ies[lengthof(ies)] := tr_CbspChannelInd(?) ifpresent;
+	} else if (not istemplatekind(channel_ind, "omit")) {
+		ies[lengthof(ies)] := tr_CbspChannelInd(channel_ind);
+	}
+	return tr_CBSP(CBSP_MSGT_KILL_FAIL, ies);
+}
+
+
+/* 8.1.3.16 RESET */
+template (value) CBSP_PDU ts_CBSP_RESET(template (value) BSSMAP_FIELD_CellIdentificationList cell_list) :=
+	ts_CBSP(CBSP_MSGT_RESET, {
+			ts_CbspCellList(cell_list)
+		});
+template CBSP_PDU tr_CBSP_RESET(template BSSMAP_FIELD_CellIdentificationList cell_list := ?) :=
+	tr_CBSP(CBSP_MSGT_RESET, {
+			tr_CbspCellList(cell_list)
+		});
+
+/* 8.1.3.17 RESET COMPLETE */
+template (value) CBSP_PDU ts_CBSP_RESET_COMPL(template (value) BSSMAP_FIELD_CellIdentificationList cell_list) :=
+	ts_CBSP(CBSP_MSGT_RESET_COMPL, {
+			ts_CbspCellList(cell_list)
+		});
+template CBSP_PDU tr_CBSP_RESET_COMPL(template BSSMAP_FIELD_CellIdentificationList cell_list := ?) :=
+	tr_CBSP(CBSP_MSGT_RESET_COMPL, {
+			tr_CbspCellList(cell_list)
+		});
+
+/* 8.1.3.18 RESET FAILURE */
+template (value) CBSP_PDU ts_CBSP_RESET_FAIL(template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+					     template (value) CBSP_FailureListItems fail_items) :=
+	ts_CBSP(CBSP_MSGT_RESET_FAIL, {
+			ts_CbspFailList(fail_items),
+			ts_CbspCellList(cell_list)
+		});
+
+template CBSP_PDU tr_CBSP_RESET_FAIL(template BSSMAP_FIELD_CellIdentificationList cell_list,
+				     template CBSP_FailureListItems fail_items) :=
+	tr_CBSP(CBSP_MSGT_RESET_FAIL, {
+			tr_CbspFailList(fail_items),
+			tr_CbspCellList(cell_list)
+		});
+
+/* 8.1.3.18a KEEP-ALIVE */
+template (value) CBSP_PDU ts_CBSP_KEEP_ALIVE(uint8_t rep_period) :=
+	ts_CBSP(CBSP_MSGT_KEEP_ALIVE, {ts_CbspKARepPeriod(rep_period)});
+template CBSP_PDU tr_CBSP_KEEP_ALIVE(template uint8_t rep_period := ?) :=
+	tr_CBSP(CBSP_MSGT_KEEP_ALIVE, {tr_CbspKARepPeriod(rep_period)});
+
+/* 8.1.3.18b KEEP-ALIVE COMPLETE */
+template (value) CBSP_PDU ts_CBSP_KEEP_ALIVE_COMPL :=
+	ts_CBSP(CBSP_MSGT_KEEP_ALIVE_COMPL, {});
+template CBSP_PDU tr_CBSP_KEEP_ALIVE_COMPL :=
+	tr_CBSP(CBSP_MSGT_KEEP_ALIVE_COMPL, {});
+
+/* 8.1.3.19 RESTART */
+template (value) CBSP_PDU ts_CBSP_RESTART(template (value) BSSMAP_FIELD_CellIdentificationList cell_list,
+					  template (value) CBSP_BcastMsgType msg_type,
+					  template (value) CBSP_RecoveryInd rec_ind) :=
+	ts_CBSP(CBSP_MSGT_RESTART, {
+			ts_CbspCellList(cell_list),
+			ts_CbspBcastMsgType(msg_type),
+			ts_CbspRecoveryInd(rec_ind)
+		});
+template CBSP_PDU tr_CBSP_RESTART(template BSSMAP_FIELD_CellIdentificationList cell_list := ?,
+				  template CBSP_BcastMsgType msg_type := ?,
+				  template CBSP_RecoveryInd rec_ind := ?) :=
+	tr_CBSP(CBSP_MSGT_RESTART, {
+			tr_CbspCellList(cell_list),
+			tr_CbspBcastMsgType(msg_type),
+			tr_CbspRecoveryInd(rec_ind)
+		});
+
+/* 8.1.3.20 FAILURE */
+template (value) CBSP_PDU ts_CBSP_FAILURE(template (value) CBSP_FailureListItems fail_list,
+					  template (value) CBSP_BcastMsgType msg_type) :=
+	ts_CBSP(CBSP_MSGT_FAILURE, {
+			ts_CbspFailList(fail_list),
+			ts_CbspBcastMsgType(msg_type)
+		});
+template CBSP_PDU tr_CBSP_FAILURE(template CBSP_FailureListItems fail_list := ?,
+				  template CBSP_BcastMsgType msg_type := ?) :=
+	tr_CBSP(CBSP_MSGT_FAILURE, {
+			tr_CbspFailList(fail_list),
+			tr_CbspBcastMsgType(msg_type)
+		});
+
+/* 8.1.3.21 ERROR INDICATION */
+template (value) CBSP_PDU ts_CBSP_ERROR_IND(CBSP_Cause cause) :=
+	ts_CBSP(CBSP_MSGT_ERROR_IND, {ts_CbspCause(cause)});
+template CBSP_PDU tr_CBSP_ERROR_IND(template CBSP_Cause cause) :=
+	tr_CBSP(CBSP_MSGT_ERROR_IND, {tr_CbspCause(cause), *});
+
+
+function f_cbsp_find_ie(CBSP_PDU msg, CBSP_IEI iei, out CBSP_IE ret) return boolean {
+	for (var integer i := 0; i < sizeof(msg.ies); i := i+1) {
+		if (msg.ies[i].iei == iei) {
+			ret := msg.ies[i];
+			return true;
+		}
+	}
+	return false;
+}
+
+
+}
