diff --git a/library/Osmocom_VTY_Functions.ttcn b/library/Osmocom_VTY_Functions.ttcn
new file mode 100644
index 0000000..1215e0d
--- /dev/null
+++ b/library/Osmocom_VTY_Functions.ttcn
@@ -0,0 +1,103 @@
+module Osmocom_VTY_Functions {
+	import from TELNETasp_PortType all;
+
+	/* 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));
+	}
+
+}
