diff --git a/library/BSSMAP_Templates.ttcn b/library/BSSMAP_Templates.ttcn
index 02aad9f..c564cfd 100644
--- a/library/BSSMAP_Templates.ttcn
+++ b/library/BSSMAP_Templates.ttcn
@@ -2,7 +2,7 @@
 
 /* BSSMAP Templates, building on top of BSSAP_Types from Ericsson.
  *
- * (C) 2017-2019 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2017-2023 by Harald Welte <laforge@gnumonks.org>
  * contributions by sysmocom - s.f.m.c. GmbH
  * All rights reserved.
  *
@@ -396,13 +396,13 @@
 }
 
 
-template BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(octetstring l3info) := {
+template (value) BSSMAP_IE_Layer3Information ts_BSSMAP_IE_L3Info(template (value) octetstring l3info) := {
 	elementIdentifier := '17'O,
 	lengthIndicator := 0,
 	layer3info := l3info
 }
 
-template BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template octetstring l3info) := {
+template (present) BSSMAP_IE_Layer3Information tr_BSSMAP_IE_L3Info(template (present) octetstring l3info) := {
 	elementIdentifier := '17'O,
 	lengthIndicator := ?,
 	layer3info := l3info
@@ -653,6 +653,32 @@
 	codecElements := valueof(elem)
 }
 
+function ts_BSSMAP_IE_CallIdentifier(template (omit) OCT4 cid) return template (omit) BSSMAP_IE_CallIdentifier {
+	if (istemplatekind(cid, "omit")) {
+		return omit;
+	} else {
+		var template (present) BSSMAP_IE_CallIdentifier ie := {
+			elementIdentifier := '7F'O,
+			callIdentifierInfo := cid
+		}
+		return ie;
+	}
+}
+function tr_BSSMAP_IE_CallIdentifier(template OCT4 cid) return template BSSMAP_IE_CallIdentifier {
+	if (istemplatekind(cid, "*")) {
+		return *;
+	} else if (istemplatekind(cid, "omit")) {
+		return omit;
+	} else {
+		var template BSSMAP_IE_CallIdentifier ie := {
+			elementIdentifier := '7F'O,
+			callIdentifierInfo := cid
+		}
+		return ie;
+	}
+}
+
+
 template (present) BSSMAP_IE_Osmo_OsmuxCID tr_OsmuxCID(template (present) INT1 cid := ?) := {
 	elementIdentifier := 'F1'O,
 	osmuxCID := cid
@@ -1962,6 +1988,688 @@
 	rTC := '00'B /* Response Time is not specified */
 }
 
+
+/* 3.2.2.55 */
+template (value) BSSMAP_IE_GroupCallReference
+ts_BSSMAP_IE_GroupCallRef(template (value) GroupCallRef group_call_ref) :={
+	elementIdentifier := '37'O,
+	lengthIndicator := 0, // overwritten
+	descrGroupbroadcastCallRef := group_call_ref
+}
+template (present) BSSMAP_IE_GroupCallReference
+tr_BSSMAP_IE_GroupCallRef(template (present) GroupCallRef group_call_ref) :={
+	elementIdentifier := '37'O,
+	lengthIndicator := 0, // overwritten
+	descrGroupbroadcastCallRef := group_call_ref
+}
+
+/* 3.2.2.88 */
+template (value) BSSMAP_IE_VGCS_FeatureFlags
+ts_BSSMAP_IE_VGCS_FeatureFlags(BIT1 tp_ind, BIT2 as_ind, BIT1 bss_res, BIT1 tcp) := {
+	elementIdentifier := '69'O,
+	lengthIndicator := 0, // overwritten
+	TP_Ind := tp_ind,
+	AS_Ind := as_ind,
+	BSS_Res := bss_res,
+	tCP := tcp,
+	spare := '000'B
+};
+template (present) BSSMAP_IE_VGCS_FeatureFlags
+tr_BSSMAP_IE_VGCS_FeatureFlags(BIT1 tp_ind, BIT2 as_ind, BIT1 bss_res, BIT1 tcp) := {
+	elementIdentifier := '69'O,
+	lengthIndicator := ?,
+	TP_Ind := tp_ind,
+	AS_Ind := as_ind,
+	BSS_Res := bss_res,
+	tCP := tcp,
+	spare := ?
+};
+
+/* 3.2.2.98 */
+template (value) BSSMAP_IE_ApplicationData
+ts_BSSMAP_IE_ApplicationData(template (value) OCT9 adi) := {
+	elementIdentifier := '78'O,
+	lengthIndicator := 0, // overwritten
+	applicationDataInfo := adi
+};
+template (present) BSSMAP_IE_ApplicationData
+tr_BSSMAP_IE_ApplicationData(template (present) OCT9 adi) := {
+	elementIdentifier := '78'O,
+	lengthIndicator := ?,
+	applicationDataInfo := adi
+};
+
+/* 3.2.2.99 */
+template (value) BSSMAP_IE_DataIdentity
+ts_BSSMAP_IE_DataIdentity(template (value) DataIdentity data_id) := {
+	elementIdentifier := '79'O,
+	lengthIndicator := 0, // overwritten
+	dataIdentityInfo := data_id
+};
+template (present) BSSMAP_IE_DataIdentity
+tr_BSSMAP_IE_DataIdentity(template (present) DataIdentity data_id) := {
+	elementIdentifier := '79'O,
+	lengthIndicator := ?,
+	dataIdentityInfo := data_id
+};
+
+/* 3.2.2.52 */
+template (value) BSSMAP_IE_AssignmentRequirement
+ts_BSSMAP_IE_AssRequirement(template (value) OCT1 ass_rqm) := {
+	elementIdentifier := '33'O,
+	assignmentRequirement := ass_rqm
+}
+template (present) BSSMAP_IE_AssignmentRequirement
+tr_BSSMAP_IE_AssRequirement(template (present) OCT1 ass_rqm) := {
+	elementIdentifier := '33'O,
+	assignmentRequirement := ass_rqm
+}
+
+/* 3.2.2.89 */
+function ts_BSSMAP_IE_TalkerPriority(template (omit) BIT2 prio)
+return template (omit) BSSMAP_IE_TalkerPriority {
+	if (istemplatekind(prio, "omit")) {
+		return omit;
+	} else {
+		var template (present) BSSMAP_IE_TalkerPriority tp := {
+			elementIdentifier := '6A'O,
+			priority := prio,
+			spare := '000000'B
+		};
+		return tp;
+	}
+}
+function tr_BSSMAP_IE_TalkerPriority(template BIT2 prio)
+return template BSSMAP_IE_TalkerPriority {
+	if (istemplatekind(prio, "omit")) {
+		return omit;
+	} else if (istemplatekind(prio, "*")) {
+		return *;
+	} else {
+		var template BSSMAP_IE_TalkerPriority tp := {
+			elementIdentifier := '6A'O,
+			priority := prio,
+			spare := ?
+		}
+		return tp;
+	}
+}
+
+/* 3.2.2.90 */
+template (value) BSSMAP_IE_EmergencySetIndication
+ts_BSSMAP_IE_EmergencySetIndication := {
+	elementIdentifier := '6B'O
+}
+template (present) BSSMAP_IE_EmergencySetIndication
+tr_BSSMAP_IE_EmergencySetIndication := {
+	elementIdentifier := '6B'O
+}
+
+
+
+
+/* Section 3.2.1.50 */
+template (value) PDU_BSSAP
+ts_BSSMAP_VGCS_VBS_Setup(template (value) GroupCallRef group_call_ref,
+			 template (omit) BSSMAP_IE_VGCS_FeatureFlags feature_flags := omit)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSSetup := {
+				messageType := '04'O,
+				groupCallReference := ts_BSSMAP_IE_GroupCallRef(group_call_ref),
+				priority := omit,
+				vGCS_FeatureFlags := feature_flags
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_VGCS_VBS_Setup(template (present) GroupCallRef group_call_ref,
+			 template BSSMAP_IE_VGCS_FeatureFlags feature_flags := *)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSSetup := {
+				messageType := '04'O,
+				groupCallReference := tr_BSSMAP_IE_GroupCallRef(group_call_ref),
+				priority := *,
+				vGCS_FeatureFlags := feature_flags
+			}
+		}
+	}
+}
+
+/* Section 3.2.1.51 */
+template (value) PDU_BSSAP
+ts_BSSMAP_VGCS_VBS_SetupAck(template (omit) BSSMAP_IE_VGCS_FeatureFlags feature_flags := omit)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSSetupAck := {
+				messageType := '05'O,
+				vGCS_FeatureFlags := feature_flags
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_VGCS_VBS_SetupAck(template BSSMAP_IE_VGCS_FeatureFlags feature_flags := *)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSSetupAck := {
+				messageType := '05'O,
+				vGCS_FeatureFlags := feature_flags
+			}
+		}
+	}
+}
+
+/* Section 3.2.1.52 */
+template (value) PDU_BSSAP
+ts_BSSMAP_VGCS_VBS_SetupRefuse(BssmapCause cause)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSSetupRefuse := {
+				messageType := '06'O,
+				cause := ts_BSSMAP_IE_Cause(cause)
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_VGCS_VBS_SetupRefuse(template (present) myBSSMAP_Cause cause := ?)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSSetupRefuse := {
+				messageType := '06'O,
+				cause := tr_BSSMAP_IE_Cause(cause)
+			}
+		}
+	}
+}
+
+/* Section 3.2.1.53 */
+template (value) PDU_BSSAP
+ts_BSSMAP_VGCS_VBS_AssignmentReq(template (value) BSSMAP_IE_ChannelType ch_type,
+				 template (value) OCT1 ass_requirement,
+				 template (value) BSSMAP_IE_CellIdentifier cell_id,
+				 template (value) GroupCallRef group_call_ref,
+				 template (omit) BSSMAP_IE_CircuitIdentityCode cic := omit,
+				 template (omit) BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
+				 template (omit) OCT4 call_id := omit)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSAssignmentRequest := {
+				messageType := '07'O,	/* overwritten */
+				channelType := ch_type,
+				assignmentRequirement := ts_BSSMAP_IE_AssRequirement(ass_requirement),
+				cellIdentifier := cell_id,
+				groupCallReference := ts_BSSMAP_IE_GroupCallRef(group_call_ref),
+				priority := omit,
+				circuitIdentityCode := cic,
+				downLinkDTX_Flag := omit,
+				encryptionInformation := omit,
+				vSTK_RAND := omit,
+				vSTK := omit,
+				cellIdentifierListSegment := omit,
+				aoIPTransportLayer := aoip,
+				callIdentifier := ts_BSSMAP_IE_CallIdentifier(call_id),
+				codecList := omit
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_VGCS_VBS_AssignmentReq(template (present) BSSMAP_IE_ChannelType ch_type,
+				 template (present) OCT1 ass_requirement,
+				 template (present) BSSMAP_IE_CellIdentifier cell_id,
+				 template (present) GroupCallRef group_call_ref,
+				 template BSSMAP_IE_CircuitIdentityCode cic := *,
+				 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := ?,
+				 template OCT4 call_id := ?)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSAssignmentRequest := {
+				messageType := '07'O,	/* overwritten */
+				channelType := ch_type,
+				assignmentRequirement := tr_BSSMAP_IE_AssRequirement(ass_requirement),
+				cellIdentifier := cell_id,
+				groupCallReference := tr_BSSMAP_IE_GroupCallRef(group_call_ref),
+				priority := omit,
+				circuitIdentityCode := cic,
+				downLinkDTX_Flag := omit,
+				encryptionInformation := omit,
+				vSTK_RAND := omit,
+				vSTK := omit,
+				cellIdentifierListSegment := omit,
+				aoIPTransportLayer := aoip,
+				callIdentifier := tr_BSSMAP_IE_CallIdentifier(call_id),
+				codecList := omit
+			}
+		}
+	}
+}
+
+/* Section 3.2.1.54 */
+template (value) PDU_BSSAP
+ts_BSSMAP_VGCS_VBS_AssignmentRes(template (value) BSSMAP_IE_ChannelType ch_type,
+				 template (value) BSSMAP_IE_CellIdentifier cell_id,
+				 template (omit) BSSMAP_IE_ChosenChannel chosen_ch := omit,
+				 template (omit) BSSMAP_IE_CircuitIdentityCode cic := omit,
+				 template (omit) BSSMAP_IE_AoIP_TransportLayerAddress aoip := omit,
+				 template (omit) BSSMAP_IE_SpeechCodec speech_codec := omit,
+				 template (omit) OCT4 call_id := omit)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSAssignmentResult := {
+				messageType := '1C'O,	/* overwritten */
+				channelType := ch_type,
+				cellIdentifier := cell_id,
+				chosenChannel := chosen_ch,
+				circuitIdentityCode := cic,
+				circuitPool := omit,
+				aoIPTransportLayer := aoip,
+				speechCodec := speech_codec,
+				callIdentifier := ts_BSSMAP_IE_CallIdentifier(call_id)
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_VGCS_VBS_AssignmentRes(template (present) BSSMAP_IE_ChannelType ch_type,
+				 template (present) BSSMAP_IE_CellIdentifier cell_id,
+				 template BSSMAP_IE_ChosenChannel chosen_ch := *,
+				 template BSSMAP_IE_CircuitIdentityCode cic := omit,
+				 template BSSMAP_IE_AoIP_TransportLayerAddress aoip := ?,
+				 template BSSMAP_IE_SpeechCodec speech_codec := ?,
+				 template OCT4 call_id := ?)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSAssignmentResult := {
+				messageType := '1C'O,	/* overwritten */
+				channelType := ch_type,
+				cellIdentifier := cell_id,
+				chosenChannel := chosen_ch,
+				circuitIdentityCode := cic,
+				circuitPool := *,
+				aoIPTransportLayer := aoip,
+				speechCodec := speech_codec,
+				callIdentifier := tr_BSSMAP_IE_CallIdentifier(call_id)
+			}
+		}
+	}
+}
+
+/* Section 3.2.1.55 */
+template (value) PDU_BSSAP
+ts_BSSMAP_VGCS_VBS_AssignmentFail(BssmapCause cause)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSAssignmentFailure := {
+				messageType := '1D'O,	/* overwritten */
+				cause := ts_BSSMAP_IE_Cause(cause),
+				/* we only implement AoIP for now... */
+				circuitPool := omit,
+				circuitPoolList := omit
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_VGCS_VBS_AssignmentFail(template (present) myBSSMAP_Cause cause := ?)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSAssignmentFailure := {
+				messageType := '1D'O,	/* overwritten */
+				cause := tr_BSSMAP_IE_Cause(cause),
+				/* we only implement AoIP for now... */
+				circuitPool := omit,
+				circuitPoolList := omit
+			}
+		}
+	}
+}
+
+/* Section 3.2.1.56 */
+template (value) PDU_BSSAP
+ts_BSSMAP_VGCS_VBS_QueuingInd
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSQueuingIndication := {
+				messageType := '1E'O
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_VGCS_VBS_QueuingInd
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			vGCS_VBSQueuingIndication := {
+				messageType := '1E'O
+			}
+		}
+	}
+}
+
+/* Section 3.2.1.57 */
+template (value) PDU_BSSAP
+ts_BSSMAP_UplinkReq_L3(template (value) BIT2 priority,
+		       template (omit) BSSMAP_IE_CellIdentifier cell_id,
+		       template (value) octetstring l3_info)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRequest := {
+				messageType := '1F'O,
+				talkerPriority := ts_BSSMAP_IE_TalkerPriority(priority),
+				cellIdentifier := cell_id,
+				layer3Information := ts_BSSMAP_IE_L3Info(l3_info),
+				mobileIdentity := omit
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_UplinkReq_L3(template (present) BIT2 priority,
+		       template BSSMAP_IE_CellIdentifier cell_id,
+		       template (present) octetstring l3_info)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRequest := {
+				messageType := '1F'O,
+				talkerPriority := tr_BSSMAP_IE_TalkerPriority(priority),
+				cellIdentifier := cell_id,
+				layer3Information := tr_BSSMAP_IE_L3Info(l3_info),
+				mobileIdentity := omit
+			}
+		}
+	}
+}
+template (value) PDU_BSSAP
+ts_BSSMAP_UplinkReq_MI(template (omit) BIT2 priority,
+		       template (omit) BSSMAP_IE_CellIdentifier cell_id,
+		       template (value) BSSMAP_IE_MobileIdentity mobile_id)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRequest := {
+				messageType := '1F'O,
+				talkerPriority := ts_BSSMAP_IE_TalkerPriority(priority),
+				cellIdentifier := cell_id,
+				layer3Information := omit,
+				mobileIdentity := mobile_id
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_UplinkReq_MI(template BIT2 priority,
+		       template (omit) BSSMAP_IE_CellIdentifier cell_id,
+		       template (present) BSSMAP_IE_MobileIdentity mobile_id)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRequest := {
+				messageType := '1F'O,
+				talkerPriority := tr_BSSMAP_IE_TalkerPriority(priority),
+				cellIdentifier := cell_id,
+				layer3Information := omit,
+				mobileIdentity := mobile_id
+			}
+		}
+	}
+}
+
+/* 3.2.1.58 */
+template (value) PDU_BSSAP
+ts_BSSMAP_UplinkReqAck(template (omit) BIT2 priority,
+			template (omit) BSSMAP_IE_EmergencySetIndication ems := omit,
+			template (omit) BSSMAP_IE_TalkerIdentity talker_id := omit)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRequestAck := {
+				messageType := '27'O,
+				talkerPriority := ts_BSSMAP_IE_TalkerPriority(priority),
+				emergencySetIndication := ems,
+				talkerIdentity := talker_id
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_UplinkReqAck(template BIT2 priority,
+			template BSSMAP_IE_EmergencySetIndication ems := *,
+			template BSSMAP_IE_TalkerIdentity talker_id := *)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRequestAck := {
+				messageType := '27'O,
+				talkerPriority := tr_BSSMAP_IE_TalkerPriority(priority),
+				emergencySetIndication := ems,
+				talkerIdentity := talker_id
+			}
+		}
+	}
+}
+
+/* 3.2.1.59 */
+template (value) PDU_BSSAP
+ts_BSSMAP_UplinkReqConf(template (value) BSSMAP_IE_CellIdentifier cell_id,
+			template (omit) BSSMAP_IE_TalkerIdentity talker_id := omit,
+			template (value) octetstring l3_info)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRequestConfirmation := {
+				messageType := '49'O,
+				cellIdentifier := cell_id,
+				talkerIdentity := talker_id,
+				layer3Information := ts_BSSMAP_IE_L3Info(l3_info)
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_UplinkReqConf(template (present) BSSMAP_IE_CellIdentifier cell_id,
+			template BSSMAP_IE_TalkerIdentity talker_id := *,
+			template (present) octetstring l3_info)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRequestConfirmation := {
+				messageType := '49'O,
+				cellIdentifier := cell_id,
+				talkerIdentity := talker_id,
+				layer3Information := tr_BSSMAP_IE_L3Info(l3_info)
+			}
+		}
+	}
+}
+
+
+/* 3.2.1.60 */
+template (value) PDU_BSSAP
+ts_BSSMAP_UplinkRelInd(BssmapCause cause, template (omit) BIT2 prio)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkReleaseIndication := {
+				messageType := '4A'O,
+				cause := ts_BSSMAP_IE_Cause(cause),
+				talkerPriority := ts_BSSMAP_IE_TalkerPriority(prio)
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_UplinkRelInd(template (present) myBSSMAP_Cause cause, template BIT2 prio)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkReleaseIndication := {
+				messageType := '4A'O,
+				cause := tr_BSSMAP_IE_Cause(cause),
+				talkerPriority := tr_BSSMAP_IE_TalkerPriority(prio)
+			}
+		}
+	}
+}
+
+
+/* 3.2.1.61 */
+template (value) PDU_BSSAP
+ts_BSSMAP_UplinkRejCmd(BssmapCause cause,
+			template (omit) BIT2 cur_talker_prio := omit,
+			template (omit) BIT2 rej_talker_prio := omit,
+			template (omit) BSSMAP_IE_TalkerIdentity talker_id := omit)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRejectCommand := {
+				messageType := '4B'O,
+				cause := ts_BSSMAP_IE_Cause(cause),
+				currentTalkerPriority := ts_BSSMAP_IE_TalkerPriority(cur_talker_prio),
+				rejectedTalkerPriority := ts_BSSMAP_IE_TalkerPriority(rej_talker_prio),
+				talkerIdentity := talker_id
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_UplinkRejCmd(template (present) myBSSMAP_Cause cause,
+			template BIT2 cur_talker_prio := *,
+			template BIT2 rej_talker_prio := *,
+			template BSSMAP_IE_TalkerIdentity talker_id := *)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkRejectCommand := {
+				messageType := '4B'O,
+				cause := tr_BSSMAP_IE_Cause(cause),
+				currentTalkerPriority := tr_BSSMAP_IE_TalkerPriority(cur_talker_prio),
+				rejectedTalkerPriority := tr_BSSMAP_IE_TalkerPriority(rej_talker_prio),
+				talkerIdentity := talker_id
+			}
+		}
+	}
+}
+
+
+/* 3.2.1.62 */
+template (value) PDU_BSSAP
+ts_BSSMAP_UplinkRelCmd(BssmapCause cause)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkReleaseCommand := {
+				messageType := '4C'O,
+				cause := ts_BSSMAP_IE_Cause(cause)
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_UplinkRelCmd(template (present) myBSSMAP_Cause cause)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkReleaseCommand := {
+				messageType := '4C'O,
+				cause := tr_BSSMAP_IE_Cause(cause)
+			}
+		}
+	}
+}
+
+
+/* 3.2.1.63 */
+template (value) PDU_BSSAP
+ts_BSSMAP_UplinkSeizedCmd(BssmapCause cause,
+			  template (omit) BIT2 talker_prio := omit,
+			  template (omit) BSSMAP_IE_EmergencySetIndication emerg := omit,
+			  template (omit) BSSMAP_IE_TalkerIdentity talker_id := omit)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkSeizedCommand := {
+				messageType := '4D'O,
+				cause := ts_BSSMAP_IE_Cause(cause),
+				talkerPriority := ts_BSSMAP_IE_TalkerPriority(talker_prio),
+				emergencySetIndication := emerg,
+				talkerIdentity := talker_id
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_UplinkSeizedCmd(template (present) myBSSMAP_Cause cause,
+			  template BIT2 talker_prio := *,
+			  template BSSMAP_IE_EmergencySetIndication emerg := *,
+			  template BSSMAP_IE_TalkerIdentity talker_id := *)
+modifies tr_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			uplinkSeizedCommand := {
+				messageType := '4D'O,
+				cause := tr_BSSMAP_IE_Cause(cause),
+				talkerPriority := tr_BSSMAP_IE_TalkerPriority(talker_prio),
+				emergencySetIndication := emerg,
+				talkerIdentity := talker_id
+			}
+		}
+	}
+}
+
+
+
+/* Section 3.2.1.82 */
+template (value) PDU_BSSAP
+ts_BSSMAP_NotificationData(template (value) OCT9 app_data, template (value) DataIdentity data_identity)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			notificationData := {
+				messageType := '62'O,
+				applicationData := ts_BSSMAP_IE_ApplicationData(app_data),
+				dataIdentity := ts_BSSMAP_IE_DataIdentity(data_identity),
+				mSISDN := omit
+			}
+		}
+	}
+}
+template (present) PDU_BSSAP
+tr_BSSMAP_NotificationData(template (present) OCT9 app_data, template (present) DataIdentity data_identity)
+modifies ts_BSSAP_BSSMAP := {
+	pdu := {
+		bssmap := {
+			notificationData := {
+				messageType := '62'O,
+				applicationData := tr_BSSMAP_IE_ApplicationData(app_data),
+				dataIdentity := tr_BSSMAP_IE_DataIdentity(data_identity),
+				mSISDN := ?
+			}
+		}
+	}
+}
+
+
+
 template (value) PDU_BSSAP
 ts_BSSMAP_Perform_Location_Request(template (omit) BSSMAP_IE_IMSI imsi,
 				   template (omit) BSSMAP_IE_CellIdentifier cellIdentifier := omit,
