diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn
index 68157f3..55720ee 100644
--- a/ggsn_tests/GGSN_Tests.ttcn
+++ b/ggsn_tests/GGSN_Tests.ttcn
@@ -31,6 +31,8 @@
 	import from IP_Types all;
 	import from ICMP_Types all;
 	import from ICMPv6_Types all;
+	import from ICMP_Templates all;
+	import from ICMPv6_Templates all;
 	import from Native_Functions all;
 	import from Osmocom_VTY_Functions all;
 	import from TELNETasp_PortType all;
@@ -819,285 +821,6 @@
 		T_default.stop;
 	}
 
-	/* IPv6 router solicitation  fe80::2 -> ff02::2 from 02:88:b5:1f:25:59 */
-	const octetstring c_router_solicit := '6000000000103afffe800000000000000000000000000002ff02000000000000000000000000000285009f2b0000000001010288b51f2559'O;
-	/* IPv6 neighbor solicitation fe80::2 -> ff02::1:ff00:2 from 02:88:b5:1f:25:59 */
-	const octetstring c_neigh_solicit:= '6000000000203afffe800000000000000000000000000002ff0200000000000000000001ff00000287009f9600000000fe80000000000000000000000000000201010288b51f2559'O;
-
-	/* template for sending an ICMPv4 echo request */
-	template (value) PDU_ICMP ts_ICMPv4_ERQ(octetstring data := ''O) := {
-		echo := {
-			type_field := 8,
-			code := 0,
-			checksum := '0000'O,
-			identifier := '0345'O,
-			sequence_number := '0001'O,
-			data := data
-		}
-	}
-
-	/* template for receiving/matching an ICMPv4 echo request */
-	template (present) PDU_ICMP tr_ICMPv4_ERQ := {
-		echo := {
-			type_field := 8,
-			code := 0,
-			checksum := ?,
-			identifier := ?,
-			sequence_number := ?,
-			data := ?
-		}
-	}
-
-	/* template for receiving/matching an ICMPv4 echo reply */
-	template (present) PDU_ICMP tr_ICMPv4_ERP(template octetstring data := *) := {
-		echo_reply := {
-			type_field := 0,
-			code := 0,
-			checksum := ?,
-			identifier := ?,
-			sequence_number := ?,
-			data := data
-		}
-	}
-
-	/* template for receiving/matching an ICMPv6 Destination Unreachable  */
-	template (present) PDU_ICMP tr_ICMPv4_DU := {
-		destination_unreachable := {
-			type_field := 1,
-			code := ?,
-			checksum := ?,
-			unused := ?,
-			original_ip_msg  := ?
-		}
-	}
-
-	/* template to construct IPv4_packet from input arguments, ready for use in f_IPv4_enc() */
-	template (value) IPv4_packet ts_IP4(OCT4 srcaddr, OCT4 dstaddr, LIN1 proto, LIN2_BO_LAST tlen, octetstring payload) := {
-		header := {
-			ver := 4,
-			hlen := 5,
-			tos := 0,
-			tlen := tlen,
-			id := 35902,
-			res := '0'B,
-			dfrag := '1'B,
-			mfrag := '0'B,
-			foffset := 0,
-			ttl := 64,
-			proto := proto,
-			cksum := 0,
-			srcaddr := srcaddr,
-			dstaddr := dstaddr
-		},
-		ext_headers := omit,
-		payload := payload
-	}
-
-	/* template to generate a 'Prefix Information' ICMPv6 option */
-	template (value) OptionField ts_ICMP6_OptPrefix(OCT16 prefix, INT1 prefix_len) := {
-		prefixInformation := {
-			typeField := 3,
-			lengthIndicator := 8,
-			prefixLength := prefix_len,
-			reserved1 := '000000'B,
-			a_Bit := '0'B,
-			l_Bit := '0'B,
-			validLifetime := oct2int('FFFFFFFF'O),
-			preferredLifetime := oct2int('FFFFFFFF'O),
-			reserved2 := '00000000'O,
-			prefix := prefix
-		}
-	}
-
-	/* template for sending an ICMPv6 echo request */
-	template (value) PDU_ICMPv6 ts_ICMPv6_ERQ := {
-		echoRequest := {
-			typeField := 128,
-			code := 0,
-			checksum := '0000'O,
-			identifier := 0,
-			sequenceNr := 0,
-			data := ''O
-		}
-	}
-
-	/* template for sending an ICMPv6 router solicitation */
-	template (value) PDU_ICMPv6 ts_ICMPv6_RS := {
-		routerSolicitation := {
-			typeField := 133,
-			code := 0,
-			checksum := '0000'O,
-			reserved := '00000000'O,
-			/* TODO: do we need 'Source link-layer address' ? */
-			options := omit
-		}
-	}
-
-	/* template for sending an ICMPv6 router advertisement */
-	template (value) PDU_ICMPv6 ts_ICMPv6_RA(OCT16 prefix, INT1 prefix_len) := {
-		routerAdvertisement := {
-			typeField := 134,
-			code := 0,
-			checksum := '0000'O,
-			curHopLimit := 0,
-			reserved := '000000'B,
-			o_Bit := '0'B,
-			m_Bit := '0'B,
-			routerLifetime := oct2int('FFFF'O),
-			reachableTime := oct2int('FFFFFFFF'O),
-			retransTimer := oct2int('FFFFFFFF'O),
-			options := {
-				ts_ICMP6_OptPrefix(prefix, prefix_len)
-			}
-		}
-	}
-
-	/* template for sending an ICMPv6 neighbor solicitation */
-	template (value) PDU_ICMPv6 ts_ICMPv6_NS(OCT16 target_addr) := {
-		neighborSolicitation := {
-			typeField := 135,
-			code := 0,
-			checksum := '0000'O,
-			reserved := '00000000'O,
-			targetAddress := target_addr,
-			/* TODO: do we need 'Source link-layer address' ? */
-			options := omit
-		}
-	}
-
-	/* derive ICMPv6 link-local address from lower 64bit of link_id */
-	/* template for receiving/matching an ICMPv6 'Prefix Information' option */
-	template (present) OptionField tr_ICMP6_OptPrefix(template (present) OCT16 prefix, template (present) INT1 prefix_len) := {
-		prefixInformation := {
-			typeField := 3,
-			lengthIndicator := 4,
-			prefixLength := prefix_len,
-			reserved1 := ?,
-			a_Bit := ?,
-			l_Bit := ?,
-			validLifetime := ?,
-			preferredLifetime := ?,
-			reserved2 := ?,
-			prefix := prefix
-		}
-	}
-
-	/* template for receiving/matching an ICMPv6 'MTU' option, rfc4861 4.6.4 */
-	template (present) OptionField tr_ICMP6_OptMTU(template (present) integer mtu := ?) := {
-		mTU := {
-			typeField := 5,
-			lengthIndicator := 1,
-			reserved := ?,
-			mTU_Value := mtu
-		}
-	}
-
-	/* template for receiving/matching an ICMPv6 router advertisement */
-	template (present) PDU_ICMPv6 tr_ICMPv6_RA(template (present) OCT16 prefix, template (present) INT1 prefix_len) := {
-		routerAdvertisement := {
-			typeField := 134,
-			code := 0,
-			checksum := ?,
-			curHopLimit := ?,
-			reserved := ?,
-			o_Bit := '0'B,
-			m_Bit := '0'B,
-			routerLifetime := ?,
-			reachableTime := ?,
-			retransTimer := ?,
-			options := ({ tr_ICMP6_OptPrefix(prefix, prefix_len) },
-				    { tr_ICMP6_OptPrefix(prefix, prefix_len), tr_ICMP6_OptMTU }
-				   )
-		}
-	}
-
-	/* template for receiving/matching an ICMPv6 Destination Unreachable  */
-	template (present) PDU_ICMPv6 tr_ICMPv6_DU := {
-		destinationUnreachable := {
-			typeField := 1,
-			code := ?,
-			checksum := ?,
-			unused := ?,
-			originalIpMsg  := ?
-		}
-	}
-
-	/* template for receiving/matching an ICMPv6 echo request */
-	template (present) PDU_ICMPv6 tr_ICMPv6_ERQ := {
-		echoRequest := {
-			typeField := 128,
-			code := 0,
-			checksum := ?,
-			identifier := ?,
-			sequenceNr := ?,
-			data := ?
-		}
-	}
-
-	/* template for receiving/matching an ICMPv6 echo reply */
-	template (present) PDU_ICMPv6 tr_ICMPv6_ERP(template octetstring data := *) := {
-		echoReply := {
-			typeField := 129,
-			code := 0,
-			checksum := ?,
-			identifier := ?,
-			sequenceNr := ?,
-			data := data
-		}
-	}
-
-	/* template to construct IPv6_packet from input arguments, ready for use in f_IPv6_enc() */
-	template (value) IPv6_packet ts_IP6(OCT16 srcaddr, OCT16 dstaddr, LIN1 nexthead, octetstring payload, LIN1 hlim := 255) := {
-		header := {
-			ver := 6,
-			trclass := 0,
-			flabel := 0,
-			plen := 0,
-			nexthead := nexthead,
-			hlim := hlim,
-			srcaddr := srcaddr,
-			dstaddr := dstaddr
-		},
-		ext_headers := omit,
-		payload := payload
-	}
-
-	function f_ipv6_link_local(in OCT16 link_id) return OCT16 {
-		 return 'FE80000000000000'O & substr(link_id, 8, 8);
-	}
-
-	function f_ipv6_global(in OCT16 link_id) return OCT16 {
-		 return substr(link_id, 0, 8) & '1234123412341234'O;
-	}
-
-	/* Create a new different IPv6 addr from input. Starts mangling at byte prefix. */
-	function f_ipv6_mangle(in OCT16 addr, in integer prefix := 0) return OCT16 {
-		var integer i;
-		var octetstring res := substr(addr, 0, prefix);
-		for (i := prefix; i < lengthof(addr); i := i + 1) {
-			var octetstring a := addr[i] xor4b '11'O;
-			res := res & a;
-		}
-		return res;
-	}
-
-	/* Compute solicited-node multicast address as per RFC4291 2.7.1 */
-	function f_ipv6_sol_node_mcast(in OCT16 addr) return OCT16 {
-		return 'FF0200000000000000000001FF'O & substr(addr, 13, 3);
-	}
-
-	/* generate and encode ICMPv6 router solicitation */
-	function f_gen_icmpv6_router_solicitation(in OCT16 link_id) return octetstring {
-		const OCT16 c_ip6_all_router_mcast := 'FF020000000000000000000000000002'O;
-		var OCT16 saddr := f_ipv6_link_local(link_id);
-
-		var octetstring tmp;
-		tmp := f_enc_PDU_ICMPv6(valueof(ts_ICMPv6_RS), saddr, c_ip6_all_router_mcast);
-		var IPv6_packet ip6 := valueof(ts_IP6(saddr, c_ip6_all_router_mcast, 58, tmp));
-
-		return f_IPv6_enc(ip6);
-	}
-
 	/* Get link-id from PDP Context EUA */
 	function f_ctx_get_ipv6_interface_id(in PdpContext ctx) return OCT16 {
 		var OCT16 interface_id;
@@ -1117,14 +840,6 @@
 		return f_gen_icmpv6_router_solicitation(interface_id);
 	}
 
-	/* generate and encode ICMPv6 neighbor solicitation */
-	function f_gen_icmpv6_neigh_solicit(in OCT16 saddr, in OCT16 daddr, in OCT16 tgt_addr) return octetstring {
-		var octetstring tmp;
-		tmp := f_enc_PDU_ICMPv6(valueof(ts_ICMPv6_NS(tgt_addr)), saddr, daddr);
-		var IPv6_packet ip6 := valueof(ts_IP6(saddr, daddr, 58, tmp));
-		return f_IPv6_enc(ip6);
-	}
-
 	/* generate and encode ICMPv6 neighbor solicitation for PDP Context */
 	function f_gen_icmpv6_neigh_solicit_for_pdp(in PdpContext ctx) return octetstring {
 		var OCT16 interface_id := f_ctx_get_ipv6_interface_id(ctx);
@@ -1134,25 +849,6 @@
 		return f_gen_icmpv6_neigh_solicit(link_local, daddr, link_local);
 	}
 
-	/* Send an ICMPv4 echo msg through GTP given pdp ctx, and ip src and dst addr */
-	function f_gen_icmpv4_echo(OCT4 saddr, OCT4 daddr, octetstring pl := ''O) return octetstring {
-		var octetstring tmp := f_enc_PDU_ICMP(valueof(ts_ICMPv4_ERQ(pl)));
-		var IPv4_packet ip4 := valueof(ts_IP4(saddr, daddr, 1, 50, tmp));
-		var octetstring data := f_IPv4_enc(ip4);
-		var OCT2 cksum := f_IPv4_checksum(data);
-		data[10] := cksum[0];
-		data[11] := cksum[1];
-		return data;
-	}
-
-	/* Send an ICMPv6 echo msg through GTP given pdp ctx, and ip src and dst addr */
-	function f_gen_icmpv6_echo(OCT16 saddr, OCT16 daddr) return octetstring {
-		var octetstring tmp := f_enc_PDU_ICMPv6(valueof(ts_ICMPv6_ERQ), saddr, daddr);
-		var IPv6_packet ip6 := valueof(ts_IP6(saddr, daddr, 58, tmp));
-		var octetstring data := f_IPv6_enc(ip6);
-		return data;
-	}
-
 	/* Wait for ICMPv4 from GTP */
 	function f_wait_icmp4(PdpContext ctx, template PDU_ICMP expected) runs on GT_CT {
 		var Gtp1uUnitdata ud;
@@ -1340,8 +1036,6 @@
 		f_pdp_ctx_act(ctx);
 
 		f_PCO_ensure_no_duplicates(ctx.pco_neg);
-		//f_send_gtpu(ctx, c_router_solicit);
-		//f_send_gtpu(ctx, c_neigh_solicit);
 
 		f_send_gtpu(ctx, f_icmpv6_rs_for_pdp(ctx));
 		f_wait_rtr_adv(ctx);
