diff --git a/library/Osmocom_Gb_Types.ttcn b/library/Osmocom_Gb_Types.ttcn
index c532772..b83131d 100644
--- a/library/Osmocom_Gb_Types.ttcn
+++ b/library/Osmocom_Gb_Types.ttcn
@@ -2211,6 +2211,812 @@
 		}
 	}
 
+	/* 3GPP TS 48.018 11.3.61 */
+	const OCT1 RIM_APP_ID_NACC := '01'O;
+	const OCT1 RIM_APP_ID_SI3 := '02'O;
+	const OCT1 RIM_APP_ID_MBMS_DATA_CH := '03'O;
+	const OCT1 RIM_APP_ID_SON_TRANSF := '04'O;
+	const OCT1 RIM_APP_ID_UTRA_SI := '05'O;
+	template (value) RIM_Application_Identity ts_RIM_Application_Identity(OCT1 app_id) := {
+		 iEI := '4B'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 1
+		 },
+		 rIMApplicationIdentity := app_id
+	}
+
+
+	/* 3GPP TS 48.018 11.3.62 */
+	template (value) RIM_Sequence_Number ts_RIM_Sequence_Number(integer seq) := {
+		 iEI := '4C'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 4
+		 },
+		 rIMSequenceNumber := int2oct(seq, 4)
+	}
+
+	/* 3GPP TS 48.018 11.3.62a.1 */
+	template (value) RAN_Information_Request_RIM_Container
+	ts_RAN_Information_Request_RIM_Container(template (value) RIM_Application_Identity app_id,
+						 template (value) RIM_Sequence_Number seq,
+						 template (value) RIM_PDU_Indications ind,
+						 template (omit) RIM_Protocol_Version_Number ver := omit,
+						 template (omit) RAN_Information_Request_Application_Container app_cont := omit,
+						 template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
+		 iEI := '57'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 rIM_Application_Identity := app_id,
+		 rIM_Sequence_Number := seq,
+		 rIM_PDU_Indications := ind,
+		 rIM_Protocol_Version_Number := ver,
+		 application_Container := app_cont,
+		 sON_Transfer_Application_Identity_TLV := son_app_id
+	}
+	template RAN_Information_Request_RIM_Container
+	tr_RAN_Information_Request_RIM_Container(template RIM_Application_Identity app_id := ?,
+						 template RIM_Sequence_Number seq := ?,
+						 template RIM_PDU_Indications ind := ?,
+						 template RIM_Protocol_Version_Number ver := *,
+						 template RAN_Information_Request_Application_Container app_cont := *,
+						 template SON_Transfer_Application_Identity_TLV son_app_id := *) := {
+		 iEI := '57'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := ?
+		 },
+		 rIM_Application_Identity := app_id,
+		 rIM_Sequence_Number := seq,
+		 rIM_PDU_Indications := ind,
+		 rIM_Protocol_Version_Number := ver,
+		 application_Container := app_cont,
+		 sON_Transfer_Application_Identity_TLV := son_app_id
+	}
+
+
+	/* 3GPP TS 48.018 11.3.62a.2 */
+	template (value) RAN_Information_RIM_Container
+	ts_RAN_Information_RIM_Container(template (value) RIM_Application_Identity app_id,
+					 template (value) RIM_Sequence_Number seq,
+					 template (value) RIM_PDU_Indications ind,
+					 template (omit) RIM_Protocol_Version_Number ver := omit,
+					 template (omit) ApplContainer_or_ApplErrContainer app_cont_or_app_err := omit,
+					 template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
+
+		 iEI := '58'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 rIM_Application_Identity := app_id,
+		 rIM_Sequence_Number := seq,
+		 rIM_PDU_Indications := ind,
+		 rIM_Protocol_Version_Number := ver,
+		 applContainer_or_ApplErrContainer := app_cont_or_app_err,
+		 sON_Transfer_Application_Identity := son_app_id
+	}
+	template (value) ApplContainer_or_ApplErrContainer
+	tsu_ApplContainer_or_ApplErrContainer_NACC(template (value) ApplContainer_or_ApplErrContainer_NACC cont) := {
+		nacc := cont
+	}
+	template (value) ApplContainer_or_ApplErrContainer
+	tsu_ApplContainer_or_ApplErrContainer_SI3(template (value) ApplContainer_or_ApplErrContainer_SI3 cont) := {
+		si3 := cont
+	}
+	template (value) ApplContainer_or_ApplErrContainer
+	tsu_ApplContainer_or_ApplErrContainer_MBMS_data_channel(template (value) ApplContainer_or_ApplErrContainer_MBMS_data_channel cont) := {
+		mBMS_data_channel := cont
+	}
+	template (value) ApplContainer_or_ApplErrContainer_NACC
+	tsu_ApplContainer_NACC(template (value) BssgpCellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
+		application_Container := ts_RAN_Information_Application_Container_NACC(cid, psi_type, si_psi_num, si_psi)
+	}
+	template (value) ApplContainer_or_ApplErrContainer_NACC
+	tsu_ApplErrContainer_NACC(template (value) BssgpCellId cid,
+				  integer cause,
+				  template (value) Application_Container_IE_NACC app_cont) := {
+		application_Error_Container := ts_Application_Error_Container_NACC(cid, cause, app_cont)
+	}
+	template (value) ApplContainer_or_ApplErrContainer_SI3
+	tsu_ApplContainer_SI3(template (value) BssgpCellId cid, template (value) SI3 si3) := {
+		application_Container := ts_RAN_Information_Application_Container_SI3(cid, si3)
+	}
+	template (value) ApplContainer_or_ApplErrContainer_SI3
+	tsu_ApplErrContainer_SI3(template (value) BssgpCellId cid,
+				 integer cause,
+				 template (value) Application_Container_IE_SI3 app_cont) := {
+		application_Error_Container := ts_Application_Error_Container_SI3(cid, cause, app_cont)
+	}
+	template (value) ApplContainer_or_ApplErrContainer_MBMS_data_channel
+	tsu_ApplContainer_MBMS_data_channel(template (value) BssgpCellId cid, octetstring data_ch_report) := {
+		application_Container := ts_RAN_Information_Application_Container_MBMS_data_channel(cid, data_ch_report)
+	}
+	template (value) ApplContainer_or_ApplErrContainer_MBMS_data_channel
+	tsu_ApplErrContainer_MBMS_data_channel(template (value) BssgpCellId cid,
+					       integer cause,
+					       template (value) Application_Container_IE_MBMS_data_channel app_cont) := {
+		application_Error_Container := ts_Application_Error_Container_MBMS_data_channel(cid, cause, app_cont)
+	}
+
+	/* 3GPP TS 48.018 11.3.62a.3 */
+	template (value) RAN_Information_Ack_RIM_Container
+	ts_RAN_Information_Ack_RIM_Container(template (value) RIM_Application_Identity app_id,
+					     template (value) RIM_Sequence_Number seq,
+					     template (omit) RIM_Protocol_Version_Number ver := omit,
+					     template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
+		 iEI := '5A'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 rIM_Application_Identity := app_id,
+		 rIM_Sequence_Number := seq,
+		 rIM_Protocol_Version_Number := ver,
+		 sON_Transfer_Application_Identity := son_app_id
+	}
+
+	/* 3GPP TS 48.018 11.3.62a.4 */
+	template (value) RAN_Information_Error_RIM_Container
+	ts_RAN_Information_Error_RIM_Container(template (value) RIM_Application_Identity app_id,
+					       template (value) Cause_BSSGP cause,
+					       template (omit) RIM_Protocol_Version_Number ver := omit,
+					       PDU_BSSGP pdu,
+					       template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
+		 iEI := '5B'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 rIM_Application_Identity := app_id,
+		 rIM_cause := cause,
+		 rIM_Protocol_Version_Number := ver,
+		 pDU_in_Error:= {
+			iEI := '15'O,
+			ext := '1'B,
+			lengthIndicator := {
+				length1 := 0 /* overwritten */
+			},
+			erroneous_BSSGP_PDU := enc_PDU_BSSGP(pdu)
+		 },
+		 sON_Transfer_Application_Identity := son_app_id
+	}
+
+	/* 3GPP TS 48.018 11.3.62a.5 */
+	template (value) RAN_Information_Application_Error_RIM_Container
+	ts_RAN_Information_Application_Error_RIM_Container(template (value) RIM_Application_Identity app_id,
+							   template (value) RIM_Sequence_Number seq,
+							   template (value) RIM_PDU_Indications ind,
+							   template (omit) RIM_Protocol_Version_Number ver := omit,
+							   template (value) Application_Error_Container cont,
+							   template (omit) SON_Transfer_Application_Identity_TLV son_app_id := omit) := {
+		 iEI := '59'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 rIM_Application_Identity := app_id,
+		 rIM_Sequence_Number := seq,
+		 rIM_PDU_Indications := ind,
+		 rIM_Protocol_Version_Number := ver,
+		 application_Error_Container := cont,
+		 sON_Transfer_Application_Identity := son_app_id
+	}
+
+
+	/* 3GPP TS 48.018 11.3.63.1 */
+	template (value) RAN_Information_Request_Application_Container
+	tsu_RAN_Information_Request_Application_Container_NACC(template (value) BssgpCellId cid) := {
+		nacc := ts_RAN_Information_Request_Application_Container_NACC(cid)
+	}
+	template (value) RAN_Information_Request_Application_Container
+	tsu_RAN_Information_Request_Application_Container_SI3(template (value) BssgpCellId cid) := {
+		si3 := ts_RAN_Information_Request_Application_Container_SI3(cid)
+	}
+	template (value) RAN_Information_Request_Application_Container
+	tsu_RAN_Information_Request_Application_Container_MBMS_data_channel(template (value) BssgpCellId cid) := {
+		mBMS_data_channel := ts_RAN_Information_Request_Application_Container_MBMS_data_channel(cid)
+	}
+
+	/* NOTE: The type description of reporting_Cell_Identifier in chapter 11.3.63.1, version V10.6.0 (2012-07) of
+	 * 3GPP TS 48.018 clearly states: "Reporting Cell Identifier: This field is encoded as the Cell Identifier
+	 * defined in sub-clause 11.3.9". However this seems to be an error in the specification, because the
+	 * specifiction in Table 11.3.63.1.1 already has a length field an an IEI defined. Keeping the IEI and lenght
+	 * of the BSSGP cell identifier in addition would no make sense. Also in the chapters below the specifiction
+	 * of the IEs are similar and there it says "Reporting Cell Identifier: This field is encoded as the value
+	 * part of the Cell Identifier IE defined in sub-clause 11.3.9, not including IEI and Length Indicator.",
+	 * which actually makes sense. */
+
+	/* 3GPP TS 48.018 11.3.63.1.1 */
+	template (value) RAN_Information_Request_Application_Container_NACC
+	ts_RAN_Information_Request_Application_Container_NACC(template (value) BssgpCellId cid) := {
+		 iEI := '4D'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid)
+	}
+
+	/* 3GPP TS 48.018 11.3.63.1.2 */
+	template (value) RAN_Information_Request_Application_Container_SI3
+	ts_RAN_Information_Request_Application_Container_SI3(template (value) BssgpCellId cid) := {
+		 iEI := '4D'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid)
+	}
+
+	/* 3GPP TS 48.018 11.3.63.1.3 */
+	template (value) RAN_Information_Request_Application_Container_MBMS_data_channel
+	ts_RAN_Information_Request_Application_Container_MBMS_data_channel(template (value) BssgpCellId cid) := {
+		 iEI := '4D'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid)
+	}
+
+	/* 3GPP TS 48.018 11.3.63.2.1 */
+	template (value) RAN_Information_Application_Container_NACC
+	ts_RAN_Information_Application_Container_NACC(template (value) BssgpCellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
+		 iEI := '4E'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid),
+		 typeBit := bool2bit(psi_type),
+		 number_of_SI_PSI := int2bit(si_psi_num, 7),
+		 sI_PSI := si_psi
+	}
+
+	/* 3GPP TS 48.018 11.3.63.2.2 */
+	template (value) RAN_Information_Application_Container_SI3
+	ts_RAN_Information_Application_Container_SI3(template (value) BssgpCellId cid, template (value) SI3 si3) := {
+		 iEI := '4E'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid),
+		 sI3 := si3
+	}
+
+	/* 3GPP TS 48.018 11.3.63.2.3 */
+	template (value) RAN_Information_Application_Container_MBMS_data_channel
+	ts_RAN_Information_Application_Container_MBMS_data_channel(template (value) BssgpCellId cid, octetstring data_ch_report) := {
+		 iEI := '4E'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 reporting_Cell_Identifier := t_Cell_Identifier_V(cid),
+		 mBMS_data_channel_report := data_ch_report
+	}
+
+
+	/* 3GPP TS 48.018 11.3.64 */
+	template (value) Application_Error_Container
+	tsu_Application_Error_Container_NACC(template (value) BssgpCellId cid,
+					     integer cause,
+					     template (value) Application_Container_IE_NACC app_cont) := {
+		nacc := ts_Application_Error_Container_NACC(cid, cause, app_cont)
+	}
+	template (value) Application_Error_Container
+	tsu_Application_Error_Container_SI3(template (value) BssgpCellId cid,
+					    integer cause,
+					    template (value) Application_Container_IE_SI3 app_cont) := {
+		si3 := ts_Application_Error_Container_SI3(cid, cause, app_cont)
+	}
+	template (value) Application_Error_Container
+	tsu_Application_Error_Container_MBMS_data_channel(template (value) BssgpCellId cid,
+							  integer cause,
+							  template (value) Application_Container_IE_MBMS_data_channel app_cont) := {
+		mBMS_data_channel := ts_Application_Error_Container_MBMS_data_channel(cid, cause, app_cont)
+	}
+
+	/* 3GPP TS 48.018 11.3.64.1  */
+	template (value) Application_Error_Container_NACC
+	ts_Application_Error_Container_NACC(template (value) BssgpCellId cid,
+					    integer cause,
+					    template (value) Application_Container_IE_NACC app_cont) := {
+		 iEI := '56'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 nACC_cause := int2oct(cause, 1),
+		 erroneousApplicationContainer := app_cont
+	}
+	template (value) Application_Container_IE_NACC
+	tsu_Application_Container_IE_NACC_req(template (value) BssgpCellId cid) := {
+		rAN_Information_Request_Application_Container := ts_RAN_Information_Request_Application_Container_NACC(cid)
+	}
+	template (value) Application_Container_IE_NACC
+	tsu_Application_Container_IE_NACC(template (value) BssgpCellId cid, boolean psi_type, integer si_psi_num, octetstring si_psi) := {
+		rAN_Information_Application_Container := ts_RAN_Information_Application_Container_NACC(cid, psi_type, si_psi_num, si_psi)
+	}
+
+	/* 3GPP TS 48.018 11.3.64.2 */
+	template (value) Application_Error_Container_SI3
+	ts_Application_Error_Container_SI3(template (value) BssgpCellId cid,
+					   integer cause,
+					   template (value) Application_Container_IE_SI3 app_cont) := {
+		 iEI := '56'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 sI3_cause := int2oct(cause, 1),
+		 erroneousApplicationContainer := app_cont
+	}
+	template (value) Application_Container_IE_SI3
+	tsu_Application_Container_IE_SI3_req(template (value) BssgpCellId cid) := {
+		rAN_Information_Request_Application_Container := ts_RAN_Information_Request_Application_Container_SI3(cid)
+	}
+	template (value) Application_Container_IE_SI3
+	tsu_Application_Container_IE_SI3(template (value) BssgpCellId cid, template (value) SI3 si3) := {
+		rAN_Information_Application_Container := ts_RAN_Information_Application_Container_SI3(cid, si3)
+	}
+
+	/* 3GPP TS 48.018 11.3.64.3 */
+	template (value) Application_Error_Container_MBMS_data_channel
+	ts_Application_Error_Container_MBMS_data_channel(template (value) BssgpCellId cid,
+							 integer cause,
+							 template (value) Application_Container_IE_MBMS_data_channel app_cont) := {
+		 iEI := '56'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 mBMS_data_channel_cause := int2oct(cause, 1),
+		 erroneousApplicationContainer := app_cont
+	}
+	template (value) Application_Container_IE_MBMS_data_channel
+	tsu_Application_Container_IE_MBMS_data_channel_req(template (value) BssgpCellId cid) := {
+		rAN_Information_Request_Application_Container := ts_RAN_Information_Request_Application_Container_MBMS_data_channel(cid)
+	}
+	template (value) Application_Container_IE_MBMS_data_channel
+	tsu_Application_Container_IE_MBMS_data_channel(template (value) BssgpCellId cid, octetstring data_ch_report) := {
+		rAN_Information_Application_Container := ts_RAN_Information_Application_Container_MBMS_data_channel(cid, data_ch_report)
+	}
+
+
+	/* 3GPP TS 44.018 10.5.1.3 -> 3GPP TS 24.008 10.5.1.3 */
+	function t_LocationAreaIdentification(template BssgpCellId cid) return template BSSGP_Types.LocationAreaIdentification {
+		var template BSSGP_Types.LocationAreaIdentification ret := {
+			mccDigit1 := ?,
+			mccDigit2 := ?,
+			mccDigit3 := ?,
+			mncDigit3 := ?,
+			mncDigit1 := ?,
+			mncDigit2 := ?,
+			lac := ?
+		}
+		if (istemplatekind(cid, "omit")) {
+			return omit;
+		} else if (istemplatekind(cid, "*")) {
+			return *;
+		} else if (istemplatekind(cid, "?")) {
+			return ?;
+		}
+		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
+			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
+				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
+				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
+				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
+				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
+				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
+				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
+			}
+			if (isvalue(cid.ra_id.lai.lac)) {
+				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
+			}
+		}
+		return ret;
+	}
+
+	/* 3GPP TS 44.018 10.5.2.11 */
+	template (value) ControlChannelDescription ts_ControlChannelDescription(integer ccch_conf,
+										integer bs_ag_blks_res,
+										boolean att,
+										boolean mscr,
+										integer bs_pa_mfrms,
+										BIT2 cbq3,
+										integer t3212) := {
+		 cCCH_Conf := int2bit(ccch_conf, 3),
+		 bS_AG_BLKS_RES := int2bit(bs_ag_blks_res, 3),
+		 aTT := bool2bit(att),
+		 mSCR := bool2bit(mscr),
+		 bS_PA_MFRMS := int2bit(bs_pa_mfrms, 3),
+		 spare1 := '00'B,
+		 cBQ3 := cbq3,
+		 spare2 := '0'B,
+		 t3212 := int2oct(t3212, 1)
+	}
+
+	/* 3GPP TS 44.018 10.5.2.3 */
+	template (value) CellOptions ts_CellOptions(integer radio_link_timeout,
+						    BIT3 dtx,
+						    boolean pwrc) := {
+		radioLinkTimeout := int2bit(radio_link_timeout, 4),
+		dTX1 := dtx[0] & dtx[1],
+		pWRC := bool2bit(pwrc),
+		dtx2 := dtx[2]
+	}
+
+	/* 3GPP TS 44.018 10.5.2.4 */
+	template (value) CellSelectionParameters ts_CellSelectionParameters(integer ms_txpwr_max_cch,
+									    integer cell_reselection_hysteresis,
+									    integer rxlev_access_min,
+									    boolean neci,
+									    boolean acs) := {
+		mS_TXPWR_MAX_CCH := int2bit(ms_txpwr_max_cch, 5),
+		cellReselectHysterisis := int2bit(cell_reselection_hysteresis, 3),
+		rXLEV_Access_Min := int2bit(rxlev_access_min, 6),
+		nECI := bool2bit(neci),
+		aCS := bool2bit(acs)
+	}
+
+	/* 3GPP TS 44.018 10.5.2.29 */
+	template (value) RACHControlParameters ts_RACHControlParameters(boolean re,
+									boolean cell_barr_access,
+									integer tx_integer,
+									integer max_retrans,
+									integer ac_15_to_8,
+									integer ac_7_to_0) := {
+		rE := bool2bit(re),
+		cellBarrAccess := bool2bit(cell_barr_access),
+		tX_Integer := int2bit(tx_integer, 4),
+		maxRetrans := int2bit(max_retrans, 2),
+		aC_15_to_8 := int2oct(ac_15_to_8, 1),
+		aC_7_to_0 := int2oct(ac_7_to_0, 1)
+	}
+
+	/* 3GPP TS 44.018 9.1.35 */
+	template (value) SI3 ts_SI3(integer cell_id,
+				    template (value) BSSGP_Types.LocationAreaIdentification lai,
+				    template (value) ControlChannelDescription cch_descr,
+				    template (value) CellOptions cell_opt,
+				    template (value) CellSelectionParameters cell_sel_par,
+				    template (value) RACHControlParameters rach_ctrl_par,
+				    OCT4 rest_octets) := {
+		sI3MessageType := '1B'O,
+		cellIdentity := int2oct(cell_id, 2),
+		locationAreaIdentification := lai,
+		controlChannelDescription := cch_descr,
+		cellOptions := cell_opt,
+		cellSelectionParameters := cell_sel_par,
+		rACHControlParameters := rach_ctrl_par,
+		sI3RestOctets := rest_octets
+	}
+
+
+	/* 3GPP TS 48.018 11.3.65 */
+	const BIT3 RIM_PDU_TYPE_STOP := '000'B;
+	const BIT3 RIM_PDU_TYPE_SING_REP := '001'B;
+	const BIT3 RIM_PDU_TYPE_MULT_REP := '010'B;
+	template (value) RIM_PDU_Indications ts_RIM_PDU_Indications(boolean ack, BIT3 type_ext) := {
+		 iEI := '4F'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 1
+		 },
+		 ack := bool2bit(ack),
+		 pDU_Type_Extension := type_ext,
+		 reserved := '0000'B
+	}
+
+	/* 3GPP TS 48.018 11.3.67 */
+	template (value) RIM_Protocol_Version_Number ts_RIM_Protocol_Version_Number(integer ver) := {
+		 iEI := '55'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 1
+		 },
+		 rIMProtocolVersionNumber := int2oct(ver, 1)
+	}
+
+	/* 3GPP TS 48.018 11.3.70 */
+	const HEX1 RIM_ADDR_GERAN_CELL_ID := '0'H;
+	const HEX1 RIM_ADDR_UTRAN_RNC_ID := '1'H;
+	const HEX1 RIM_ADDR_EUTRAN_NODEB_ID := '2'H;
+	const HEX1 RIM_ADDR_EHRPD_SECTOR_ID := '3'H;
+	template (value) RIM_Routing_Information ts_RIM_Routing_Information(HEX1 addr_discr, template (value) RIM_Routing_Address addr) := {
+		 iEI := '54'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 rIMRoutingAddressDiscriminator := addr_discr,
+		 spare := '0'H,
+		 rIM_Routing_Address := addr
+	}
+	template RIM_Routing_Information tr_RIM_Routing_Information(template HEX1 addr_discr := ?, template RIM_Routing_Address addr := ?) := {
+		 iEI := '54'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := ?
+		 },
+		 rIMRoutingAddressDiscriminator := addr_discr,
+		 spare := '0'H,
+		 rIM_Routing_Address := addr
+	}
+
+	template RIM_Routing_Address t_RIM_Routing_Address_cid(template BssgpCellId cid := ?) := {
+		 cell_Identifier := t_Cell_Identifier_V(cid)
+	}
+	template RIM_Routing_Address t_RIM_Routing_Address_rncid(template BssgpCellId cid := ?, template integer rnc_id := ?) := {
+		 globalRNCID := t_GlobalRNC_ID_BSSGP(cid, rnc_id)
+	}
+	template RIM_Routing_Address t_RIM_Routing_Address_enbid(template BssgpCellId cid := ?, template integer tac := ?, template octetstring gnbid := ?) := {
+		 eNB_Identifier := t_ENB_Identifier_V(cid, tac, gnbid)
+	}
+	template RIM_Routing_Address t_RIM_Routing_Address_sector(template octetstring sector := ?) := {
+		 eHRPD_SectorID := sector
+	}
+
+	function t_Cell_Identifier_V(template BssgpCellId cid) return template Cell_Identifier_V {
+		var template Cell_Identifier_V ret := {
+			mccDigit1 := ?,
+			mccDigit2 := ?,
+			mccDigit3 := ?,
+			mncDigit3 := ?,
+			mncDigit1 := ?,
+			mncDigit2 := ?,
+			lac := ?,
+			rac := ?,
+			cI_value := ?
+		}
+		if (istemplatekind(cid, "omit")) {
+			return omit;
+		} else if (istemplatekind(cid, "*")) {
+			return *;
+		} else if (istemplatekind(cid, "?")) {
+			return ?;
+		}
+		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
+			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
+				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
+				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
+				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
+				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
+				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
+				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
+			}
+			if (isvalue(cid.ra_id.lai.lac)) {
+				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
+			}
+		}
+		if (isvalue(cid) and isvalue(cid.ra_id)) {
+			ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
+		}
+		if (isvalue(cid)) {
+			ret.cI_value := f_oct_or_wc(cid.cell_id, 2);
+		}
+		return ret;
+	}
+
+	function t_GlobalRNC_ID_BSSGP(template BssgpCellId cid, template integer rnc_id) return template GlobalRNC_ID_BSSGP {
+		var template GlobalRNC_ID_BSSGP ret := {
+			mccDigit1 := ?,
+			mccDigit2 := ?,
+			mccDigit3 := ?,
+			mncDigit3 := ?,
+			mncDigit1 := ?,
+			mncDigit2 := ?,
+			lac := ?,
+			rac := ?,
+			spare := ?,
+			rNC_ID := ?
+		}
+		if (istemplatekind(cid, "omit") and istemplatekind(rnc_id, "omit")) {
+			return omit;
+		} else if (istemplatekind(cid, "*") and istemplatekind(rnc_id, "*")) {
+			return *;
+		} else if (istemplatekind(cid, "?") and istemplatekind(rnc_id, "?")) {
+			return ?;
+		}
+		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
+			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
+				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
+				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
+				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
+				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
+				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
+				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
+			}
+			if (isvalue(cid.ra_id.lai.lac)) {
+				ret.lac := f_oct_or_wc(cid.ra_id.lai.lac, 2);
+			}
+		}
+		if (isvalue(cid) and isvalue(cid.ra_id)) {
+			ret.rac := f_oct_or_wc(cid.ra_id.rac, 1);
+		}
+		if (isvalue(rnc_id)) {
+			ret.spare := '0'H;
+			ret.rNC_ID := rnc_id;
+		}
+
+		return ret;
+	}
+
+	function t_ENB_Identifier_V(template BssgpCellId cid, template integer tac, template octetstring gnbid) return template ENB_Identifier_V {
+		var template ENB_Identifier_V ret := {
+			mccDigit1 := ?,
+			mccDigit2 := ?,
+			mccDigit3 := ?,
+			mncDigit3 := ?,
+			mncDigit1 := ?,
+			mncDigit2 := ?,
+			tac := ?,
+			globaleNBID := ?
+		}
+		if (istemplatekind(cid, "omit") and istemplatekind(tac, "omit") and istemplatekind(gnbid, "omit")) {
+			return omit;
+		} else if (istemplatekind(cid, "*") and istemplatekind(tac, "*") and istemplatekind(gnbid, "*")) {
+			return *;
+		} else if (istemplatekind(cid, "?") and istemplatekind(tac, "?") and istemplatekind(gnbid, "?")) {
+			return ?;
+		}
+		if (isvalue(cid) and isvalue(cid.ra_id) and isvalue(cid.ra_id.lai)) {
+			if (isvalue(cid.ra_id.lai.mcc_mnc)) {
+				ret.mccDigit1 := cid.ra_id.lai.mcc_mnc[0];
+				ret.mccDigit2 := cid.ra_id.lai.mcc_mnc[1];
+				ret.mccDigit3 := cid.ra_id.lai.mcc_mnc[2];
+				ret.mncDigit3 := cid.ra_id.lai.mcc_mnc[3];
+				ret.mncDigit1 := cid.ra_id.lai.mcc_mnc[4];
+				ret.mncDigit2 := cid.ra_id.lai.mcc_mnc[5];
+			}
+		}
+		if (isvalue(tac)) {
+			ret.tac := int2oct(valueof(tac), 2);
+		}
+		if (isvalue(gnbid)) {
+			ret.globaleNBID := gnbid;
+		}
+
+		return ret;
+	}
+
+	/* 3GPP TS 48.018 11.3.108 */
+	template (value) SON_Transfer_Application_Identity_TLV ts_SON_Transfer_Application_Identity_TLV(template (value) octetstring app_id) := {
+		 iEI := '84'O,
+		 ext := '1'B,
+		 lengthIndicator := {
+			length1 := 0 /* overwritten */
+		 },
+		 sON_Transfer_Application_Identity := app_id
+	}
+
+
+	/* 3GPP TS 48.018 10.6.1 */
+	template (value) PDU_BSSGP
+	ts_RAN_INFORMATION_REQUEST(template (value) RIM_Routing_Information dst,
+				   template (value) RIM_Routing_Information src,
+				   template (value) RAN_Information_Request_RIM_Container cont) := {
+		pDU_BSSGP_RAN_INFORMATION_REQUEST := {
+			bssgpPduType := '71'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+	template PDU_BSSGP
+	tr_RAN_INFORMATION_REQUEST(template RIM_Routing_Information dst := ?,
+				   template RIM_Routing_Information src := ?,
+				   template RAN_Information_Request_RIM_Container cont := ?) := {
+		pDU_BSSGP_RAN_INFORMATION_REQUEST := {
+			bssgpPduType := '71'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+
+	/* 3GPP TS 48.018 10.6.2 */
+	template (value) PDU_BSSGP
+	ts_PDU_BSSGP_RAN_INFORMATION(template (value) RIM_Routing_Information dst,
+				     template (value) RIM_Routing_Information src,
+				     template (value) RAN_Information_RIM_Container cont) := {
+		pDU_BSSGP_RAN_INFORMATION := {
+			bssgpPduType := '70'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+	template PDU_BSSGP
+	tr_PDU_BSSGP_RAN_INFORMATION(template RIM_Routing_Information dst := ?,
+				     template RIM_Routing_Information src := ?,
+				     template RAN_Information_RIM_Container cont := ?) := {
+		pDU_BSSGP_RAN_INFORMATION := {
+			bssgpPduType := '70'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+
+	/* 3GPP TS 48.018 10.6.3 */
+	template (value) PDU_BSSGP
+	ts_PDU_BSSGP_RAN_INFORMATION_ACK(template (value) RIM_Routing_Information dst,
+					 template (value) RIM_Routing_Information src,
+					 template (value) RAN_Information_Ack_RIM_Container cont) := {
+		pDU_BSSGP_RAN_INFORMATION_ACK := {
+			bssgpPduType := '72'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+	template PDU_BSSGP
+	tr_PDU_BSSGP_RAN_INFORMATION_ACK(template RIM_Routing_Information dst := ?,
+					 template RIM_Routing_Information src := ?,
+					 template RAN_Information_Ack_RIM_Container cont := ?) := {
+		pDU_BSSGP_RAN_INFORMATION_ACK := {
+			bssgpPduType := '72'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+
+	/* 3GPP TS 48.018 10.6.4 */
+	template (value) PDU_BSSGP
+	ts_PDU_BSSGP_RAN_INFORMATION_ERROR(template (value) RIM_Routing_Information dst,
+					   template (value) RIM_Routing_Information src,
+					   template (value) RAN_Information_Error_RIM_Container cont) := {
+		pDU_BSSGP_RAN_INFORMATION_ERROR := {
+			bssgpPduType := '73'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+	template PDU_BSSGP
+	tr_PDU_BSSGP_RAN_INFORMATION_ERROR(template RIM_Routing_Information dst := ?,
+					   template RIM_Routing_Information src := ?,
+					   template RAN_Information_Error_RIM_Container cont := ?) := {
+		pDU_BSSGP_RAN_INFORMATION_ERROR := {
+			bssgpPduType := '73'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+
+	/* 3GPP TS 48.018 10.6.5 */
+	template (value) PDU_BSSGP
+	ts_PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR(template (value) RIM_Routing_Information dst,
+						       template (value) RIM_Routing_Information src,
+						       template (value) RAN_Information_Application_Error_RIM_Container cont) := {
+		pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := {
+			bssgpPduType := '74'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+	template PDU_BSSGP
+	tr_PDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR(template RIM_Routing_Information dst := ?,
+						       template RIM_Routing_Information src := ?,
+						       template RAN_Information_Application_Error_RIM_Container cont := ?) := {
+		pDU_BSSGP_RAN_INFORMATION_APPLICATION_ERROR := {
+			bssgpPduType := '74'O,
+			destination_Cell_Identifier := dst,
+			source_Cell_Identifier := src,
+			rIM_Container := cont
+		}
+	}
+
 	/* PDU permitted on PTP BVC only (TS 48.018 Section 5.4.1) */
 	template (present) PDU_BSSGP tr_BSSGP_PERMITTED_PTP_ONLY := (
 		{pDU_BSSGP_DL_UNITDATA := ?},
