diff --git a/sysinfo/Test.ttcn b/sysinfo/Test.ttcn
index b9bb62d..4b65b3e 100644
--- a/sysinfo/Test.ttcn
+++ b/sysinfo/Test.ttcn
@@ -6,6 +6,7 @@
 	import from GSMTAP_PortType all;
 	import from IPL4_GSMTAP_CtrlFunct all;
 	import from TELNETasp_PortType all;
+	import from Osmocom_VTY_Functions all;
 
 	const octetstring si1 := '5506198fb38000000000000000000000000000e504002b'O;
 	const octetstring si2 := '59061a00000000000000000000000000000000ffe50400'O;
@@ -648,105 +649,6 @@
 		f_vty_si_resend(BSCVTY, 0);
 	}
 
-	/* permitted prompts on VTY */
-	const charstring NORMAL_PROMPT := "OpenBSC> ";
-	const charstring ENABLE_PROMPT := "OpenBSC# ";
-	const charstring CONFIG_PROMPT := "OpenBSC(*)\#";
-	template charstring t_vty_unknown := pattern "*% Unknown command.";
-
-	const ASP_TelnetDynamicConfig vty_prompt[3] := {
-		{
-			prompt := {
-				id := 1,
-				prompt := NORMAL_PROMPT,
-				has_wildcards := false
-			}
-		}, {
-			prompt := {
-				id := 2,
-				prompt := ENABLE_PROMPT,
-				has_wildcards := false
-			}
-		}, {
-			prompt := {
-				id := 3,
-				prompt := CONFIG_PROMPT,
-				has_wildcards := true
-			}
-		}
-	};
-
-	/* configure prompts in TELNETasp module */
-	function f_vty_set_prompts(TELNETasp_PT pt) {
-		/* set some configuration that isn't possible to express
-		 * in the config file due to syntactic restrictions (Who invents config
-		 * files that don't permit regular expressions? */
-		for (var integer i := 0; i < sizeof(vty_prompt); i:= i + 1) {
-			pt.send(vty_prompt[i])
-		}
-	}
-
-	/* wait for any of the permitted prompts; buffer + return all intermediate output */
-	function f_vty_wait_for_prompt(TELNETasp_PT pt) return charstring {
-		template charstring config_pattern := pattern CONFIG_PROMPT;
-		var charstring rx, buf := "";
-		timer T := 2.0;
-
-		T.start;
-		alt {
-			[] pt.receive(NORMAL_PROMPT) { };
-			[] pt.receive(ENABLE_PROMPT) { };
-			[] pt.receive(config_pattern) { };
-			[] pt.receive(t_vty_unknown) { testcase.stop(fail, "VTY: Unknown Command") };
-			[] pt.receive(charstring:?) -> value rx { buf := buf & rx; repeat };
-			[] T.timeout { setverdict(fail, "VTY Timeout for prompt"); return ""};
-		}
-		T.stop;
-		return buf;
-	}
-
-	/* send a VTY command and obtain response until prompt is received */
-	function f_vty_transceive_ret(TELNETasp_PT pt, charstring tx) return charstring {
-		pt.send(tx);
-		return f_vty_wait_for_prompt(pt);
-	}
-
-	/* send a VTY command and obtain response until prompt is received */
-	function f_vty_transceive(TELNETasp_PT pt, charstring tx) {
-		f_vty_transceive_ret(pt, tx);
-	}
-
-	type integer BtsNr (0..255);
-	type integer BtsTrxNr (0..255);
-	type integer BtsTimeslotNr (0..7);
-
-	type charstring BtsGprsMode ("none", "gprs", "egrps");
-
-	/* enter the'confiugration' mode of the VTY */
-	function f_vty_enter_config(TELNETasp_PT pt) {
-		f_vty_transceive(pt, "configure terminal")
-	}
-
-	function f_vty_enter_cfg_network(TELNETasp_PT pt) {
-		f_vty_enter_config(pt);
-		f_vty_transceive(pt, "network")
-	}
-
-	function f_vty_enter_cfg_bts(TELNETasp_PT pt, BtsNr bts := 0) {
-		f_vty_enter_cfg_network(pt);
-		f_vty_transceive(pt, "bts " & int2str(bts));
-	}
-
-	function f_vty_enter_cfg_trx(TELNETasp_PT pt, BtsNr bts := 0, BtsTrxNr trx := 0) {
-		f_vty_enter_cfg_bts(pt, bts);
-		f_vty_transceive(pt, "trx " & int2str(trx));
-	}
-
-	function f_vty_enter_cfg_ts(TELNETasp_PT pt, BtsNr bts := 0, BtsTrxNr trx := 0, BtsTimeslotNr ts) {
-		f_vty_enter_cfg_trx(pt, bts, trx);
-		f_vty_transceive(pt, "timeslot " & int2str(ts));
-	}
-
 	function f_vty_si_static(TELNETasp_PT pt, BtsNr bts, charstring si, octetstring bytes) {
 		f_vty_enter_cfg_bts(pt, bts);
 		f_vty_transceive(pt, "system-information " & si & " mode static");
