diff --git a/library/MGCP_Templates.ttcn b/library/MGCP_Templates.ttcn
index 3a5f139..747700f 100644
--- a/library/MGCP_Templates.ttcn
+++ b/library/MGCP_Templates.ttcn
@@ -10,565 +10,565 @@
  */
 
 
-	import from MGCP_Types all;
-	import from SDP_Types all;
+import from MGCP_Types all;
+import from SDP_Types all;
 
-	function f_mgcp_par_append(inout template MgcpParameterList list, template MgcpParameter par) {
-		var integer len := lengthof(list);
-		list[len] := par;
-	}
+function f_mgcp_par_append(inout template MgcpParameterList list, template MgcpParameter par) {
+	var integer len := lengthof(list);
+	list[len] := par;
+}
 
-	/* 3.2.2.6 Connection Mode (sendonly, recvonly, sendrecv, confrnce, inactive, loopback,
-	 * conttest, netwloop, netwtest) */
-	template MgcpParameter t_MgcpParConnMode(template MgcpConnectionMode mode) := { "M", mode };
+/* 3.2.2.6 Connection Mode (sendonly, recvonly, sendrecv, confrnce, inactive, loopback,
+	* conttest, netwloop, netwtest) */
+template MgcpParameter t_MgcpParConnMode(template MgcpConnectionMode mode) := { "M", mode };
 
-	/* 3.2.2.2 CallId: maximum 32 hex chars */
-	template MgcpParameter ts_MgcpParCallId(MgcpCallId cid) := {
-		code := "C",
-		val := hex2str(cid)
-	};
+/* 3.2.2.2 CallId: maximum 32 hex chars */
+template MgcpParameter ts_MgcpParCallId(MgcpCallId cid) := {
+	code := "C",
+	val := hex2str(cid)
+};
 
-	/* 3.2.2.18 RequestIdentifier: Maximum 32 hex chars */
-	template MgcpParameter ts_MgcpParReqId(MgcpRequestId rid) := {
-		code := "X",
-		val := hex2str(rid)
-	};
+/* 3.2.2.18 RequestIdentifier: Maximum 32 hex chars */
+template MgcpParameter ts_MgcpParReqId(MgcpRequestId rid) := {
+	code := "X",
+	val := hex2str(rid)
+};
 
-	/* 3.2.1.3 SpecificEndpointId */
-	template MgcpParameter ts_MgcpParSpecEP(MgcpEndpoint ep) := {
-		code := "Z",
-		val := ep
-	};
+/* 3.2.1.3 SpecificEndpointId */
+template MgcpParameter ts_MgcpParSpecEP(MgcpEndpoint ep) := {
+	code := "Z",
+	val := ep
+};
 
-	/* 3.2.2.10: LocalConnectionOptions (codec, packetization, bandwidth, ToS, eco, gain, silence, ...) */
-	template MgcpParameter t_MgcpParLocConnOpt(template charstring lco) := { "L", lco };
+/* 3.2.2.10: LocalConnectionOptions (codec, packetization, bandwidth, ToS, eco, gain, silence, ...) */
+template MgcpParameter t_MgcpParLocConnOpt(template charstring lco) := { "L", lco };
 
-	/* 3.2.2.5: ConnectionId: maximum 32 hex chars */
-	template MgcpParameter ts_MgcpParConnectionId(MgcpConnectionId cid) := {
-		code := "I",
-		val := hex2str(cid)
-	};
+/* 3.2.2.5: ConnectionId: maximum 32 hex chars */
+template MgcpParameter ts_MgcpParConnectionId(MgcpConnectionId cid) := {
+	code := "I",
+	val := hex2str(cid)
+};
 
-	/* Osmocom extension: X-Osmux: {*,%u} */
-	template MgcpParameter ts_MgcpParOsmuxCID(MgcpOsmuxCID osmux_cid) := {
-		code := "X-OSMUX",
-		val := f_mgcp_osmux_cid_encode(osmux_cid)
-	};
+/* Osmocom extension: X-Osmux: {*,%u} */
+template MgcpParameter ts_MgcpParOsmuxCID(MgcpOsmuxCID osmux_cid) := {
+	code := "X-OSMUX",
+	val := f_mgcp_osmux_cid_encode(osmux_cid)
+};
 
-	/* Osmocom extension: X-Osmux: {*,%u} */
-	template MgcpParameter t_MgcpParOsmoIGN(template charstring val) := {
-		code := "X-OSMO-IGN",
-		val := val
-	};
+/* Osmocom extension: X-Osmux: {*,%u} */
+template MgcpParameter t_MgcpParOsmoIGN(template charstring val) := {
+	code := "X-OSMO-IGN",
+	val := val
+};
 
-	/* osmo-bsc_mgcp implements L/C/M/X only, osmo-mgw adds 'I' */
-	/* SDP: osmo-bsc_mgcp implements Tx of v,o,s,c,t,m,a */
+/* osmo-bsc_mgcp implements L/C/M/X only, osmo-mgw adds 'I' */
+/* SDP: osmo-bsc_mgcp implements Tx of v,o,s,c,t,m,a */
 
-	template (value) MgcpResponse
-	ts_MgcpResp_Err(template (value) MgcpTransId trans_id,
-			template (value) MgcpResponseCode code,
-			template (value) charstring string := "FAIL") := {
-		line := {
-			code := code,
-			trans_id := trans_id,
-			string := string
-		},
-		params := {},
-		sdp := omit
-	}
-	template MgcpResponse
-	tr_MgcpResp_Err(template (present) MgcpResponseCode code) := {
-		line := {
-			code := code,
-			trans_id := ?,
-			string := ?
-		},
-		params := {},
-		sdp := omit
-	}
-
-	template MgcpCommandLine t_MgcpCmdLine(template charstring verb, template MgcpTransId trans_id, template charstring ep) := {
-		verb := verb,
+template (value) MgcpResponse
+ts_MgcpResp_Err(template (value) MgcpTransId trans_id,
+		template (value) MgcpResponseCode code,
+		template (value) charstring string := "FAIL") := {
+	line := {
+		code := code,
 		trans_id := trans_id,
-		ep := ep,
-		ver := "1.0"
-	};
+		string := string
+	},
+	params := {},
+	sdp := omit
+}
+template MgcpResponse
+tr_MgcpResp_Err(template (present) MgcpResponseCode code) := {
+	line := {
+		code := code,
+		trans_id := ?,
+		string := ?
+	},
+	params := {},
+	sdp := omit
+}
 
-	template MgcpCommand ts_AUEP(MgcpTransId trans_id, charstring ep) := {
-		line := t_MgcpCmdLine("AUEP", trans_id, ep),
-		params := omit,
-		sdp := omit
-	}
+template MgcpCommandLine t_MgcpCmdLine(template charstring verb, template MgcpTransId trans_id, template charstring ep) := {
+	verb := verb,
+	trans_id := trans_id,
+	ep := ep,
+	ver := "1.0"
+};
 
-	template MgcpResponse tr_AUEP_ACK := {
-		line := {
-			code := "200",
-			trans_id := ?,
-			string := "OK"
-		},
-		params:= *,
-		sdp := omit
-	}
+template MgcpCommand ts_AUEP(MgcpTransId trans_id, charstring ep) := {
+	line := t_MgcpCmdLine("AUEP", trans_id, ep),
+	params := omit,
+	sdp := omit
+}
 
-	template MgcpCommand ts_CRCX(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, template SDP_Message sdp := omit) := {
-		line := t_MgcpCmdLine("CRCX", trans_id, ep),
-		params := {
-			t_MgcpParConnMode(mode),
-			ts_MgcpParCallId(call_id),
-			//t_MgcpParReqId(omit),
-			t_MgcpParLocConnOpt("p:20, a:AMR")
-		},
-		sdp := sdp
-	}
+template MgcpResponse tr_AUEP_ACK := {
+	line := {
+		code := "200",
+		trans_id := ?,
+		string := "OK"
+	},
+	params:= *,
+	sdp := omit
+}
 
-	template MgcpCommand ts_CRCX_no_lco(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, template SDP_Message sdp := omit) := {
-		line := t_MgcpCmdLine("CRCX", trans_id, ep),
-		params := {
-			t_MgcpParConnMode(mode),
-			ts_MgcpParCallId(call_id)
-		},
-		sdp := sdp
-	}
+template MgcpCommand ts_CRCX(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, template SDP_Message sdp := omit) := {
+	line := t_MgcpCmdLine("CRCX", trans_id, ep),
+	params := {
+		t_MgcpParConnMode(mode),
+		ts_MgcpParCallId(call_id),
+		//t_MgcpParReqId(omit),
+		t_MgcpParLocConnOpt("p:20, a:AMR")
+	},
+	sdp := sdp
+}
 
-	template MgcpCommand ts_CRCX_osmux(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := {
-		line := t_MgcpCmdLine("CRCX", trans_id, ep),
-		params := {
-			t_MgcpParConnMode(mode),
-			ts_MgcpParCallId(call_id),
-			//t_MgcpParReqId(omit),
-			t_MgcpParLocConnOpt("p:20, a:AMR"),
-			ts_MgcpParOsmuxCID(osmux_cid)
-		},
-		sdp := sdp
-	}
+template MgcpCommand ts_CRCX_no_lco(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, template SDP_Message sdp := omit) := {
+	line := t_MgcpCmdLine("CRCX", trans_id, ep),
+	params := {
+		t_MgcpParConnMode(mode),
+		ts_MgcpParCallId(call_id)
+	},
+	sdp := sdp
+}
 
-	template MgcpCommand tr_CRCX(template MgcpEndpoint ep := ?, template SDP_Message sdp := *) := {
-		line := t_MgcpCmdLine("CRCX", ?, ep),
-		params := *,
-		sdp := sdp
-	}
+template MgcpCommand ts_CRCX_osmux(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := {
+	line := t_MgcpCmdLine("CRCX", trans_id, ep),
+	params := {
+		t_MgcpParConnMode(mode),
+		ts_MgcpParCallId(call_id),
+		//t_MgcpParReqId(omit),
+		t_MgcpParLocConnOpt("p:20, a:AMR"),
+		ts_MgcpParOsmuxCID(osmux_cid)
+	},
+	sdp := sdp
+}
 
-	template MgcpResponse tr_CRCX_ACK := {
-		line := {
-			code := "200",
-			trans_id := ?,
-			string := "OK"
-		},
-		params:= { { "I", ? }, *},
-		sdp := ?
-	}
+template MgcpCommand tr_CRCX(template MgcpEndpoint ep := ?, template SDP_Message sdp := *) := {
+	line := t_MgcpCmdLine("CRCX", ?, ep),
+	params := *,
+	sdp := sdp
+}
 
-	template MgcpResponse tr_CRCX_ACK_osmux := {
-		line := {
-			code := "200",
-			trans_id := ?,
-			string := "OK"
-		},
-		params:= { { "I", ? }, {"X-OSMUX", ?}, *},
-		sdp := ?
-	}
+template MgcpResponse tr_CRCX_ACK := {
+	line := {
+		code := "200",
+		trans_id := ?,
+		string := "OK"
+	},
+	params:= { { "I", ? }, *},
+	sdp := ?
+}
 
-	template MgcpResponse ts_CRCX_ACK(MgcpTransId trans_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := {
-		line := {
-			code := "200",
-			trans_id := trans_id,
-			string := "OK"
-		},
-		params:= { ts_MgcpParConnectionId(conn_id) },
-		sdp := sdp
-	}
+template MgcpResponse tr_CRCX_ACK_osmux := {
+	line := {
+		code := "200",
+		trans_id := ?,
+		string := "OK"
+	},
+	params:= { { "I", ? }, {"X-OSMUX", ?}, *},
+	sdp := ?
+}
 
-	template MgcpResponse ts_CRCX_ACK_osmux(MgcpTransId trans_id, MgcpConnectionId conn_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := {
-		line := {
-			code := "200",
-			trans_id := trans_id,
-			string := "OK"
-		},
-		params:= {
-			ts_MgcpParConnectionId(conn_id),
-			ts_MgcpParOsmuxCID(osmux_cid)
-		},
-		sdp := sdp
-	}
+template MgcpResponse ts_CRCX_ACK(MgcpTransId trans_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := {
+	line := {
+		code := "200",
+		trans_id := trans_id,
+		string := "OK"
+	},
+	params:= { ts_MgcpParConnectionId(conn_id) },
+	sdp := sdp
+}
 
-	template MgcpCommand ts_MDCX(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := {
-		line := t_MgcpCmdLine("MDCX", trans_id, ep),
-		params := {
-			t_MgcpParConnMode(mode),
-			ts_MgcpParCallId(call_id),
-			ts_MgcpParConnectionId(conn_id),
-			//t_MgcpParReqId(omit),
-			t_MgcpParLocConnOpt("p:20, a:AMR")
-		},
-		sdp := sdp
-	}
+template MgcpResponse ts_CRCX_ACK_osmux(MgcpTransId trans_id, MgcpConnectionId conn_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := {
+	line := {
+		code := "200",
+		trans_id := trans_id,
+		string := "OK"
+	},
+	params:= {
+		ts_MgcpParConnectionId(conn_id),
+		ts_MgcpParOsmuxCID(osmux_cid)
+	},
+	sdp := sdp
+}
 
-	template MgcpCommand ts_MDCX_osmux(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, MgcpConnectionId conn_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := {
-		line := t_MgcpCmdLine("MDCX", trans_id, ep),
-		params := {
-			t_MgcpParConnMode(mode),
-			ts_MgcpParCallId(call_id),
-			ts_MgcpParConnectionId(conn_id),
-			//t_MgcpParReqId(omit),
-			t_MgcpParLocConnOpt("p:20, a:AMR"),
-			ts_MgcpParOsmuxCID(osmux_cid)
-		},
-		sdp := sdp
-	}
+template MgcpCommand ts_MDCX(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := {
+	line := t_MgcpCmdLine("MDCX", trans_id, ep),
+	params := {
+		t_MgcpParConnMode(mode),
+		ts_MgcpParCallId(call_id),
+		ts_MgcpParConnectionId(conn_id),
+		//t_MgcpParReqId(omit),
+		t_MgcpParLocConnOpt("p:20, a:AMR")
+	},
+	sdp := sdp
+}
 
-	template MgcpCommand tr_MDCX(template SDP_Message sdp := *) := {
-		line := t_MgcpCmdLine("MDCX", ?, ?),
-		params := *,
-		sdp := sdp
-	}
+template MgcpCommand ts_MDCX_osmux(MgcpTransId trans_id, charstring ep, MgcpConnectionMode mode, MgcpCallId call_id, MgcpConnectionId conn_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := {
+	line := t_MgcpCmdLine("MDCX", trans_id, ep),
+	params := {
+		t_MgcpParConnMode(mode),
+		ts_MgcpParCallId(call_id),
+		ts_MgcpParConnectionId(conn_id),
+		//t_MgcpParReqId(omit),
+		t_MgcpParLocConnOpt("p:20, a:AMR"),
+		ts_MgcpParOsmuxCID(osmux_cid)
+	},
+	sdp := sdp
+}
 
-	template MgcpResponse tr_MDCX_ACK := {
-		line := {
-			code := "200",
-			trans_id := ?,
-			string := "OK"
-		},
-		params := *,
-		sdp := ?
-	}
+template MgcpCommand tr_MDCX(template SDP_Message sdp := *) := {
+	line := t_MgcpCmdLine("MDCX", ?, ?),
+	params := *,
+	sdp := sdp
+}
 
-	template MgcpResponse ts_MDCX_ACK(MgcpTransId trans_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := ts_CRCX_ACK(trans_id, conn_id, sdp);
-	template MgcpResponse ts_MDCX_ACK_osmux(MgcpTransId trans_id, MgcpConnectionId conn_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := ts_CRCX_ACK_osmux(trans_id, conn_id, osmux_cid, sdp);
+template MgcpResponse tr_MDCX_ACK := {
+	line := {
+		code := "200",
+		trans_id := ?,
+		string := "OK"
+	},
+	params := *,
+	sdp := ?
+}
 
-	/* have a function that generates a template, rather than a template in order to handle
-	 * optional parameters */
-	function ts_DLCX(MgcpTransId trans_id, charstring ep, template MgcpCallId call_id := omit,
-			 template MgcpConnectionId conn_id := omit) return template MgcpCommand {
-		var template MgcpCommand cmd;
-		cmd.line := t_MgcpCmdLine("DLCX", trans_id, ep);
-		cmd.params := {};
-		cmd.sdp := omit;
-		if (isvalue(call_id)) {
-			f_mgcp_par_append(cmd.params, ts_MgcpParCallId(valueof(call_id)));
-			if (isvalue(conn_id)) {
-				f_mgcp_par_append(cmd.params, ts_MgcpParConnectionId(valueof(conn_id)));
-			}
-		}
-		return cmd;
-	}
+template MgcpResponse ts_MDCX_ACK(MgcpTransId trans_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := ts_CRCX_ACK(trans_id, conn_id, sdp);
+template MgcpResponse ts_MDCX_ACK_osmux(MgcpTransId trans_id, MgcpConnectionId conn_id, MgcpOsmuxCID osmux_cid, template SDP_Message sdp := omit) := ts_CRCX_ACK_osmux(trans_id, conn_id, osmux_cid, sdp);
 
-	template MgcpCommand tr_DLCX(template MgcpEndpoint ep := ?) := {
-		line := t_MgcpCmdLine("DLCX", ?, ep),
-		params := *,
-		sdp := *
-	}
-
-	template MgcpResponse tr_DLCX_ACK := {
-		line := {
-			code := ("200", "250"),
-			trans_id := ?,
-			string := "OK"
-		},
-		params:= *,
-		sdp := *
-	}
-
-	template MgcpResponse ts_DLCX_ACK2(MgcpTransId trans_id) := {
-		line := {
-			code := "250",
-			trans_id := trans_id,
-			string := "OK"
-		},
-		params:= { /* list of ConnectionIDs */ },
-		sdp := omit
-	}
-
-
-
-	template MgcpResponse ts_DLCX_ACK(MgcpTransId trans_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := ts_CRCX_ACK(trans_id, conn_id, sdp);
-
-	template MgcpCommand tr_RSIP := {
-		line := t_MgcpCmdLine("RSIP", ?, ?),
-		params := *,
-		sdp := *
-	}
-
-	/* SDP Templates */
-	template SDP_Origin ts_SDP_origin(charstring addr, charstring session_id,
-					  charstring session_version := "1",
-					  charstring addr_type := "IP4",
-					  charstring user_name := "-") := {
-		user_name := user_name,
-		session_id := session_id,
-		session_version := session_version,
-		net_type := "IN",
-		addr_type := addr_type,
-		addr := addr
-	}
-
-	template SDP_connection ts_SDP_connection_IP(charstring addr, charstring addr_type := "IP4",
-						     template integer ttl := omit,
-						     template integer num_of_addr := omit) :={
-		net_type := "IN",
-		addr_type := addr_type,
-		conn_addr := {
-			addr := addr,
-			ttl := ttl,
-			num_of_addr := num_of_addr
+/* have a function that generates a template, rather than a template in order to handle
+	* optional parameters */
+function ts_DLCX(MgcpTransId trans_id, charstring ep, template MgcpCallId call_id := omit,
+		 template MgcpConnectionId conn_id := omit) return template MgcpCommand {
+	var template MgcpCommand cmd;
+	cmd.line := t_MgcpCmdLine("DLCX", trans_id, ep);
+	cmd.params := {};
+	cmd.sdp := omit;
+	if (isvalue(call_id)) {
+		f_mgcp_par_append(cmd.params, ts_MgcpParCallId(valueof(call_id)));
+		if (isvalue(conn_id)) {
+			f_mgcp_par_append(cmd.params, ts_MgcpParConnectionId(valueof(conn_id)));
 		}
 	}
+	return cmd;
+}
 
-	template SDP_connection tr_SDP_connection_IP(template charstring addr, template charstring addr_type := ?,
-						     template integer ttl := *,
-						     template integer num_of_addr := *) := {
-		net_type := "IN",
-		addr_type := addr_type,
-		conn_addr := {
-			addr := addr,
-			ttl := ttl,
-			num_of_addr := num_of_addr
-		}
+template MgcpCommand tr_DLCX(template MgcpEndpoint ep := ?) := {
+	line := t_MgcpCmdLine("DLCX", ?, ep),
+	params := *,
+	sdp := *
+}
+
+template MgcpResponse tr_DLCX_ACK := {
+	line := {
+		code := ("200", "250"),
+		trans_id := ?,
+		string := "OK"
+	},
+	params:= *,
+	sdp := *
+}
+
+template MgcpResponse ts_DLCX_ACK2(MgcpTransId trans_id) := {
+	line := {
+		code := "250",
+		trans_id := trans_id,
+		string := "OK"
+	},
+	params:= { /* list of ConnectionIDs */ },
+	sdp := omit
+}
+
+
+
+template MgcpResponse ts_DLCX_ACK(MgcpTransId trans_id, MgcpConnectionId conn_id, template SDP_Message sdp := omit) := ts_CRCX_ACK(trans_id, conn_id, sdp);
+
+template MgcpCommand tr_RSIP := {
+	line := t_MgcpCmdLine("RSIP", ?, ?),
+	params := *,
+	sdp := *
+}
+
+/* SDP Templates */
+template SDP_Origin ts_SDP_origin(charstring addr, charstring session_id,
+				  charstring session_version := "1",
+				  charstring addr_type := "IP4",
+				  charstring user_name := "-") := {
+	user_name := user_name,
+	session_id := session_id,
+	session_version := session_version,
+	net_type := "IN",
+	addr_type := addr_type,
+	addr := addr
+}
+
+template SDP_connection ts_SDP_connection_IP(charstring addr, charstring addr_type := "IP4",
+					     template integer ttl := omit,
+					     template integer num_of_addr := omit) :={
+	net_type := "IN",
+	addr_type := addr_type,
+	conn_addr := {
+		addr := addr,
+		ttl := ttl,
+		num_of_addr := num_of_addr
 	}
+}
 
-	template SDP_time ts_SDP_time(charstring beg, charstring end) := {
-		time_field := {
-			start_time := beg,
-			stop_time := end
+template SDP_connection tr_SDP_connection_IP(template charstring addr, template charstring addr_type := ?,
+					     template integer ttl := *,
+					     template integer num_of_addr := *) := {
+	net_type := "IN",
+	addr_type := addr_type,
+	conn_addr := {
+		addr := addr,
+		ttl := ttl,
+		num_of_addr := num_of_addr
+	}
+}
+
+template SDP_time ts_SDP_time(charstring beg, charstring end) := {
+	time_field := {
+		start_time := beg,
+		stop_time := end
+	},
+	time_repeat := omit
+}
+
+template SDP_media_desc ts_SDP_media_desc(integer port_number, SDP_fmt_list fmts,
+					  SDP_attribute_list attributes) := {
+	media_field := {
+		media := "audio",
+		ports := {
+			port_number := port_number,
+			num_of_ports := omit
 		},
-		time_repeat := omit
-	}
+		transport := "RTP/AVP",
+		fmts := fmts
+	},
+	information := omit,
+	connections := omit,
+	bandwidth := omit,
+	key := omit,
+	attributes := attributes
+}
 
-	template SDP_media_desc ts_SDP_media_desc(integer port_number, SDP_fmt_list fmts,
-						  SDP_attribute_list attributes) := {
-		media_field := {
-			media := "audio",
-			ports := {
-				port_number := port_number,
-				num_of_ports := omit
-			},
-			transport := "RTP/AVP",
-			fmts := fmts
+template SDP_media_desc tr_SDP_media_desc(template integer port_number := ?,
+					  template SDP_fmt_list fmts := ?,
+					  template SDP_attribute_list attributes := ?) := {
+	media_field := {
+		media := "audio",
+		ports := {
+			port_number := port_number,
+			num_of_ports := omit
 		},
-		information := omit,
-		connections := omit,
-		bandwidth := omit,
-		key := omit,
-		attributes := attributes
-	}
+		transport := "RTP/AVP",
+		fmts := fmts
+	},
+	information := *,
+	connections := *,
+	bandwidth := *,
+	key := *,
+	attributes := attributes
+}
 
-	template SDP_media_desc tr_SDP_media_desc(template integer port_number := ?,
-						  template SDP_fmt_list fmts := ?,
-						  template SDP_attribute_list attributes := ?) := {
-		media_field := {
-			media := "audio",
-			ports := {
-				port_number := port_number,
-				num_of_ports := omit
-			},
-			transport := "RTP/AVP",
-			fmts := fmts
-		},
-		information := *,
-		connections := *,
-		bandwidth := *,
-		key := *,
-		attributes := attributes
-	}
+/* master template for generating SDP based in template arguments */
+template SDP_Message ts_SDP(charstring local_addr, charstring remote_addr,
+			    charstring session_id, charstring session_version,
+			    integer rtp_port, SDP_fmt_list fmts,
+			    SDP_attribute_list attributes) := {
+	protocol_version := 0,
+	origin := ts_SDP_origin(local_addr, session_id, session_version, f_mgcp_addr2addrtype(local_addr)),
+	session_name := "-",
+	information := omit,
+	uri := omit,
+	emails := omit,
+	phone_numbers := omit,
+	connection := ts_SDP_connection_IP(remote_addr, f_mgcp_addr2addrtype(remote_addr)),
+	bandwidth := omit,
+	times := { ts_SDP_time("0","0") },
+	timezone_adjustments := omit,
+	key := omit,
+	attributes := omit,
+	media_list := { ts_SDP_media_desc(rtp_port, fmts, attributes) }
+}
 
-	/* master template for generating SDP based in template arguments */
-	template SDP_Message ts_SDP(charstring local_addr, charstring remote_addr,
-				    charstring session_id, charstring session_version,
-				    integer rtp_port, SDP_fmt_list fmts,
-				    SDP_attribute_list attributes) := {
-		protocol_version := 0,
-		origin := ts_SDP_origin(local_addr, session_id, session_version, f_mgcp_addr2addrtype(local_addr)),
-		session_name := "-",
-		information := omit,
-		uri := omit,
-		emails := omit,
-		phone_numbers := omit,
-		connection := ts_SDP_connection_IP(remote_addr, f_mgcp_addr2addrtype(remote_addr)),
-		bandwidth := omit,
-		times := { ts_SDP_time("0","0") },
-		timezone_adjustments := omit,
-		key := omit,
-		attributes := omit,
-		media_list := { ts_SDP_media_desc(rtp_port, fmts, attributes) }
-	}
+template SDP_Message tr_SDP(template charstring remote_addr := ?, template integer rtp_port := ?) := {
+	protocol_version := 0,
+	origin := ?,
+	session_name := ?,
+	information := *,
+	uri := *,
+	emails := *,
+	phone_numbers := *,
+	connection := tr_SDP_connection_IP(remote_addr, ?),
+	bandwidth := *,
+	times := ?,
+	timezone_adjustments := *,
+	key := *,
+	attributes := *,
+	media_list := { tr_SDP_media_desc(rtp_port) }
+}
 
-	template SDP_Message tr_SDP(template charstring remote_addr := ?, template integer rtp_port := ?) := {
-		protocol_version := 0,
-		origin := ?,
-		session_name := ?,
-		information := *,
-		uri := *,
-		emails := *,
-		phone_numbers := *,
-		connection := tr_SDP_connection_IP(remote_addr, ?),
-		bandwidth := *,
-		times := ?,
-		timezone_adjustments := *,
-		key := *,
-		attributes := *,
-		media_list := { tr_SDP_media_desc(rtp_port) }
+template SDP_attribute ts_SDP_rtpmap(integer fmt, charstring val) := {
+	rtpmap := {
+		attr_value := int2str(fmt) & " " & val
 	}
+}
+template SDP_attribute ts_SDP_ptime(integer p) := {
+	ptime := {
+		attr_value := int2str(p)
+	}
+}
+template SDP_attribute ts_SDP_fmtp(integer fmt, charstring val) := {
+	fmtp := {
+		attr_value := int2str(fmt) & " " & val
+	}
+}
 
-	template SDP_attribute ts_SDP_rtpmap(integer fmt, charstring val) := {
-		rtpmap := {
-			attr_value := int2str(fmt) & " " & val
+function f_mgcp_addr2addrtype(charstring addr) return charstring {
+	for (var integer i := 0; i < lengthof(addr); i := i + 1) {
+		if (addr[i] == ":") {
+			return "IP6";
 		}
 	}
-	template SDP_attribute ts_SDP_ptime(integer p) := {
-		ptime := {
-			attr_value := int2str(p)
+	return "IP4";
+}
+
+/* -1 is wildcard, positive is translated as string */
+function f_mgcp_osmux_cid_encode(MgcpOsmuxCID osmux_cid) return charstring {
+	if (osmux_cid == -1) {
+		return "*";
+	}
+	return int2str(osmux_cid);
+}
+
+function f_mgcp_osmux_cid_decode(charstring osmux_cid) return MgcpOsmuxCID {
+	if (osmux_cid == "*") {
+		return -1;
+	}
+	return str2int(osmux_cid);
+}
+
+function f_mgcp_contains_par(MgcpMessage msg, MgcpInfoCode code) return boolean {
+	var MgcpParameterList pars;
+	if (ischosen(msg.command)) {
+		pars := msg.command.params;
+	} else {
+		pars := msg.response.params;
+	}
+	for (var integer i := 0; i < lengthof(pars); i := i + 1) {
+		var MgcpParameter par := pars[i];
+		if (par.code == code) {
+			return true;
 		}
 	}
-	template SDP_attribute ts_SDP_fmtp(integer fmt, charstring val) := {
-		fmtp := {
-			attr_value := int2str(fmt) & " " & val
+	return false;
+}
+
+function f_mgcp_extract_par(MgcpMessage msg, MgcpInfoCode code) return charstring {
+	var MgcpParameterList pars;
+	if (ischosen(msg.command)) {
+		pars := msg.command.params;
+	} else {
+		pars := msg.response.params;
+	}
+	for (var integer i := 0; i < lengthof(pars); i := i + 1) {
+		var MgcpParameter par := pars[i];
+		if (par.code == code) {
+			return par.val;
 		}
 	}
+	setverdict(fail, "Could not extract parameters for code ", code);
+	return "";
+}
 
-	function f_mgcp_addr2addrtype(charstring addr) return charstring {
-		for (var integer i := 0; i < lengthof(addr); i := i + 1) {
-			if (addr[i] == ":") {
-				return "IP6";
-			}
+function f_MgcpResp_extract_par(MgcpResponse resp, MgcpInfoCode code) return charstring {
+	var MgcpMessage msg := {
+		response := resp
+	}
+	return f_mgcp_extract_par(msg, code);
+}
+
+function f_MgcpCmd_extract_par(MgcpCommand cmd, MgcpInfoCode code) return charstring {
+	var MgcpMessage msg := {
+		command := cmd
+	}
+	return f_mgcp_extract_par(msg, code);
+}
+
+function f_MgcpCmd_contains_par(MgcpCommand cmd, MgcpInfoCode code) return boolean {
+	var MgcpMessage msg := {
+		command := cmd
+	}
+	return f_mgcp_contains_par(msg, code);
+}
+
+function f_MgcpResp_extract_conn_id(MgcpResponse resp) return MgcpConnectionId {
+	return str2hex(f_MgcpResp_extract_par(resp, "I"));
+}
+
+function f_MgcpCmd_extract_call_id(MgcpCommand cmd) return MgcpCallId {
+	return str2hex(f_MgcpCmd_extract_par(cmd, "C"));
+}
+
+function f_MgcpCmd_extract_conn_id(MgcpCommand cmd) return MgcpConnectionId {
+	return str2hex(f_MgcpCmd_extract_par(cmd, "I"));
+}
+
+function f_MgcpCmd_extract_osmux_cid(MgcpCommand cmd) return MgcpOsmuxCID {
+	return f_mgcp_osmux_cid_decode(f_MgcpCmd_extract_par(cmd, "X-OSMUX"));
+}
+
+
+function f_mgcp_alloc_tid() return MgcpTransId {
+	return int2str(float2int(rnd()*2147483647.0));
+}
+
+function f_mgcp_alloc_call_id() return MgcpCallId {
+	return int2hex(float2int(rnd()*2147483647.0), 8);
+}
+
+function f_mgcp_alloc_conn_id() return MgcpConnectionId {
+	return int2hex(float2int(rnd()*2147483647.0), 8);
+}
+
+/* those verbs that related to a connection (and hence have ConnectionId) */
+template MgcpVerb tr_MgcpVerb_ConnectionOriented := ("CRCX", "MDCX", "DLCX", "AUCX");
+/* entire command template matching only connection oriented verbs */
+template MgcpCommand tr_MgcpCommand_CO := {
+	line := {
+		verb := tr_MgcpVerb_ConnectionOriented,
+		trans_id := ?,
+		ep := ?,
+		ver := ?
+	},
+	params := *,
+	sdp := *
+}
+
+function f_mgcp_find_param_entry(MgcpParameterList pars, MgcpInfoCode code, out charstring ret)
+return boolean {
+	for (var integer i := 0; i < sizeof(pars); i := i+1) {
+		if (pars[i].code == code) {
+			ret := pars[i].val;
+			return true;
 		}
-		return "IP4";
 	}
+	return false;
+}
 
-	/* -1 is wildcard, positive is translated as string */
-	function f_mgcp_osmux_cid_encode(MgcpOsmuxCID osmux_cid) return charstring {
-		if (osmux_cid == -1) {
-			return "*";
-		}
-		return int2str(osmux_cid);
+function f_mgcp_find_param(MgcpMessage msg, MgcpInfoCode code, out charstring ret)
+return boolean {
+	var MgcpParameterList pars;
+	if (ischosen(msg.command)) {
+		pars := msg.command.params;
+	} else {
+		pars := msg.response.params;
 	}
+	return f_mgcp_find_param_entry(pars, code, ret);
+}
 
-	function f_mgcp_osmux_cid_decode(charstring osmux_cid) return MgcpOsmuxCID {
-		if (osmux_cid == "*") {
-			return -1;
-		}
-		return str2int(osmux_cid);
-	}
-
-	function f_mgcp_contains_par(MgcpMessage msg, MgcpInfoCode code) return boolean {
-		var MgcpParameterList pars;
-		if (ischosen(msg.command)) {
-			pars := msg.command.params;
-		} else {
-			pars := msg.response.params;
-		}
-		for (var integer i := 0; i < lengthof(pars); i := i + 1) {
-			var MgcpParameter par := pars[i];
-			if (par.code == code) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	function f_mgcp_extract_par(MgcpMessage msg, MgcpInfoCode code) return charstring {
-		var MgcpParameterList pars;
-		if (ischosen(msg.command)) {
-			pars := msg.command.params;
-		} else {
-			pars := msg.response.params;
-		}
-		for (var integer i := 0; i < lengthof(pars); i := i + 1) {
-			var MgcpParameter par := pars[i];
-			if (par.code == code) {
-				return par.val;
-			}
-		}
-		setverdict(fail, "Could not extract parameters for code ", code);
-		return "";
-	}
-
-	function f_MgcpResp_extract_par(MgcpResponse resp, MgcpInfoCode code) return charstring {
-		var MgcpMessage msg := {
-			response := resp
-		}
-		return f_mgcp_extract_par(msg, code);
-	}
-
-	function f_MgcpCmd_extract_par(MgcpCommand cmd, MgcpInfoCode code) return charstring {
-		var MgcpMessage msg := {
-			command := cmd
-		}
-		return f_mgcp_extract_par(msg, code);
-	}
-
-	function f_MgcpCmd_contains_par(MgcpCommand cmd, MgcpInfoCode code) return boolean {
-		var MgcpMessage msg := {
-			command := cmd
-		}
-		return f_mgcp_contains_par(msg, code);
-	}
-
-	function f_MgcpResp_extract_conn_id(MgcpResponse resp) return MgcpConnectionId {
-		return str2hex(f_MgcpResp_extract_par(resp, "I"));
-	}
-
-	function f_MgcpCmd_extract_call_id(MgcpCommand cmd) return MgcpCallId {
-		return str2hex(f_MgcpCmd_extract_par(cmd, "C"));
-	}
-
-	function f_MgcpCmd_extract_conn_id(MgcpCommand cmd) return MgcpConnectionId {
-		return str2hex(f_MgcpCmd_extract_par(cmd, "I"));
-	}
-
-	function f_MgcpCmd_extract_osmux_cid(MgcpCommand cmd) return MgcpOsmuxCID {
-		return f_mgcp_osmux_cid_decode(f_MgcpCmd_extract_par(cmd, "X-OSMUX"));
-	}
-
-
-	function f_mgcp_alloc_tid() return MgcpTransId {
-		return int2str(float2int(rnd()*2147483647.0));
-	}
-
-	function f_mgcp_alloc_call_id() return MgcpCallId {
-		return int2hex(float2int(rnd()*2147483647.0), 8);
-	}
-
-	function f_mgcp_alloc_conn_id() return MgcpConnectionId {
-		return int2hex(float2int(rnd()*2147483647.0), 8);
-	}
-
-	/* those verbs that related to a connection (and hence have ConnectionId) */
-	template MgcpVerb tr_MgcpVerb_ConnectionOriented := ("CRCX", "MDCX", "DLCX", "AUCX");
-	/* entire command template matching only connection oriented verbs */
-	template MgcpCommand tr_MgcpCommand_CO := {
-		line := {
-			verb := tr_MgcpVerb_ConnectionOriented,
-			trans_id := ?,
-			ep := ?,
-			ver := ?
-		},
-		params := *,
-		sdp := *
-	}
-
-	function f_mgcp_find_param_entry(MgcpParameterList pars, MgcpInfoCode code, out charstring ret)
-	return boolean {
-		for (var integer i := 0; i < sizeof(pars); i := i+1) {
-			if (pars[i].code == code) {
-				ret := pars[i].val;
-				return true;
-			}
-		}
-		return false;
-	}
-
-	function f_mgcp_find_param(MgcpMessage msg, MgcpInfoCode code, out charstring ret)
-	return boolean {
-		var MgcpParameterList pars;
-		if (ischosen(msg.command)) {
-			pars := msg.command.params;
-		} else {
-			pars := msg.response.params;
-		}
-		return f_mgcp_find_param_entry(pars, code, ret);
-	}
-
-	/* template to determine if a MGCP endpoint is a wildcard endpoint */
-	template charstring t_MGCP_EP_wildcard := (pattern "\*@*", pattern "rtpbridge/\*@*");
+/* template to determine if a MGCP endpoint is a wildcard endpoint */
+template charstring t_MGCP_EP_wildcard := (pattern "\*@*", pattern "rtpbridge/\*@*");
 
 
 }
