diff --git a/src/gb/gprs_ns2_vty.c b/src/gb/gprs_ns2_vty.c
index f803655..b6ae5b4 100644
--- a/src/gb/gprs_ns2_vty.c
+++ b/src/gb/gprs_ns2_vty.c
@@ -1,9 +1,7 @@
 /*! \file gprs_ns2_vty.c
  * VTY interface for our GPRS Networks Service (NS) implementation. */
 
-/* (C) 2009-2014 by Harald Welte <laforge@gnumonks.org>
- * (C) 2016-2017 by sysmocom - s.f.m.c. GmbH
- * (C) 2020 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
+/* (C) 2020 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
  * Author: Alexander Couzens <lynxis@fe80.eu>
  *
  * All Rights Reserved
@@ -33,67 +31,44 @@
 #include <arpa/inet.h>
 #include <net/if.h>
 
-#include <osmocom/core/msgb.h>
 #include <osmocom/core/byteswap.h>
 #include <osmocom/core/fsm.h>
-#include <osmocom/core/talloc.h>
-#include <osmocom/core/select.h>
-#include <osmocom/core/rate_ctr.h>
-#include <osmocom/core/socket.h>
-#include <osmocom/core/sockaddr_str.h>
 #include <osmocom/core/linuxlist.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/rate_ctr.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/core/sockaddr_str.h>
 #include <osmocom/core/socket.h>
 #include <osmocom/gprs/frame_relay.h>
 #include <osmocom/gprs/gprs_ns2.h>
 #include <osmocom/gsm/tlv.h>
-#include <osmocom/vty/vty.h>
 #include <osmocom/vty/command.h>
 #include <osmocom/vty/logging.h>
-#include <osmocom/vty/telnet_interface.h>
 #include <osmocom/vty/misc.h>
+#include <osmocom/vty/telnet_interface.h>
+#include <osmocom/vty/vty.h>
 
 #include "gprs_ns2_internal.h"
 
 #define SHOW_NS_STR "Display information about the NS protocol\n"
-
-struct ns2_vty_priv {
-	/* global listen */
-	struct osmo_sockaddr_str udp;
-	struct osmo_sockaddr_str frgreaddr;
-	int dscp;
-	enum gprs_ns2_vc_mode vc_mode;
-	bool frgre;
-
-	struct llist_head vtyvc;
-};
-
-struct ns2_vty_vc {
-	struct llist_head list;
-
-	struct osmo_sockaddr_str remote;
-	enum gprs_ns2_ll ll;
-
-	/* old vty code doesnt support multiple NSVCI per NSEI */
-	uint16_t nsei;
-	uint16_t nsvci;
-	uint16_t frdlci;
-
-	struct {
-		enum osmo_fr_role role;
-	} fr;
-
-	char netif[IF_NAMESIZE];
-
-	bool remote_end_is_sgsn;
-	bool configured;
-};
+#define NSVCI_STR "NS Virtual Connection ID (NS-VCI)\n"
+#define DLCI_STR "Data Link connection identifier\n"
 
 static struct gprs_ns2_inst *vty_nsi = NULL;
-static struct ns2_vty_priv priv;
 static struct osmo_fr_network *vty_fr_network = NULL;
+static struct llist_head binds;
 
-/* FIXME: this should go to some common file as it is copied
- * in vty_interface.c of the BSC */
+struct vty_bind {
+	struct llist_head list;
+	const char *name;
+	enum gprs_ns2_ll ll;
+	int dscp;
+	bool accept_ipaccess;
+	bool accept_sns;
+};
+
+/* TODO: this should into osmo timer */
 static const struct value_string gprs_ns_timer_strs[] = {
 	{ 0, "tns-block" },
 	{ 1, "tns-block-retries" },
@@ -108,28 +83,51 @@
 	{ 0, NULL }
 };
 
-static void log_set_nse_filter(struct log_target *target,
-				struct gprs_ns2_nse *nse)
+const struct value_string vty_fr_role_names[] = {
+	{ FR_ROLE_USER_EQUIPMENT,	"fr" },
+	{ FR_ROLE_NETWORK_EQUIPMENT,	"frnet" },
+	{ 0, NULL }
+};
+
+const struct value_string vty_ll_names[] = {
+	{ GPRS_NS2_LL_FR,	"fr" },
+	{ GPRS_NS2_LL_FR_GRE,	"frgre" },
+	{ GPRS_NS2_LL_UDP,	"udp" },
+	{ 0, NULL }
+};
+
+static struct vty_bind *vty_bind_by_name(const char *name)
 {
-	if (nse) {
-		target->filter_map |= (1 << LOG_FLT_GB_NSE);
-		target->filter_data[LOG_FLT_GB_NSE] = nse;
-	} else if (target->filter_data[LOG_FLT_GB_NSE]) {
-		target->filter_map = ~(1 << LOG_FLT_GB_NSE);
-		target->filter_data[LOG_FLT_GB_NSE] = NULL;
+	struct vty_bind *vbind;
+	llist_for_each_entry(vbind, &binds, list) {
+		if (!strncmp(vbind->name, name, strlen(vbind->name)))
+			return vbind;
 	}
+	return NULL;
 }
 
-static void log_set_nsvc_filter(struct log_target *target,
-				struct gprs_ns2_vc *nsvc)
+static struct vty_bind *vty_bind_alloc(const char *name)
 {
-	if (nsvc) {
-		target->filter_map |= (1 << LOG_FLT_GB_NSVC);
-		target->filter_data[LOG_FLT_GB_NSVC] = nsvc;
-	} else if (target->filter_data[LOG_FLT_GB_NSVC]) {
-		target->filter_map = ~(1 << LOG_FLT_GB_NSVC);
-		target->filter_data[LOG_FLT_GB_NSVC] = NULL;
+	struct vty_bind *vbind = talloc_zero(vty_nsi, struct vty_bind);
+	if (!vbind)
+		return NULL;
+
+	vbind->name = talloc_strdup(vty_nsi, name);
+	if (!vbind->name) {
+		talloc_free(vbind);
+		return NULL;
 	}
+
+	llist_add(&vbind->list, &binds);
+	return vbind;
+}
+
+static void vty_bind_free(struct vty_bind *vbind)
+{
+	if (!vbind)
+		return;
+
+	llist_del(&vbind->list);
 }
 
 static struct cmd_node ns_node = {
@@ -138,130 +136,6 @@
 	1,
 };
 
-static struct ns2_vty_vc *vtyvc_alloc(uint16_t nsei) {
-	struct ns2_vty_vc *vtyvc = talloc_zero(vty_nsi, struct ns2_vty_vc);
-	if (!vtyvc)
-		return vtyvc;
-
-	vtyvc->nsei = nsei;
-
-	llist_add(&vtyvc->list, &priv.vtyvc);
-
-	return vtyvc;
-}
-
-static void ns2_vc_free(struct ns2_vty_vc *vtyvc) {
-	if (!vtyvc)
-		return;
-
-	llist_del(&vtyvc->list);
-	talloc_free(vtyvc);
-}
-
-static struct ns2_vty_vc *vtyvc_by_nsei(uint16_t nsei, bool alloc_missing) {
-	struct ns2_vty_vc *vtyvc;
-
-	llist_for_each_entry(vtyvc, &priv.vtyvc, list) {
-		if (vtyvc->nsei == nsei)
-			return vtyvc;
-	}
-
-	if (!alloc_missing)
-		return NULL;
-
-	vtyvc = vtyvc_alloc(nsei);
-	if (!vtyvc)
-		return vtyvc;
-
-	vtyvc->nsei = nsei;
-	return vtyvc;
-}
-
-static int config_write_ns(struct vty *vty)
-{
-	struct ns2_vty_vc *vtyvc;
-	unsigned int i;
-	struct osmo_sockaddr_str sockstr;
-
-	vty_out(vty, "ns%s", VTY_NEWLINE);
-
-	/* global configuration must be written first, as some of it may be
-	 * relevant when creating the NSE/NSVC later below */
-
-	vty_out(vty, " encapsulation framerelay-gre enabled %u%s",
-		priv.frgre ? 1 : 0, VTY_NEWLINE);
-
-	if (priv.frgre) {
-		if (strlen(priv.frgreaddr.ip)) {
-			vty_out(vty, " encapsulation framerelay-gre local-ip %s%s",
-				sockstr.ip, VTY_NEWLINE);
-		}
-	} else {
-		if (strlen(priv.udp.ip)) {
-			vty_out(vty, " encapsulation udp local-ip %s%s",
-				priv.udp.ip, VTY_NEWLINE);
-		}
-
-		if (priv.udp.port)
-			vty_out(vty, " encapsulation udp local-port %u%s",
-				priv.udp.port, VTY_NEWLINE);
-	}
-
-	if (priv.dscp)
-		vty_out(vty, " encapsulation udp dscp %d%s",
-			priv.dscp, VTY_NEWLINE);
-
-	vty_out(vty, " encapsulation udp use-reset-block-unblock %s%s",
-		priv.vc_mode == GPRS_NS2_VC_MODE_BLOCKRESET ? "enabled" : "disabled", VTY_NEWLINE);
-
-	llist_for_each_entry(vtyvc, &priv.vtyvc, list) {
-		vty_out(vty, " nse %u nsvci %u%s",
-			vtyvc->nsei, vtyvc->nsvci, VTY_NEWLINE);
-
-		vty_out(vty, " nse %u remote-role %s%s",
-			vtyvc->nsei, vtyvc->remote_end_is_sgsn ? "sgsn" : "bss",
-			VTY_NEWLINE);
-
-		switch (vtyvc->ll) {
-		case GPRS_NS2_LL_UDP:
-			vty_out(vty, " nse %u encapsulation udp%s", vtyvc->nsei, VTY_NEWLINE);
-			vty_out(vty, " nse %u remote-ip %s%s",
-				vtyvc->nsei,
-				vtyvc->remote.ip,
-				VTY_NEWLINE);
-			vty_out(vty, " nse %u remote-port %u%s",
-				vtyvc->nsei, vtyvc->remote.port,
-				VTY_NEWLINE);
-			break;
-		case GPRS_NS2_LL_FR_GRE:
-			vty_out(vty, " nse %u encapsulation framerelay-gre%s",
-				vtyvc->nsei, VTY_NEWLINE);
-			vty_out(vty, " nse %u remote-ip %s%s",
-				vtyvc->nsei,
-				vtyvc->remote.ip,
-				VTY_NEWLINE);
-			vty_out(vty, " nse %u fr-dlci %u%s",
-				vtyvc->nsei, vtyvc->frdlci,
-				VTY_NEWLINE);
-			break;
-		case GPRS_NS2_LL_FR:
-			vty_out(vty, " nse %u fr %s dlci %u%s",
-				vtyvc->nsei, vtyvc->netif, vtyvc->frdlci,
-				VTY_NEWLINE);
-			break;
-		default:
-			break;
-		}
-	}
-
-	for (i = 0; i < ARRAY_SIZE(vty_nsi->timeout); i++)
-		vty_out(vty, " timer %s %u%s",
-			get_value_string(gprs_ns_timer_strs, i),
-			vty_nsi->timeout[i], VTY_NEWLINE);
-
-	return CMD_SUCCESS;
-}
-
 DEFUN(cfg_ns, cfg_ns_cmd,
       "ns",
       "Configure the GPRS Network Service")
@@ -270,6 +144,1183 @@
 	return CMD_SUCCESS;
 }
 
+DEFUN(cfg_ns_timer, cfg_ns_timer_cmd,
+	"timer " NS_TIMERS " <0-65535>",
+	"Network Service Timer\n"
+	NS_TIMERS_HELP "Timer Value\n")
+{
+	int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
+	int val = atoi(argv[1]);
+
+	if (idx < 0 || idx >= ARRAY_SIZE(vty_nsi->timeout))
+		return CMD_WARNING;
+
+	vty_nsi->timeout[idx] = val;
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ns_nsei, cfg_ns_nsei_cmd,
+      "nse <0-65535>",
+      "Persistent NS Entity\n"
+      "NS Entity ID (NSEI)\n"
+      )
+{
+	struct gprs_ns2_nse *nse;
+	uint16_t nsei = atoi(argv[0]);
+
+	nse = gprs_ns2_nse_by_nsei(vty_nsi, nsei);
+	if (!nse) {
+		nse = gprs_ns2_create_nse(vty_nsi, nsei, GPRS_NS2_LL_UNDEF, GPRS_NS2_DIALECT_UNDEF);
+		if (!nse) {
+			vty_out(vty, "Failed to create NSE!%s", VTY_NEWLINE);
+			return CMD_ERR_INCOMPLETE;
+		}
+		nse->persistent = true;
+	}
+
+	if (!nse->persistent) {
+		/* TODO: should the dynamic NSE removed? */
+		vty_out(vty, "A dynamic NSE with the specified NSEI already exists%s", VTY_NEWLINE);
+		return CMD_ERR_INCOMPLETE;
+	}
+
+	vty->node = L_NS_NSE_NODE;
+	vty->index = nse;
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_no_ns_nsei, cfg_no_ns_nsei_cmd,
+      "no nse <0-65535>",
+      NO_STR
+      "Delete a Persistent NS Entity\n"
+      "NS Entity ID (NSEI)\n"
+      )
+{
+	struct gprs_ns2_nse *nse;
+	uint16_t nsei = atoi(argv[0]);
+
+	nse = gprs_ns2_nse_by_nsei(vty_nsi, nsei);
+	if (!nse) {
+		vty_out(vty, "Can not find NS Entity %s%s", argv[0], VTY_NEWLINE);
+		return CMD_ERR_NOTHING_TODO;
+	}
+
+	if (!nse->persistent) {
+		vty_out(vty, "Ignoring non-persistent NS Entity%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	vty_out(vty, "Deleting NS Entity %u%s", nse->nsei, VTY_NEWLINE);
+	gprs_ns2_free_nse(nse);
+	return CMD_SUCCESS;
+}
+
+/* TODO: add fr/gre */
+DEFUN(cfg_ns_bind, cfg_ns_bind_cmd,
+      "bind (fr|udp) ID",
+      "Binding\n"
+      "Frame Relay\n" "UDP/IP\n"
+      "a unique identifier for this bind to reference NS-VCs\n"
+      )
+{
+	const char *nstype = argv[0];
+	const char *name = argv[1];
+	struct vty_bind *vbind;
+	enum gprs_ns2_ll ll;
+	int rc;
+
+	rc = get_string_value(vty_ll_names, nstype);
+	if (rc < 0)
+		return CMD_WARNING;
+	ll = (enum gprs_ns2_ll) rc;
+
+	if (!osmo_identifier_valid(name)) {
+		vty_out(vty, "Invalid ID. The ID should be only alphanumeric.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	vbind = vty_bind_by_name(name);
+	if (vbind) {
+		if (vbind->ll != ll) {
+			vty_out(vty, "A bind with the specified ID already exists with a different type (fr|frgre|udp)!%s",
+				VTY_NEWLINE);
+			return CMD_WARNING;
+		}
+	} else {
+		vbind = vty_bind_alloc(name);
+		if (!vbind) {
+			vty_out(vty, "Can not create bind - out of memory%s", VTY_NEWLINE);
+			return CMD_WARNING;
+		}
+		vbind->ll = ll;
+	}
+
+	vty->index = vbind;
+	vty->node = L_NS_BIND_NODE;
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_no_ns_bind, cfg_no_ns_bind_cmd,
+      "no bind ID",
+      NO_STR
+      "Delete a binding\n"
+      "a unique identifier for this bind to reference NS-VCs\n"
+      )
+{
+	struct vty_bind *vbind;
+	struct gprs_ns2_vc_bind *bind;
+	const char *name = argv[0];
+
+	vbind = vty_bind_by_name(name);
+	if (!vbind) {
+		vty_out(vty, "bind %s does not exist!%s", name, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+	vty_bind_free(vbind);
+	bind = gprs_ns2_bind_by_name(vty_nsi, name);
+	if (bind)
+		bind->driver->free_bind(bind);
+	return CMD_SUCCESS;
+}
+
+
+static void config_write_vbind(struct vty *vty, struct vty_bind *vbind)
+{
+	struct gprs_ns2_vc_bind *bind;
+	const struct osmo_sockaddr *addr;
+	struct osmo_sockaddr_str addr_str;
+	const char *netif, *frrole_str, *llstr;
+	enum osmo_fr_role frrole;
+
+	llstr = get_value_string_or_null(vty_ll_names, vbind->ll);
+	if (!llstr)
+		return;
+	vty_out(vty, " bind %s %s%s", llstr, vbind->name, VTY_NEWLINE);
+
+	bind = gprs_ns2_bind_by_name(vty_nsi, vbind->name);
+	switch (vbind->ll) {
+	case GPRS_NS2_LL_FR:
+		if (bind) {
+			netif = gprs_ns2_fr_bind_netif(bind);
+			if (!netif)
+				return;
+			frrole = gprs_ns2_fr_bind_role(bind);
+			if ((int) frrole == -1)
+				return;
+			frrole_str = get_value_string_or_null(vty_fr_role_names, frrole);
+			if (netif && frrole_str)
+				vty_out(vty, "  fr %s %s%s", netif, frrole_str, VTY_NEWLINE);
+		}
+		break;
+	case GPRS_NS2_LL_UDP:
+		if (bind) {
+			addr = gprs_ns2_ip_bind_sockaddr(bind);
+			if (!osmo_sockaddr_str_from_sockaddr(&addr_str, &addr->u.sas)) {
+				vty_out(vty, "  listen %s %u%s", addr_str.ip, addr_str.port,
+					VTY_NEWLINE);
+			}
+		}
+		if (vbind->accept_ipaccess)
+			vty_out(vty, "  accept-ipaccess%s", VTY_NEWLINE);
+		if (vbind->dscp)
+			vty_out(vty, "  dscp %u%s", vbind->dscp, VTY_NEWLINE);
+		break;
+	default:
+		return;
+	}
+}
+
+static void config_write_nsvc(struct vty *vty, const struct gprs_ns2_vc *nsvc)
+{
+	const char *netif;
+	uint16_t dlci;
+	const struct osmo_sockaddr *addr;
+	struct osmo_sockaddr_str addr_str;
+
+	switch (nsvc->nse->ll) {
+	case GPRS_NS2_LL_UNDEF:
+		break;
+	case GPRS_NS2_LL_UDP:
+		switch (nsvc->nse->dialect) {
+		case GPRS_NS2_DIALECT_IPACCESS:
+			addr = gprs_ns2_ip_vc_remote(nsvc);
+			if (!addr)
+				break;
+			if (osmo_sockaddr_str_from_sockaddr(&addr_str, &addr->u.sas))
+				break;
+			vty_out(vty, "  nsvc ipa %s %s %u nsvci %u%s",
+				nsvc->bind->name, addr_str.ip, addr_str.port,
+				nsvc->nsvci, VTY_NEWLINE);
+			break;
+		case GPRS_NS2_DIALECT_STATIC_ALIVE:
+			addr = gprs_ns2_ip_vc_remote(nsvc);
+			if (!addr)
+				break;
+			if (osmo_sockaddr_str_from_sockaddr(&addr_str, &addr->u.sas))
+				break;
+			vty_out(vty, "  nsvc udp %s %s %u%s",
+				nsvc->bind->name, addr_str.ip, addr_str.port, VTY_NEWLINE);
+			break;
+		default:
+			break;
+		}
+		break;
+	case GPRS_NS2_LL_FR:
+		netif = gprs_ns2_fr_bind_netif(nsvc->bind);
+		if (!netif)
+			break;
+		dlci = gprs_ns2_fr_nsvc_dlci(nsvc);
+		if (!dlci)
+			break;
+		OSMO_ASSERT(nsvc->nsvci_is_valid);
+		vty_out(vty, "  nsvc fr %s dlci %u nsvci %u%s",
+			netif, dlci, nsvc->nsvci, VTY_NEWLINE);
+		break;
+	case GPRS_NS2_LL_FR_GRE:
+		break;
+	}
+}
+
+static void _config_write_ns_nse(struct vty *vty, struct gprs_ns2_nse *nse)
+{
+	struct gprs_ns2_vc *nsvc;
+
+	vty_out(vty, " nse %u%s", nse->nsei, VTY_NEWLINE);
+	switch (nse->dialect) {
+	case GPRS_NS2_DIALECT_SNS:
+		ns2_sns_write_vty(vty, nse);
+		break;
+	default:
+		llist_for_each_entry(nsvc, &nse->nsvc, list) {
+			config_write_nsvc(vty, nsvc);
+		}
+		break;
+	}
+}
+
+static int config_write_ns(struct vty *vty)
+{
+	unsigned int i;
+
+	vty_out(vty, "ns%s", VTY_NEWLINE);
+
+	for (i = 0; i < ARRAY_SIZE(vty_nsi->timeout); i++)
+		vty_out(vty, " timer %s %u%s",
+			get_value_string(gprs_ns_timer_strs, i),
+			vty_nsi->timeout[i], VTY_NEWLINE);
+
+	return 0;
+}
+
+static int config_write_ns_nse(struct vty *vty)
+{
+	struct gprs_ns2_nse *nse;
+
+	llist_for_each_entry(nse, &vty_nsi->nse, list) {
+		if (!nse->persistent)
+			continue;
+
+		_config_write_ns_nse(vty, nse);
+	}
+
+	return 0;
+}
+
+static int config_write_ns_bind(struct vty *vty)
+{
+	struct vty_bind *vbind;
+
+	llist_for_each_entry(vbind, &binds, list) {
+		config_write_vbind(vty, vbind);
+	}
+
+	return 0;
+}
+
+static struct cmd_node ns_bind_node = {
+	L_NS_BIND_NODE,
+	"%s(config-ns-bind)# ",
+	1,
+};
+
+DEFUN(cfg_ns_bind_listen, cfg_ns_bind_listen_cmd,
+      "listen " VTY_IPV46_CMD " <1-65535>",
+      "Binding\n"
+      "IPv4 Address\n" "IPv6 Address\n"
+      "Port\n"
+      )
+{
+	struct vty_bind *vbind = vty->index;
+	struct gprs_ns2_vc_bind *bind;
+
+	const char *addr_str = argv[0];
+	unsigned int port = atoi(argv[1]);
+	struct osmo_sockaddr_str sockaddr_str;
+	struct osmo_sockaddr sockaddr;
+
+	if (vbind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "listen can be only used with UDP bind%s",
+			VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (osmo_sockaddr_str_from_str(&sockaddr_str, addr_str, port)) {
+		vty_out(vty, "Can not parse the Address %s %s%s", argv[0], argv[1], VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+	osmo_sockaddr_str_to_sockaddr(&sockaddr_str, &sockaddr.u.sas);
+	if (gprs_ns2_ip_bind_by_sockaddr(vty_nsi, &sockaddr)) {
+		vty_out(vty, "A bind with the specified address already exists!%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (gprs_ns2_ip_bind(vty_nsi, vbind->name, &sockaddr, vbind->dscp, &bind) != 0) {
+		vty_out(vty, "Failed to create the bind!%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	bind->accept_ipaccess = vbind->accept_ipaccess;
+	bind->accept_sns = vbind->accept_sns;
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_no_ns_bind_listen, cfg_no_ns_bind_listen_cmd,
+      "no listen",
+      NO_STR
+      "Delete a IP/Port assignment\n"
+      )
+{
+	struct vty_bind *vbind = vty->index;
+	struct gprs_ns2_vc_bind *bind;
+
+	if (vbind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "no listen can be only used with UDP bind%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	bind = gprs_ns2_bind_by_name(vty_nsi, vbind->name);
+	if (!bind)
+		return CMD_ERR_NOTHING_TODO;
+
+	OSMO_ASSERT(bind->ll != GPRS_NS2_LL_UDP);
+	bind->driver->free_bind(bind);
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ns_bind_dscp, cfg_ns_bind_dscp_cmd,
+      "dscp <0-255>",
+      "Set DSCP/TOS on the UDP socket\n" "DSCP Value\n")
+{
+	struct vty_bind *vbind = vty->index;
+	struct gprs_ns2_vc_bind *bind;
+	uint16_t dscp = atoi(argv[0]);
+
+	if (vbind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "dscp can be only used with UDP bind%s",
+			VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	vbind->dscp = dscp;
+	bind = gprs_ns2_bind_by_name(vty_nsi, vbind->name);
+	if (bind)
+		gprs_ns2_ip_bind_set_dscp(bind, dscp);
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_no_ns_bind_dscp, cfg_no_ns_bind_dscp_cmd,
+      "no dscp",
+      "Set DSCP/TOS on the UDP socket\n" "DSCP Value\n")
+{
+	struct vty_bind *vbind = vty->index;
+	struct gprs_ns2_vc_bind *bind;
+	uint16_t dscp = 0;
+
+	if (vbind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "dscp can be only used with UDP bind%s",
+			VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	vbind->dscp = dscp;
+	bind = gprs_ns2_bind_by_name(vty_nsi, vbind->name);
+	if (bind)
+		gprs_ns2_ip_bind_set_dscp(bind, dscp);
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ns_bind_ipaccess, cfg_ns_bind_ipaccess_cmd,
+      "accept-ipaccess",
+      "Allow to create dynamic NS Entity by NS Reset PDU on UDP (ip.access style)\n"
+      )
+{
+	struct vty_bind *vbind = vty->index;
+	struct gprs_ns2_vc_bind *bind;
+
+	if (vbind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "accept-ipaccess can be only used with UDP bind%s",
+			VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	vbind->accept_ipaccess = true;
+	bind = gprs_ns2_bind_by_name(vty_nsi, vbind->name);
+	if (bind)
+		bind->accept_ipaccess = true;
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_no_ns_bind_ipaccess, cfg_no_ns_bind_ipaccess_cmd,
+      "no accept-ipaccess",
+      NO_STR
+      "Reject NS Reset PDU on UDP (ip.access style)\n"
+      )
+{
+	struct vty_bind *vbind = vty->index;
+	struct gprs_ns2_vc_bind *bind;
+
+	if (vbind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "no accept-ipaccess can be only used with UDP bind%s",
+			VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	vbind->accept_ipaccess = false;
+	bind = gprs_ns2_bind_by_name(vty_nsi, vbind->name);
+	if (bind)
+		bind->accept_ipaccess = false;
+
+	return CMD_SUCCESS;
+}
+
+
+DEFUN(cfg_ns_bind_fr, cfg_ns_bind_fr_cmd,
+      "fr NETIF (fr|frnet)",
+      "frame relay\n"
+      IFNAME_STR
+      "fr (user) is used by BSS or SGSN attached to UNI of a FR network\n"
+      "frnet (network) is used by SGSN if BSS is directly attached\n"
+      )
+{
+	struct vty_bind *vbind = vty->index;
+	struct gprs_ns2_vc_bind *bind;
+	const char *netif = argv[0];
+	const char *role = argv[1];
+
+	int rc = 0;
+	enum osmo_fr_role frrole;
+
+	if (vbind->ll != GPRS_NS2_LL_FR) {
+		vty_out(vty, "fr can be only used with frame relay bind%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (!strcmp(role, "fr"))
+		frrole = FR_ROLE_USER_EQUIPMENT;
+	else if (!strcmp(role, "frnet"))
+		frrole = FR_ROLE_NETWORK_EQUIPMENT;
+	else
+		return CMD_WARNING;
+
+	bind = gprs_ns2_fr_bind_by_netif(vty_nsi, netif);
+	if (bind) {
+		vty_out(vty, "Interface %s already used.%s", netif, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	rc = gprs_ns2_fr_bind(vty_nsi, vbind->name, netif, vty_fr_network, frrole, &bind);
+	if (rc < 0) {
+		LOGP(DLNS, LOGL_ERROR, "Failed to bind interface %s on fr. Err: %d\n", netif, rc);
+		return CMD_WARNING;
+	}
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_no_ns_bind_fr, cfg_no_ns_bind_fr_cmd,
+      "no fr NETIF",
+      NO_STR
+      "Delete a frame relay link\n"
+      "Delete a frame relay link\n"
+      IFNAME_STR
+      )
+{
+	struct vty_bind *vbind = vty->index;
+	struct gprs_ns2_vc_bind *bind;
+	const char *netif = argv[0];
+
+	if (vbind->ll != GPRS_NS2_LL_FR) {
+		vty_out(vty, "fr can be only used with frame relay bind%s",
+			VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	bind = gprs_ns2_fr_bind_by_netif(vty_nsi, netif);
+	if (!bind) {
+		vty_out(vty, "Interface not found.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (strcmp(bind->name, vbind->name)) {
+		vty_out(vty, "The specified interface is not bound to this bind.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	bind->driver->free_bind(bind);
+	return CMD_SUCCESS;
+}
+
+
+static struct cmd_node ns_nse_node = {
+	L_NS_NSE_NODE,
+	"%s(config-ns-nse)# ",
+	1,
+};
+
+DEFUN(cfg_ns_nse_nsvc_fr, cfg_ns_nse_nsvc_fr_cmd,
+      "nsvc fr NETIF dlci <16-1007> nsvci <0-65535>",
+      "NS Virtual Connection\n"
+      "frame relay\n"
+      "frame relay interface. Must be registered via fr vty\n"
+      NSVCI_STR
+      NSVCI_STR
+      DLCI_STR
+      DLCI_STR
+      )
+{
+	struct gprs_ns2_vc_bind *bind;
+	struct gprs_ns2_vc *nsvc;
+	struct gprs_ns2_nse *nse = vty->index;
+	const char *netif = argv[0];
+	uint16_t dlci = atoi(argv[1]);
+	uint16_t nsvci = atoi(argv[2]);
+	bool dialect_modified = false;
+	bool ll_modified = false;
+
+	if (nse->ll != GPRS_NS2_LL_FR && nse->ll != GPRS_NS2_LL_UNDEF) {
+		vty_out(vty, "Can not mix NS-VC with different link layer%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (nse->dialect != GPRS_NS2_DIALECT_STATIC_RESETBLOCK && nse->dialect != GPRS_NS2_DIALECT_UNDEF) {
+		vty_out(vty, "Can not mix NS-VC with different dialects%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (nse->ll == GPRS_NS2_LL_UNDEF) {
+		nse->ll = GPRS_NS2_LL_FR;
+		ll_modified = true;
+	}
+
+	if (nse->dialect == GPRS_NS2_DIALECT_UNDEF) {
+		nse->dialect = GPRS_NS2_DIALECT_STATIC_RESETBLOCK;
+		dialect_modified = true;
+	}
+
+
+	bind = gprs_ns2_fr_bind_by_netif(vty_nsi, netif);
+	if (!bind) {
+		vty_out(vty, "Can not find fr interface \"%s\". Please configure it via fr vty.%s",
+			netif, VTY_NEWLINE);
+		goto err;
+	}
+
+	if (gprs_ns2_fr_nsvc_by_dlci(bind, dlci)) {
+		vty_out(vty, "A NS-VC with the specified DLCI already exist!%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (gprs_ns2_nsvc_by_nsvci(vty_nsi, nsvci)) {
+		vty_out(vty, "A NS-VC with the specified NS-VCI already exist!%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	nsvc = gprs_ns2_fr_connect(bind, nse, nsvci, dlci);
+	if (!nsvc) {
+		/* Could not create NS-VC, connect failed */
+		vty_out(vty, "Failed to create the NS-VC%s", VTY_NEWLINE);
+		goto err;
+	}
+	nsvc->persistent = true;
+	return CMD_SUCCESS;
+
+err:
+	if (ll_modified)
+		nse->ll = GPRS_NS2_LL_UNDEF;
+	if (dialect_modified)
+		nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+
+	return CMD_WARNING;
+}
+
+DEFUN(cfg_no_ns_nse_nsvc_fr_dlci, cfg_no_ns_nse_nsvc_fr_dlci_cmd,
+      "no nsvc fr NETIF dlci <16-1007>",
+      NO_STR
+      "Delete frame relay NS-VC\n"
+      "frame relay\n"
+      "frame relay interface. Must be registered via fr vty\n"
+      DLCI_STR
+      DLCI_STR
+      )
+{
+	struct gprs_ns2_vc_bind *bind;
+	struct gprs_ns2_vc *nsvc;
+	struct gprs_ns2_nse *nse = vty->index;
+	const char *netif = argv[0];
+	uint16_t dlci = atoi(argv[1]);
+
+	if (nse->ll != GPRS_NS2_LL_FR) {
+		vty_out(vty, "This NSE doesn't support frame relay.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	bind = gprs_ns2_fr_bind_by_netif(vty_nsi, netif);
+	if (!bind) {
+		vty_out(vty, "Can not find fr interface \"%s\"%s",
+			netif, VTY_NEWLINE);
+		return CMD_ERR_NOTHING_TODO;
+	}
+
+	nsvc = gprs_ns2_fr_nsvc_by_dlci(bind, dlci);
+	if (!nsvc) {
+		vty_out(vty, "Can not find a NS-VC on fr interface %s with dlci %u%s",
+			netif, dlci, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (nse != nsvc->nse) {
+		vty_out(vty, "The specified NS-VC is not a part of the NSE %u!%s"
+			     "To remove this NS-VC go to the vty node 'nse %u'%s",
+			nse->nsei, VTY_NEWLINE,
+			nsvc->nse->nsei, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	gprs_ns2_free_nsvc(nsvc);
+	if (llist_empty(&nse->nsvc)) {
+		nse->ll = GPRS_NS2_LL_UNDEF;
+		nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+	}
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_no_ns_nse_nsvci, cfg_no_ns_nse_nsvci_cmd,
+      "no nsvc nsvci <0-65535>",
+      NO_STR
+      "Delete NSVC\n"
+      NSVCI_STR
+      NSVCI_STR
+      )
+{
+	struct gprs_ns2_vc *nsvc;
+	struct gprs_ns2_nse *nse = vty->index;
+	uint16_t nsvci = atoi(argv[0]);
+
+	switch (nse->dialect) {
+	case GPRS_NS2_DIALECT_SNS:
+	case GPRS_NS2_DIALECT_STATIC_ALIVE:
+		vty_out(vty, "NSE doesn't support NSVCI.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	case GPRS_NS2_DIALECT_UNDEF:
+		vty_out(vty, "No NSVCs configured%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	case GPRS_NS2_DIALECT_IPACCESS:
+	case GPRS_NS2_DIALECT_STATIC_RESETBLOCK:
+		break;
+	}
+
+	nsvc = gprs_ns2_nsvc_by_nsvci(vty_nsi, nsvci);
+	if (!nsvc) {
+		vty_out(vty, "Can not find NS-VC with NS-VCI %u%s", nsvci, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (nse != nsvc->nse) {
+		vty_out(vty, "NS-VC with NS-VCI %u is not part of this NSE!%s",
+			nsvci, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	gprs_ns2_free_nsvc(nsvc);
+	if (llist_empty(&nse->nsvc)) {
+		nse->ll = GPRS_NS2_LL_UNDEF;
+		nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+	}
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ns_nse_nsvc_udp, cfg_ns_nse_nsvc_udp_cmd,
+      "nsvc udp BIND " VTY_IPV46_CMD " <1-65535>",
+      "NS Virtual Connection\n"
+      "NS over UDP\n"
+      "A unique bind identifier created by ns bind\n"
+      "Remote IPv4 Address\n" "Remote IPv6 Address\n"
+      "Remote UDP Port\n"
+      )
+{
+	struct gprs_ns2_vc_bind *bind;
+	struct gprs_ns2_vc *nsvc;
+	struct gprs_ns2_nse *nse = vty->index;
+	bool dialect_modified = false;
+	bool ll_modified = false;
+
+	const char *bind_name = argv[0];
+	struct osmo_sockaddr_str remote_str;
+	struct osmo_sockaddr remote;
+	uint16_t port = atoi(argv[2]);
+
+	if (nse->ll == GPRS_NS2_LL_UNDEF) {
+		nse->ll = GPRS_NS2_LL_UDP;
+		ll_modified = true;
+	}
+
+	if (nse->dialect == GPRS_NS2_DIALECT_UNDEF) {
+		nse->dialect = GPRS_NS2_DIALECT_STATIC_ALIVE;
+		dialect_modified = true;
+	}
+
+	if (nse->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "Can not mix NS-VC with different link layer%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (nse->dialect != GPRS_NS2_DIALECT_STATIC_ALIVE) {
+		vty_out(vty, "Can not mix NS-VC with different dialects%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (osmo_sockaddr_str_from_str(&remote_str, argv[1], port)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (osmo_sockaddr_str_to_sockaddr(&remote_str, &remote.u.sas)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	bind = gprs_ns2_bind_by_name(vty_nsi, bind_name);
+	if (!bind) {
+		vty_out(vty, "Can not find bind with name %s%s",
+			bind_name, VTY_NEWLINE);
+		goto err;
+	}
+
+	if (bind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "Bind %s is not an UDP bind.%s",
+			bind_name, VTY_NEWLINE);
+		goto err;
+	}
+
+	nsvc = gprs_ns2_ip_connect(bind, &remote, nse, 0);
+	if (!nsvc) {
+		vty_out(vty, "Can not create NS-VC.%s", VTY_NEWLINE);
+		goto err;
+	}
+	nsvc->persistent = true;
+
+	return CMD_SUCCESS;
+
+err:
+	if (ll_modified)
+		nse->ll = GPRS_NS2_LL_UNDEF;
+	if (dialect_modified)
+		nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+	return CMD_WARNING;
+}
+
+DEFUN(cfg_no_ns_nse_nsvc_udp, cfg_no_ns_nse_nsvc_udp_cmd,
+      "no nsvc udp BIND " VTY_IPV46_CMD " <1-65535>",
+      NO_STR
+      "Delete a NS Virtual Connection\n"
+      "NS over UDP\n"
+      "A unique bind identifier created by ns bind\n"
+      "Remote IPv4 Address\n" "Remote IPv6 Address\n"
+      "Remote UDP Port\n"
+      )
+{
+	struct gprs_ns2_vc_bind *bind;
+	struct gprs_ns2_vc *nsvc;
+	struct gprs_ns2_nse *nse = vty->index;
+	const char *bind_name = argv[0];
+	struct osmo_sockaddr_str remote_str;
+	struct osmo_sockaddr remote;
+	uint16_t port = atoi(argv[2]);
+
+	if (nse->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "This NSE doesn't support UDP.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (nse->dialect != GPRS_NS2_DIALECT_STATIC_ALIVE) {
+		vty_out(vty, "This NSE doesn't support UDP with dialect static alive.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	bind = gprs_ns2_bind_by_name(vty_nsi, bind_name);
+	if (!bind) {
+		vty_out(vty, "Can not find bind with name %s%s",
+			bind_name, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (bind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "Bind %s is not an UDP bind.%s",
+			bind_name, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (osmo_sockaddr_str_from_str(&remote_str, argv[1], port)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (osmo_sockaddr_str_to_sockaddr(&remote_str, &remote.u.sas)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	nsvc = gprs_ns2_nsvc_by_sockaddr_bind(bind, &remote);
+	if (!nsvc) {
+		vty_out(vty, "Can not find NS-VC with remote %s:%u%s",
+			remote_str.ip, remote_str.port, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (!nsvc->persistent) {
+		vty_out(vty, "NS-VC with remote %s:%u is a dynamic NS-VC. Not configured by vty.%s",
+			remote_str.ip, remote_str.port, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (nsvc->nse != nse) {
+		vty_out(vty, "NS-VC is not part of this NSE!%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	gprs_ns2_free_nsvc(nsvc);
+	if (llist_empty(&nse->nsvc)) {
+		nse->ll = GPRS_NS2_LL_UNDEF;
+		nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+	}
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ns_nse_nsvc_ipa, cfg_ns_nse_nsvc_ipa_cmd,
+      "nsvc ipa BIND " VTY_IPV46_CMD " <1-65535> nsvci <0-65535>" ,
+      "NS Virtual Connection\n"
+      "NS over UDP ip.access style (uses RESET/BLOCK)\n"
+      "A unique bind identifier created by ns bind\n"
+      "Remote IPv4 Address\n" "Remote IPv6 Address\n"
+      "Remote UDP Port\n"
+      NSVCI_STR
+      NSVCI_STR
+      )
+{
+	struct gprs_ns2_vc_bind *bind;
+	struct gprs_ns2_vc *nsvc;
+	struct gprs_ns2_nse *nse = vty->index;
+	bool dialect_modified = false;
+	bool ll_modified = false;
+
+	const char *bind_name = argv[0];
+	struct osmo_sockaddr_str remote_str;
+	struct osmo_sockaddr remote;
+	uint16_t port = atoi(argv[2]);
+	uint16_t nsvci = atoi(argv[3]);
+
+	if (nse->ll == GPRS_NS2_LL_UNDEF) {
+		nse->ll = GPRS_NS2_LL_UDP;
+		ll_modified = true;
+	}
+
+	if (nse->dialect == GPRS_NS2_DIALECT_UNDEF) {
+		nse->dialect = GPRS_NS2_DIALECT_IPACCESS;
+		dialect_modified = true;
+	}
+
+	if (nse->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "Can not mix NS-VC with different link layer%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (nse->dialect != GPRS_NS2_DIALECT_IPACCESS) {
+		vty_out(vty, "Can not mix NS-VC with different dialects%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (osmo_sockaddr_str_from_str(&remote_str, argv[1], port)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (osmo_sockaddr_str_to_sockaddr(&remote_str, &remote.u.sas)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	bind = gprs_ns2_bind_by_name(vty_nsi, bind_name);
+	if (!bind) {
+		vty_out(vty, "Can not find bind with name %s%s",
+			bind_name, VTY_NEWLINE);
+		goto err;
+	}
+
+	if (bind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "Bind %s is not an UDP bind.%s",
+			bind_name, VTY_NEWLINE);
+		goto err;
+	}
+
+	nsvc = gprs_ns2_ip_connect(bind, &remote, nse, nsvci);
+	if (!nsvc) {
+		vty_out(vty, "Can not create NS-VC.%s", VTY_NEWLINE);
+		goto err;
+	}
+	nsvc->persistent = true;
+
+	return CMD_SUCCESS;
+
+err:
+	if (ll_modified)
+		nse->ll = GPRS_NS2_LL_UNDEF;
+	if (dialect_modified)
+		nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+	return CMD_WARNING;
+}
+
+DEFUN(cfg_no_ns_nse_nsvc_ipa, cfg_no_ns_nse_nsvc_ipa_cmd,
+      "no nsvc ipa BIND " VTY_IPV46_CMD " <1-65535> nsvci <0-65535>",
+      NO_STR
+      "Delete a NS Virtual Connection\n"
+      "NS over UDP\n"
+      "A unique bind identifier created by ns bind\n"
+      "Remote IPv4 Address\n" "Remote IPv6 Address\n"
+      "Remote UDP Port\n"
+      NSVCI_STR
+      NSVCI_STR
+      )
+{
+	struct gprs_ns2_vc_bind *bind;
+	struct gprs_ns2_vc *nsvc;
+	struct gprs_ns2_nse *nse = vty->index;
+	const char *bind_name = argv[0];
+	struct osmo_sockaddr_str remote_str;
+	struct osmo_sockaddr remote;
+	uint16_t port = atoi(argv[2]);
+	uint16_t nsvci = atoi(argv[3]);
+
+	if (nse->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "This NSE doesn't support UDP.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (nse->dialect != GPRS_NS2_DIALECT_IPACCESS) {
+		vty_out(vty, "This NSE doesn't support UDP with dialect ipaccess.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	bind = gprs_ns2_bind_by_name(vty_nsi, bind_name);
+	if (!bind) {
+		vty_out(vty, "Can not find bind with name %s%s",
+			bind_name, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (bind->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "Bind %s is not an UDP bind.%s",
+			bind_name, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (osmo_sockaddr_str_from_str(&remote_str, argv[1], port)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (osmo_sockaddr_str_to_sockaddr(&remote_str, &remote.u.sas)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	nsvc = gprs_ns2_nsvc_by_sockaddr_bind(bind, &remote);
+	if (!nsvc) {
+		vty_out(vty, "Can not find NS-VC with remote %s:%u%s",
+			remote_str.ip, remote_str.port, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (!nsvc->persistent) {
+		vty_out(vty, "NS-VC with remote %s:%u is a dynamic NS-VC. Not configured by vty.%s",
+			remote_str.ip, remote_str.port, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (nsvc->nse != nse) {
+		vty_out(vty, "NS-VC is not part of this NSE!%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (!nsvc->nsvci_is_valid) {
+		vty_out(vty, "NS-VC doesn't have a nsvci!%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (nsvc->nsvci != nsvci) {
+		vty_out(vty, "NS-VC has a different nsvci (%u)!%s",
+			nsvc->nsvci, VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	gprs_ns2_free_nsvc(nsvc);
+	if (llist_empty(&nse->nsvc)) {
+		nse->ll = GPRS_NS2_LL_UNDEF;
+		nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+	}
+
+	return CMD_SUCCESS;
+}
+
+DEFUN(cfg_ns_nse_ip_sns, cfg_ns_nse_ip_sns_cmd,
+      "ip-sns " VTY_IPV46_CMD " <1-65535>",
+      "SNS Initial Endpoint\n"
+      "SGSN IPv4 Address\n" "SGSN IPv6 Address\n"
+      "SGSN UDP Port\n"
+      )
+{
+	struct gprs_ns2_nse *nse = vty->index;
+	bool dialect_modified = false;
+	bool ll_modified = false;
+	int rc;
+
+	/* argv[0] */
+	struct osmo_sockaddr_str remote_str;
+	struct osmo_sockaddr remote;
+	uint16_t port = atoi(argv[1]);
+
+	if (nse->ll == GPRS_NS2_LL_UNDEF) {
+		nse->ll = GPRS_NS2_LL_UDP;
+		ll_modified = true;
+	}
+
+	if (nse->dialect == GPRS_NS2_DIALECT_UNDEF) {
+		char sns[16];
+		snprintf(sns, sizeof(sns), "NSE%05u-SNS", nse->nsei);
+		nse->bss_sns_fi = ns2_sns_bss_fsm_alloc(nse, sns);
+		if (!nse->bss_sns_fi)
+			goto err;
+		nse->dialect = GPRS_NS2_DIALECT_SNS;
+		dialect_modified = true;
+	}
+
+	if (nse->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "Can not mix NS-VC with different link layer%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (nse->dialect != GPRS_NS2_DIALECT_SNS) {
+		vty_out(vty, "Can not mix NS-VC with different dialects%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (osmo_sockaddr_str_from_str(&remote_str, argv[0], port)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	if (osmo_sockaddr_str_to_sockaddr(&remote_str, &remote.u.sas)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		goto err;
+	}
+
+	rc = gprs_ns2_sns_add_endpoint(nse, &remote);
+	switch (rc) {
+	case 0:
+		return CMD_SUCCESS;
+	case -EADDRINUSE:
+		vty_out(vty, "Specified SNS endpoint already part of the NSE.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	default:
+		vty_out(vty, "Can not add specified SNS endpoint.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+err:
+	if (ll_modified)
+		nse->ll = GPRS_NS2_LL_UNDEF;
+	if (dialect_modified)
+		nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+	return CMD_WARNING;
+}
+
+DEFUN(cfg_no_ns_nse_ip_sns, cfg_no_ns_nse_ip_sns_cmd,
+      "no ip-sns " VTY_IPV46_CMD " <1-65535>",
+      NO_STR
+      "Delete a SNS Initial Endpoint\n"
+      "SGSN IPv4 Address\n" "SGSN IPv6 Address\n"
+      "SGSN UDP Port\n"
+      )
+{
+	struct gprs_ns2_nse *nse = vty->index;
+	struct osmo_sockaddr_str remote_str; /* argv[0] */
+	struct osmo_sockaddr remote;
+	uint16_t port = atoi(argv[1]);
+	int count;
+
+	if (nse->ll != GPRS_NS2_LL_UDP) {
+		vty_out(vty, "This NSE doesn't support UDP.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (nse->dialect != GPRS_NS2_DIALECT_SNS) {
+		vty_out(vty, "This NSE doesn't support UDP with dialect ip-sns.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (osmo_sockaddr_str_from_str(&remote_str, argv[0], port)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (osmo_sockaddr_str_to_sockaddr(&remote_str, &remote.u.sas)) {
+		vty_out(vty, "Can not parse IPv4/IPv6 or port.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	if (gprs_ns2_sns_del_endpoint(nse, &remote)) {
+		vty_out(vty, "Can not remove specified SNS endpoint.%s", VTY_NEWLINE);
+		return CMD_WARNING;
+	}
+
+	count = gprs_ns2_sns_count(nse);
+	if (count > 0) {
+		 /* there are other sns endpoints */
+		return CMD_SUCCESS;
+	} else if (count < 0) {
+		OSMO_ASSERT(0);
+	} else {
+		/* clean up nse to allow other nsvc commands */
+		osmo_fsm_inst_term(nse->bss_sns_fi, OSMO_FSM_TERM_REQUEST, NULL);
+		nse->bss_sns_fi = NULL;
+		nse->ll = GPRS_NS2_LL_UNDEF;
+		nse->dialect = GPRS_NS2_DIALECT_UNDEF;
+	}
+
+	return CMD_SUCCESS;
+}
+
+
+/* non-config commands */
 static void dump_nsvc(struct vty *vty, struct gprs_ns2_vc *nsvc, bool stats)
 {
 	char nsvci_str[32];
@@ -440,7 +1491,9 @@
 		return CMD_WARNING;
 	}
 
-	if (nse->dialect == GPRS_NS2_DIALECT_SNS) {
+	if (!nse->persistent) {
+		gprs_ns2_free_nse(nse);
+	} else if (nse->dialect == GPRS_NS2_DIALECT_SNS) {
 		gprs_ns2_free_nsvcs(nse);
 	} else {
 		/* Perform the operation for all nsvc */
@@ -450,310 +1503,57 @@
 	return CMD_SUCCESS;
 }
 
-#define NSE_CMD_STR "Persistent NS Entity\n" "NS Entity ID (NSEI)\n"
-
-DEFUN(cfg_nse_fr, cfg_nse_fr_cmd,
-	"nse <0-65535> nsvci <0-65535> (fr|frnet) NETIF dlci <0-1023>",
-	NSE_CMD_STR
-	"NS Virtual Connection\n"
-	"NS Virtual Connection ID (NSVCI)\n"
-	"Frame Relay User-Side\n"
-	"Frame Relay Network-Side\n"
-	IFNAME_STR
-	"Data Link connection identifier\n"
-	"Data Link connection identifier\n"
-	)
+DEFUN(nsvc_block, nsvc_block_cmd,
+      "nsvc <0-65535> (block|unblock)",
+      "NS Virtual Connection\n"
+      NSVCI_STR
+      "Block a NSVC. As cause code O&M intervention will be used.\n"
+      "Unblock a NSVC. As cause code O&M intervention will be used.\n")
 {
-	struct ns2_vty_vc *vtyvc;
+	struct gprs_ns2_inst *nsi = vty_nsi;
+	struct gprs_ns2_vc *nsvc;
 
-	uint16_t nsei = atoi(argv[0]);
-	uint16_t nsvci = atoi(argv[1]);
-	const char *role = argv[2];
-	const char *name = argv[3];
-	uint16_t dlci = atoi(argv[4]);
+	uint16_t id = atoi(argv[0]);
 
-	vtyvc = vtyvc_by_nsei(nsei, true);
-	if (!vtyvc) {
-		vty_out(vty, "Can not allocate space %s", VTY_NEWLINE);
+	nsvc = gprs_ns2_nsvc_by_nsvci(nsi, id);
+	if (!nsvc) {
+		vty_out(vty, "Could not find NSVCI %05u%s", id, VTY_NEWLINE);
 		return CMD_WARNING;
 	}
 
-	if (!strcmp(role, "fr"))
-		vtyvc->fr.role = FR_ROLE_USER_EQUIPMENT;
-	else if (!strcmp(role, "frnet"))
-		vtyvc->fr.role = FR_ROLE_NETWORK_EQUIPMENT;
-
-	osmo_strlcpy(vtyvc->netif, name, sizeof(vtyvc->netif));
-	vtyvc->frdlci = dlci;
-	vtyvc->nsvci = nsvci;
-	vtyvc->ll = GPRS_NS2_LL_FR;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nse_nsvc, cfg_nse_nsvci_cmd,
-	"nse <0-65535> nsvci <0-65535>",
-	NSE_CMD_STR
-	"NS Virtual Connection\n"
-	"NS Virtual Connection ID (NSVCI)\n"
-	)
-{
-	struct ns2_vty_vc *vtyvc;
-
-	uint16_t nsei = atoi(argv[0]);
-	uint16_t nsvci = atoi(argv[1]);
-
-	vtyvc = vtyvc_by_nsei(nsei, true);
-	if (!vtyvc) {
-		vty_out(vty, "Can not allocate space %s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	vtyvc->nsvci = nsvci;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nse_remoteip, cfg_nse_remoteip_cmd,
-	"nse <0-65535> remote-ip " VTY_IPV46_CMD,
-	NSE_CMD_STR
-	"Remote IP Address\n"
-	"Remote IPv4 Address\n"
-	"Remote IPv6 Address\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	struct ns2_vty_vc *vtyvc;
-
-	vtyvc = vtyvc_by_nsei(nsei, true);
-	if (!vtyvc) {
-		vty_out(vty, "Can not allocate space %s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	osmo_sockaddr_str_from_str2(&vtyvc->remote, argv[1]);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nse_remoteport, cfg_nse_remoteport_cmd,
-	"nse <0-65535> remote-port <0-65535>",
-	NSE_CMD_STR
-	"Remote UDP Port\n"
-	"Remote UDP Port Number\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	uint16_t port = atoi(argv[1]);
-	struct ns2_vty_vc *vtyvc;
-
-	vtyvc = vtyvc_by_nsei(nsei, true);
-	if (!vtyvc) {
-		vty_out(vty, "Can not allocate space %s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	vtyvc->remote.port = port;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nse_fr_dlci, cfg_nse_fr_dlci_cmd,
-	"nse <0-65535> nsvci <0-65535> fr-dlci <16-1007>",
-	NSE_CMD_STR
-	"NS Virtual Connection\n"
-	"NS Virtual Connection ID (NSVCI)\n"
-	"Frame Relay DLCI\n"
-	"Frame Relay DLCI Number\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	uint16_t nsvci = atoi(argv[1]);
-	uint16_t dlci = atoi(argv[2]);
-	struct ns2_vty_vc *vtyvc;
-
-	vtyvc = vtyvc_by_nsei(nsei, true);
-	if (!vtyvc) {
-		vty_out(vty, "Can not allocate space %s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	vtyvc->frdlci = dlci;
-	vtyvc->nsvci = nsvci;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nse_encaps, cfg_nse_encaps_cmd,
-	"nse <0-65535> encapsulation (udp|framerelay-gre)",
-	NSE_CMD_STR
-	"Encapsulation for NS\n"
-	"UDP/IP Encapsulation\n" "Frame-Relay/GRE/IP Encapsulation\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	struct ns2_vty_vc *vtyvc;
-
-	vtyvc = vtyvc_by_nsei(nsei, true);
-	if (!vtyvc) {
-		vty_out(vty, "Can not allocate space %s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!strcmp(argv[1], "udp"))
-		vtyvc->ll = GPRS_NS2_LL_UDP;
-	else
-		vtyvc->ll = GPRS_NS2_LL_FR_GRE;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nse_remoterole, cfg_nse_remoterole_cmd,
-	"nse <0-65535> remote-role (sgsn|bss)",
-	NSE_CMD_STR
-	"Remote NSE Role\n"
-	"Remote Peer is SGSN\n"
-	"Remote Peer is BSS\n")
-{
-	uint16_t nsei = atoi(argv[0]);
-	struct ns2_vty_vc *vtyvc;
-
-	vtyvc = vtyvc_by_nsei(nsei, true);
-	if (!vtyvc) {
-		vty_out(vty, "Can not allocate space %s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (!strcmp(argv[1], "sgsn"))
-		vtyvc->remote_end_is_sgsn = 1;
-	else
-		vtyvc->remote_end_is_sgsn = 0;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_no_nse, cfg_no_nse_cmd,
-	"no nse <0-65535>",
-	"Delete Persistent NS Entity\n"
-	"Delete " NSE_CMD_STR)
-{
-	uint16_t nsei = atoi(argv[0]);
-	struct ns2_vty_vc *vtyvc;
-
-	vtyvc = vtyvc_by_nsei(nsei, false);
-	if (!vtyvc) {
-		vty_out(vty, "The NSE %d does not exists.%s", nsei, VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	ns2_vc_free(vtyvc);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_ns_timer, cfg_ns_timer_cmd,
-	"timer " NS_TIMERS " <0-65535>",
-	"Network Service Timer\n"
-	NS_TIMERS_HELP "Timer Value\n")
-{
-	int idx = get_string_value(gprs_ns_timer_strs, argv[0]);
-	int val = atoi(argv[1]);
-
-	if (idx < 0 || idx >= ARRAY_SIZE(vty_nsi->timeout))
-		return CMD_WARNING;
-
-	vty_nsi->timeout[idx] = val;
-
-	return CMD_SUCCESS;
-}
-
-#define ENCAPS_STR "NS encapsulation options\n"
-
-DEFUN(cfg_nsip_local_ip, cfg_nsip_local_ip_cmd,
-      "encapsulation udp local-ip " VTY_IPV46_CMD,
-	ENCAPS_STR "NS over UDP Encapsulation\n"
-	"Set the IP address on which we listen for NS/UDP\n"
-	"IPv4 Address\n"
-	"IPv6 Address\n")
-{
-	osmo_sockaddr_str_from_str2(&priv.udp, argv[0]);
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nsip_local_port, cfg_nsip_local_port_cmd,
-      "encapsulation udp local-port <0-65535>",
-	ENCAPS_STR "NS over UDP Encapsulation\n"
-	"Set the UDP port on which we listen for NS/UDP\n"
-	"UDP port number\n")
-{
-	unsigned int port = atoi(argv[0]);
-
-	priv.udp.port = port;
-
-	return CMD_SUCCESS;
-}
-
-DEFUN(cfg_nsip_dscp, cfg_nsip_dscp_cmd,
-      "encapsulation udp dscp <0-255>",
-	ENCAPS_STR "NS over UDP Encapsulation\n"
-	"Set DSCP/TOS on the UDP socket\n" "DSCP Value\n")
-{
-	int dscp = atoi(argv[0]);
-	struct gprs_ns2_vc_bind *bind;
-
-	priv.dscp = dscp;
-
-	llist_for_each_entry(bind, &vty_nsi->binding, list) {
-		if (gprs_ns2_is_ip_bind(bind))
-			gprs_ns2_ip_bind_set_dscp(bind, dscp);
+	if (!strcmp(argv[1], "block")) {
+		ns2_vc_block(nsvc);
+	} else {
+		ns2_vc_unblock(nsvc);
 	}
 
 	return CMD_SUCCESS;
 }
 
-DEFUN(cfg_nsip_res_block_unblock, cfg_nsip_res_block_unblock_cmd,
-	"encapsulation udp use-reset-block-unblock (enabled|disabled)",
-	ENCAPS_STR "NS over UDP Encapsulation\n"
-	"Use NS-{RESET,BLOCK,UNBLOCK} procedures in violation of 3GPP TS 48.016\n"
-	"Enable NS-{RESET,BLOCK,UNBLOCK}\n"
-	"Disable NS-{RESET,BLOCK,UNBLOCK}\n")
+static void log_set_nse_filter(struct log_target *target,
+				struct gprs_ns2_nse *nse)
 {
-	enum gprs_ns2_vc_mode vc_mode;
-
-	if (!strcmp(argv[0], "enabled"))
-		vc_mode = GPRS_NS2_VC_MODE_BLOCKRESET;
-	else
-		vc_mode = GPRS_NS2_VC_MODE_ALIVE;
-
-	priv.vc_mode = vc_mode;
-
-	return CMD_SUCCESS;
+	if (nse) {
+		target->filter_map |= (1 << LOG_FLT_GB_NSE);
+		target->filter_data[LOG_FLT_GB_NSE] = nse;
+	} else if (target->filter_data[LOG_FLT_GB_NSE]) {
+		target->filter_map = ~(1 << LOG_FLT_GB_NSE);
+		target->filter_data[LOG_FLT_GB_NSE] = NULL;
+	}
 }
 
-DEFUN(cfg_frgre_local_ip, cfg_frgre_local_ip_cmd,
-      "encapsulation framerelay-gre local-ip " VTY_IPV46_CMD,
-	ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"
-	"Set the IP address on which we listen for NS/FR/GRE\n"
-	"IPv4 Address\n"
-	"IPv6 Address\n")
+static void log_set_nsvc_filter(struct log_target *target,
+				struct gprs_ns2_vc *nsvc)
 {
-	osmo_sockaddr_str_from_str2(&priv.frgreaddr, argv[0]);
-
-	return CMD_SUCCESS;
+	if (nsvc) {
+		target->filter_map |= (1 << LOG_FLT_GB_NSVC);
+		target->filter_data[LOG_FLT_GB_NSVC] = nsvc;
+	} else if (target->filter_data[LOG_FLT_GB_NSVC]) {
+		target->filter_map = ~(1 << LOG_FLT_GB_NSVC);
+		target->filter_data[LOG_FLT_GB_NSVC] = NULL;
+	}
 }
 
-DEFUN(cfg_frgre_enable, cfg_frgre_enable_cmd,
-      "encapsulation framerelay-gre enabled (1|0)",
-	ENCAPS_STR "NS over Frame Relay over GRE Encapsulation\n"
-	"Enable or disable Frame Relay over GRE\n"
-	"Enable\n" "Disable\n")
-{
-	int enabled = atoi(argv[0]);
-
-	priv.frgre = enabled;
-
-	return CMD_SUCCESS;
-}
-
-/* TODO: allow vty to reset/block/unblock nsvc/nsei */
-
 DEFUN(logging_fltr_nse,
       logging_fltr_nse_cmd,
       "logging filter nse nsei <0-65535>",
@@ -817,29 +1617,14 @@
 	return CMD_SUCCESS;
 }
 
-/**
- * gprs_ns2_vty_init initialize the vty
- * \param[inout] nsi
- * \param[in] default_bind set the default address to bind to. Can be NULL.
- * \return 0 on success
- */
-int gprs_ns2_vty_init(struct gprs_ns2_inst *nsi,
-		      const struct osmo_sockaddr_str *default_bind)
+int gprs_ns2_vty_init(struct gprs_ns2_inst *nsi)
 {
-	static bool vty_elements_installed = false;
-
 	vty_nsi = nsi;
-	memset(&priv, 0, sizeof(struct ns2_vty_priv));
-	INIT_LLIST_HEAD(&priv.vtyvc);
-	priv.vc_mode = GPRS_NS2_VC_MODE_BLOCKRESET;
-	if (default_bind)
-		memcpy(&priv.udp, default_bind, sizeof(*default_bind));
+	INIT_LLIST_HEAD(&binds);
 
-	/* Regression test code may call this function repeatedly, so make sure
-	 * that VTY elements are not duplicated, which would assert. */
-	if (vty_elements_installed)
-		return 0;
-	vty_elements_installed = true;
+	vty_fr_network = osmo_fr_network_alloc(nsi);
+	if (!vty_fr_network)
+		return -ENOMEM;
 
 	install_lib_element_ve(&show_ns_cmd);
 	install_lib_element_ve(&show_ns_binds_cmd);
@@ -850,152 +1635,42 @@
 	install_lib_element_ve(&logging_fltr_nsvc_cmd);
 
 	install_lib_element(ENABLE_NODE, &nsvc_force_unconf_cmd);
+	install_lib_element(ENABLE_NODE, &nsvc_block_cmd);
 
 	install_lib_element(CFG_LOG_NODE, &logging_fltr_nse_cmd);
 	install_lib_element(CFG_LOG_NODE, &logging_fltr_nsvc_cmd);
 
 	install_lib_element(CONFIG_NODE, &cfg_ns_cmd);
+
 	install_node(&ns_node, config_write_ns);
-	install_lib_element(L_NS_NODE, &cfg_nse_fr_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nse_nsvci_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nse_remoteip_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nse_remoteport_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nse_fr_dlci_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nse_encaps_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nse_remoterole_cmd);
-	install_lib_element(L_NS_NODE, &cfg_no_nse_cmd);
+	/* TODO: convert into osmo timer */
 	install_lib_element(L_NS_NODE, &cfg_ns_timer_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nsip_local_ip_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nsip_local_port_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nsip_dscp_cmd);
-	install_lib_element(L_NS_NODE, &cfg_nsip_res_block_unblock_cmd);
-	install_lib_element(L_NS_NODE, &cfg_frgre_enable_cmd);
-	install_lib_element(L_NS_NODE, &cfg_frgre_local_ip_cmd);
+	install_lib_element(L_NS_NODE, &cfg_ns_nsei_cmd);
+	install_lib_element(L_NS_NODE, &cfg_no_ns_nsei_cmd);
+	install_lib_element(L_NS_NODE, &cfg_ns_bind_cmd);
+	install_lib_element(L_NS_NODE, &cfg_no_ns_bind_cmd);
 
-	/* TODO: nsvc/nsei command to reset states or reset/block/unblock nsei/nsvcs */
+	install_node(&ns_bind_node, config_write_ns_bind);
+	install_lib_element(L_NS_BIND_NODE, &cfg_ns_bind_listen_cmd);
+	install_lib_element(L_NS_BIND_NODE, &cfg_no_ns_bind_listen_cmd);
+	install_lib_element(L_NS_BIND_NODE, &cfg_ns_bind_dscp_cmd);
+	install_lib_element(L_NS_BIND_NODE, &cfg_no_ns_bind_dscp_cmd);
+	install_lib_element(L_NS_BIND_NODE, &cfg_ns_bind_ipaccess_cmd);
+	install_lib_element(L_NS_BIND_NODE, &cfg_no_ns_bind_ipaccess_cmd);
+	install_lib_element(L_NS_BIND_NODE, &cfg_ns_bind_fr_cmd);
+	install_lib_element(L_NS_BIND_NODE, &cfg_no_ns_bind_fr_cmd);
+	/* TODO: accept-ip-sns when SGSN SNS has been implemented */
 
-	return 0;
-}
-
-/*!
- * \brief gprs_ns2_vty_create parse the vty tree into ns nodes
- * It has to be in different steps to ensure the bind is created before creating VCs.
- * \return 0 on success
- */
-int gprs_ns2_vty_create() {
-	struct ns2_vty_vc *vtyvc;
-	struct gprs_ns2_vc_bind *bind, *fr;
-	struct gprs_ns2_nse *nse;
-	struct gprs_ns2_vc *nsvc;
-	struct osmo_sockaddr sockaddr;
-	enum gprs_ns2_dialect dialect = GPRS_NS2_DIALECT_UNDEF;
-	int rc = 0;
-
-	if (!vty_nsi)
-		return -1;
-
-	/* create binds, only support a single bind. either FR or UDP */
-	if (priv.frgre) {
-		/* TODO not yet supported !*/
-		return -1;
-	} else {
-		/* UDP */
-		osmo_sockaddr_str_to_sockaddr(&priv.udp, &sockaddr.u.sas);
-		if (gprs_ns2_ip_bind(vty_nsi, "vtybind", &sockaddr, priv.dscp, &bind)) {
-			/* TODO: could not bind on the specific address */
-			return -1;
-		}
-
-		bind->accept_ipaccess = priv.vc_mode == GPRS_NS2_VC_MODE_BLOCKRESET;
-	}
-
-	/* create vcs */
-	llist_for_each_entry(vtyvc, &priv.vtyvc, list) {
-		/* validate settings */
-		switch (vtyvc->ll) {
-		case GPRS_NS2_LL_UDP:
-			if (priv.vc_mode == GPRS_NS2_VC_MODE_BLOCKRESET)
-				dialect = GPRS_NS2_DIALECT_IPACCESS;
-			else
-				dialect = GPRS_NS2_DIALECT_STATIC_ALIVE;
-			if (strlen(vtyvc->remote.ip) == 0) {
-				/* Invalid IP for VC */
-				continue;
-			}
-
-			if (!vtyvc->remote.port) {
-				/* Invalid port for VC */
-				continue;
-			}
-
-			if (osmo_sockaddr_str_to_sockaddr(&vtyvc->remote, &sockaddr.u.sas)) {
-				/* Invalid sockaddr for VC */
-				continue;
-			}
-			break;
-		case GPRS_NS2_LL_FR:
-			dialect = GPRS_NS2_DIALECT_STATIC_RESETBLOCK;
-			break;
-		case GPRS_NS2_LL_FR_GRE:
-			dialect = GPRS_NS2_DIALECT_STATIC_RESETBLOCK;
-			continue;
-		case GPRS_NS2_LL_UNDEF:
-			/* should not happen */
-			OSMO_ASSERT(false);
-		}
-
-		nse = gprs_ns2_nse_by_nsei(vty_nsi, vtyvc->nsei);
-		if (!nse) {
-			nse = gprs_ns2_create_nse(vty_nsi, vtyvc->nsei, vtyvc->ll, dialect);
-			if (!nse) {
-				/* Could not create NSE for VTY */
-				continue;
-			}
-		}
-		nse->persistent = true;
-
-		switch (vtyvc->ll) {
-		case GPRS_NS2_LL_UDP:
-			nsvc = gprs_ns2_ip_connect(bind,
-						   &sockaddr,
-						   nse,
-						   vtyvc->nsvci);
-			if (!nsvc) {
-				/* Could not create NSVC, connect failed */
-				continue;
-			}
-			nsvc->persistent = true;
-			break;
-		case GPRS_NS2_LL_FR: {
-			if (vty_fr_network == NULL) {
-				/* TODO: add a switch for BSS/SGSN/gbproxy */
-				vty_fr_network = osmo_fr_network_alloc(vty_nsi);
-			}
-			fr = gprs_ns2_fr_bind_by_netif(
-						vty_nsi,
-						vtyvc->netif);
-			if (!fr) {
-				rc = gprs_ns2_fr_bind(vty_nsi, vtyvc->netif, vtyvc->netif, vty_fr_network, vtyvc->fr.role, &fr);
-				if (rc < 0) {
-					LOGP(DLNS, LOGL_ERROR, "Can not create fr bind on device %s err: %d\n", vtyvc->netif, rc);
-					return rc;
-				}
-			}
-
-			nsvc = gprs_ns2_fr_connect(fr, nse, vtyvc->nsvci, vtyvc->frdlci);
-			if (!nsvc) {
-				/* Could not create NSVC, connect failed */
-				continue;
-			}
-			nsvc->persistent = true;
-			break;
-		}
-		case GPRS_NS2_LL_FR_GRE:
-		case GPRS_NS2_LL_UNDEF:
-			continue;
-		}
-	}
-
+	install_node(&ns_nse_node, config_write_ns_nse);
+	install_lib_element(L_NS_NSE_NODE, &cfg_ns_nse_nsvc_fr_cmd);
+	install_lib_element(L_NS_NSE_NODE, &cfg_no_ns_nse_nsvci_cmd);
+	install_lib_element(L_NS_NSE_NODE, &cfg_no_ns_nse_nsvc_fr_dlci_cmd);
+	install_lib_element(L_NS_NSE_NODE, &cfg_ns_nse_nsvc_udp_cmd);
+	install_lib_element(L_NS_NSE_NODE, &cfg_no_ns_nse_nsvc_udp_cmd);
+	install_lib_element(L_NS_NSE_NODE, &cfg_ns_nse_nsvc_ipa_cmd);
+	install_lib_element(L_NS_NSE_NODE, &cfg_no_ns_nse_nsvc_ipa_cmd);
+	install_lib_element(L_NS_NSE_NODE, &cfg_ns_nse_ip_sns_cmd);
+	install_lib_element(L_NS_NSE_NODE, &cfg_no_ns_nse_ip_sns_cmd);
 
 	return 0;
 }
