diff --git a/hnodeb/HNBGW_ConnectionHandler.ttcn b/hnodeb/HNBGW_ConnectionHandler.ttcn
new file mode 100644
index 0000000..071e3e8
--- /dev/null
+++ b/hnodeb/HNBGW_ConnectionHandler.ttcn
@@ -0,0 +1,112 @@
+module HNBGW_ConnectionHandler {
+
+/* HNBGW Connection Handler of HNB_Tests in TTCN-3
+ * (C) 2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de>
+ * All rights reserved.
+ *
+ * Released under the terms of GNU General Public License, Version 2 or
+ * (at your option) any later version.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+import from Misc_Helpers all;
+import from General_Types all;
+import from Osmocom_Types all;
+import from IPL4asp_Types all;
+import from Native_Functions all;
+
+import from SDP_Types all;
+
+import from StatsD_Checker all;
+
+import from TELNETasp_PortType all;
+import from Osmocom_VTY_Functions all;
+
+import from HNBAP_Templates all;
+
+import from Iuh_Emulation all;
+
+/* this component represents a single Iuh connection at the HNBGW. */
+type component HNBGW_ConnHdlr extends StatsD_ConnHdlr {
+	port TELNETasp_PT HNBVTY;
+	port HNBAP_PT HNBAP;
+	port RUA_PT RUA;
+	var TestHdlrParams g_pars;
+
+	var boolean g_vty_initialized := false;
+}
+
+function f_HNBGW_ConnHdlr_init_vty() runs on HNBGW_ConnHdlr {
+	if (not g_vty_initialized) {
+		map(self:HNBVTY, system:HNBVTY);
+		f_vty_set_prompts(HNBVTY);
+		f_vty_transceive(HNBVTY, "enable");
+		g_vty_initialized := true;
+	}
+}
+
+/* initialize all parameters */
+function f_HNBGW_ConnHdlr_init(TestHdlrParams pars) runs on HNBGW_ConnHdlr {
+	var integer i := 0;
+	var Iuh_Emulation_CT vc_Iuh;
+
+	g_pars := valueof(pars);
+	vc_Iuh := Iuh_Emulation_CT.create("HNBGW" & int2str(i));
+	connect(self:HNBAP, vc_Iuh:HNBAP);
+	connect(self:RUA, vc_Iuh:RUA);
+
+	var Iuh_conn_parameters iuh_pars;
+	iuh_pars.remote_ip := g_pars.hnodeb_addr;
+	iuh_pars.remote_sctp_port := -1;
+	iuh_pars.local_ip := g_pars.hnbgw_addr;
+	iuh_pars.local_sctp_port  := g_pars.hnbgw_port;
+	vc_Iuh.start(Iuh_Emulation.main(iuh_pars, "Iuh" & int2str(i)));
+
+	f_HNBGW_ConnHdlr_init_vty();
+}
+
+type record TestHdlrParams {
+	charstring hnbgw_addr,
+	charstring hnodeb_addr,
+	integer hnbgw_port,
+	uint16_t rnc_id,
+	charstring hNB_Identity_Info,
+	OCT3 plmnid,
+	uint32_t cell_identity,
+	uint16_t lac,
+	uint8_t rac,
+	uint8_t sac
+};
+
+/* Note: Do not use valueof() to get a value of this template, use
+ * f_gen_test_hdlr_pars() instead in order to get a configuration. */
+template (value) TestHdlrParams t_def_TestHdlrPars := {
+	hnbgw_addr := "127.0.0.1",
+	hnodeb_addr := "127.0.0.1",
+	hnbgw_port := 29169,
+	rnc_id := 23,
+	hNB_Identity_Info := "OsmoHNodeB",
+	plmnid := '00F110'O,
+	cell_identity := 1,
+	lac := 2,
+	rac := 3,
+	sac := 4
+}
+
+
+function f_handle_hnbap_hnb_register_req()
+runs on HNBGW_ConnHdlr {
+	HNBAP.receive(tr_HNBAP_HNBRegisterRequest(char2oct(g_pars.hNB_Identity_Info),
+						  g_pars.plmnid,
+						  int2bit(g_pars.cell_identity, 28),
+						  int2oct(g_pars.lac, 2),
+						  int2oct(g_pars.rac, 1),
+						  int2oct(g_pars.sac, 2)
+						 ));
+	HNBAP.send(ts_HNBAP_HNBRegisterAccept(g_pars.rnc_id));
+}
+
+
+
+}
