diff --git a/src/Makefile.am b/src/Makefile.am
index 7e9e1dc..bd69738 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -31,13 +31,6 @@
 	libcommon-cs \
 	$(NULL)
 
-# Conditional Libraries
-if BUILD_IU
-SUBDIRS += \
-	libiu \
-	$(NULL)
-endif
-
 # Programs
 SUBDIRS += \
 	osmo-msc \
diff --git a/src/gprs/Makefile.am b/src/gprs/Makefile.am
index e05eb79..39a4c12 100644
--- a/src/gprs/Makefile.am
+++ b/src/gprs/Makefile.am
@@ -106,7 +106,6 @@
 	$(NULL)
 if BUILD_IU
 osmo_sgsn_LDADD += \
-	$(top_builddir)/src/libiu/libiu.a \
 	$(LIBOSMOSIGTRAN_LIBS) \
 	$(LIBOSMORANAP_LIBS) \
 	$(LIBASN1C_LIBS) \
diff --git a/src/gprs/gprs_gmm.c b/src/gprs/gprs_gmm.c
index 15e2fed..032137f 100644
--- a/src/gprs/gprs_gmm.c
+++ b/src/gprs/gprs_gmm.c
@@ -52,6 +52,7 @@
 #ifdef BUILD_IU
 #include <osmocom/ranap/ranap_ies_defs.h>
 #include <osmocom/ranap/ranap_msg_factory.h>
+#include <osmocom/ranap/iu_client.h>
 #endif
 
 #include <openbsc/debug.h>
@@ -67,7 +68,6 @@
 #include <openbsc/gprs_subscriber.h>
 #include <openbsc/sgsn.h>
 #include <openbsc/signal.h>
-#include <openbsc/iu.h>
 #include <openbsc/gprs_sndcp.h>
 
 #include <pdp.h>
@@ -174,7 +174,7 @@
 
 #ifdef BUILD_IU
 int sgsn_ranap_rab_ass_resp(struct sgsn_mm_ctx *ctx, RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies);
-int sgsn_ranap_iu_event(struct ue_conn_ctx *ctx, enum iu_event_type type, void *data)
+int sgsn_ranap_iu_event(struct ranap_ue_conn_ctx *ctx, enum ranap_iu_event_type type, void *data)
 {
 	struct sgsn_mm_ctx *mm;
 	int rc = -1;
@@ -188,14 +188,14 @@
 	}
 
 	switch (type) {
-	case IU_EVENT_RAB_ASSIGN:
+	case RANAP_IU_EVENT_RAB_ASSIGN:
 		REQUIRE_MM
 		rc = sgsn_ranap_rab_ass_resp(mm, (RANAP_RAB_SetupOrModifiedItemIEs_t *)data);
 		break;
-	case IU_EVENT_IU_RELEASE:
+	case RANAP_IU_EVENT_IU_RELEASE:
 		/* fall thru */
-	case IU_EVENT_LINK_INVALIDATED:
-		/* Clean up ue_conn_ctx here */
+	case RANAP_IU_EVENT_LINK_INVALIDATED:
+		/* Clean up ranap_ue_conn_ctx here */
 		if (mm)
 			LOGMMCTXP(LOGL_INFO, mm, "IU release for imsi %s\n", mm->imsi);
 		else
@@ -205,7 +205,7 @@
 			mmctx_set_pmm_state(mm, PMM_IDLE);
 		rc = 0;
 		break;
-	case IU_EVENT_SECURITY_MODE_COMPLETE:
+	case RANAP_IU_EVENT_SECURITY_MODE_COMPLETE:
 		REQUIRE_MM
 		/* Continue authentication here */
 		mm->iu.ue_ctx->integrity_active = 1;
@@ -262,16 +262,16 @@
 		rate_ctr_inc(&mm->ctrg->ctr[GMM_CTR_PKTS_SIG_OUT]);
 #ifdef BUILD_IU
 		if (mm->ran_type == MM_CTX_T_UTRAN_Iu)
-			return iu_tx(msg, GPRS_SAPI_GMM);
+			return ranap_iu_tx(msg, GPRS_SAPI_GMM);
 #endif
 	}
 
 #ifdef BUILD_IU
-	/* In Iu mode, msg->dst contains the ue_conn_ctx pointer, in Gb mode
+	/* In Iu mode, msg->dst contains the ranap_ue_conn_ctx pointer, in Gb mode
 	 * dst is empty. */
 	/* FIXME: have a more explicit indicator for Iu messages */
 	if (msg->dst)
-		return iu_tx(msg, GPRS_SAPI_GMM);
+		return ranap_iu_tx(msg, GPRS_SAPI_GMM);
 #endif
 
 	/* caller needs to provide TLLI, BVCI and NSEI */
@@ -296,9 +296,12 @@
 	/* In case a Iu connection is reconnected we need to update the ue ctx */
 	mm->iu.ue_ctx = msg->dst;
 	if (mm->ran_type == MM_CTX_T_UTRAN_Iu
-	    && mm->iu.ue_ctx)
+	    && mm->iu.ue_ctx) {
+#ifdef BUILD_IU
 		mm->iu.ue_ctx->rab_assign_addr_enc =
 			sgsn->cfg.iu.rab_assign_addr_enc;
+#endif
+	}
 }
 
 /* Store BVCI/NSEI in MM context */
@@ -1048,7 +1051,7 @@
 	/* The MS is authorized */
 #ifdef BUILD_IU
 	if (ctx->ran_type == MM_CTX_T_UTRAN_Iu && !ctx->iu.ue_ctx->integrity_active) {
-		rc = iu_tx_sec_mode_cmd(ctx->iu.ue_ctx, &ctx->auth_triplet, 0, ctx->iu.new_key);
+		rc = ranap_iu_tx_sec_mode_cmd(ctx->iu.ue_ctx, &ctx->auth_triplet.vec, 0, ctx->iu.new_key);
 		ctx->iu.new_key = 0;
 		return rc;
 	}
@@ -1259,14 +1262,20 @@
 	 * with a foreign TLLI (P-TMSI that was allocated to the MS before),
 	 * or with random TLLI. */
 
-	/* In Iu mode, msg->dst contains the ue_conn_ctx pointer, in Gb mode
+	/* In Iu mode, msg->dst contains the ranap_ue_conn_ctx pointer, in Gb mode
 	 * dst is empty. */
 	/* FIXME: have a more explicit indicator for Iu messages */
 	if (!msg->dst) {
 		/* Gb mode */
 		cid = bssgp_parse_cell_id(&ra_id, msgb_bcid(msg));
-	} else
-		ra_id = ((struct ue_conn_ctx*)msg->dst)->ra_id;
+	} else {
+#ifdef BUILD_IU
+		ra_id = ((struct ranap_ue_conn_ctx*)msg->dst)->ra_id;
+#else
+		LOGMMCTXP(LOGL_ERROR, ctx, "Cannot handle Iu Attach Request, built without Iu support\n");
+		return -ENOTSUP;
+#endif
+	}
 
 	/* MS network capability 10.5.5.12 */
 	msnc_len = *cur++;
@@ -1627,7 +1636,7 @@
 		 * is an optimization to avoid the RA reject (impl detached)
 		 * below, which will cause a new attach cycle. */
 		/* Look-up the MM context based on old RA-ID and TLLI */
-		/* In Iu mode, msg->dst contains the ue_conn_ctx pointer, in Gb
+		/* In Iu mode, msg->dst contains the ranap_ue_conn_ctx pointer, in Gb
 		 * mode dst is empty. */
 		/* FIXME: have a more explicit indicator for Iu messages */
 		if (!msg->dst) {
@@ -2905,12 +2914,12 @@
 {
 	struct msgb *msg;
 	struct sgsn_mm_ctx *mm = pdp->mm;
-	struct ue_conn_ctx *uectx;
+	struct ranap_ue_conn_ctx *uectx;
 	uint32_t ggsn_ip;
 	bool use_x213_nsap;
 
 	uectx = mm->iu.ue_ctx;
-	use_x213_nsap = (uectx->rab_assign_addr_enc == NSAP_ADDR_ENC_X213);
+	use_x213_nsap = (uectx->rab_assign_addr_enc == RANAP_NSAP_ADDR_ENC_X213);
 
 	/* Get the IP address for ggsn user plane */
 	memcpy(&ggsn_ip, pdp->lib->gsnru.v, pdp->lib->gsnru.l);
@@ -2923,6 +2932,6 @@
 	msg = ranap_new_msg_rab_assign_data(rab_id, ggsn_ip,
 					    pdp->lib->teid_gn, use_x213_nsap);
 	msg->l2h = msg->data;
-	return iu_rab_act(uectx, msg);
+	return ranap_iu_rab_act(uectx, msg);
 }
 #endif
diff --git a/src/gprs/gprs_sgsn.c b/src/gprs/gprs_sgsn.c
index 43eeaaa..de79afb 100644
--- a/src/gprs/gprs_sgsn.c
+++ b/src/gprs/gprs_sgsn.c
@@ -40,7 +40,6 @@
 #include <openbsc/gprs_utils.h>
 #include <openbsc/signal.h>
 #include "openbsc/gprs_llc.h"
-#include <openbsc/iu.h>
 
 #include <pdp.h>
 
@@ -48,6 +47,12 @@
 
 #include <openssl/rand.h>
 
+#include "../../bscconfig.h"
+
+#if BUILD_IU
+#include <osmocom/ranap/iu_client.h>
+#endif
+
 #define GPRS_LLME_CHECK_TICK 30
 
 extern struct sgsn_instance *sgsn;
@@ -246,6 +251,7 @@
 /* Allocate a new SGSN MM context */
 struct sgsn_mm_ctx *sgsn_mm_ctx_alloc_iu(void *uectx)
 {
+#if BUILD_IU
 	struct sgsn_mm_ctx *ctx;
 
 	ctx = talloc_zero(tall_bsc_ctx, struct sgsn_mm_ctx);
@@ -274,6 +280,9 @@
 	llist_add(&ctx->list, &sgsn_mm_ctxts);
 
 	return ctx;
+#else
+	return NULL;
+#endif
 }
 
 
diff --git a/src/gprs/sgsn_libgtp.c b/src/gprs/sgsn_libgtp.c
index 7ff8ece..90b4d16 100644
--- a/src/gprs/sgsn_libgtp.c
+++ b/src/gprs/sgsn_libgtp.c
@@ -52,7 +52,7 @@
 #include <openbsc/gprs_sndcp.h>
 
 #ifdef BUILD_IU
-#include <openbsc/iu.h>
+#include <osmocom/ranap/iu_client.h>
 #include <osmocom/ranap/ranap_ies_defs.h>
 #endif
 
@@ -548,7 +548,7 @@
 		} else {
 #ifdef BUILD_IU
 			/* Deactivate radio bearer */
-			iu_rab_deact(pctx->mm->iu.ue_ctx, 1);
+			ranap_iu_rab_deact(pctx->mm->iu.ue_ctx, 1);
 #else
 			return -ENOTSUP;
 #endif
@@ -687,7 +687,7 @@
 #ifdef BUILD_IU
 		/* Ignore the packet for now and page the UE to get the RAB
 		 * reestablished */
-		iu_page_ps(mm->imsi, &mm->p_tmsi, mm->ra.lac, mm->ra.rac);
+		ranap_iu_page_ps(mm->imsi, &mm->p_tmsi, mm->ra.lac, mm->ra.rac);
 
 		return 0;
 #else
diff --git a/src/gprs/sgsn_main.c b/src/gprs/sgsn_main.c
index d56af0e..25ee632 100644
--- a/src/gprs/sgsn_main.c
+++ b/src/gprs/sgsn_main.c
@@ -58,7 +58,6 @@
 #include <openbsc/sgsn.h>
 #include <openbsc/gprs_llc.h>
 #include <openbsc/gprs_gmm.h>
-#include <openbsc/iu.h>
 
 #include <osmocom/ctrl/control_if.h>
 #include <osmocom/ctrl/ports.h>
@@ -69,6 +68,10 @@
 
 #include "../../bscconfig.h"
 
+#if BUILD_IU
+#include <osmocom/ranap/iu_client.h>
+#endif
+
 #define _GNU_SOURCE
 #include <getopt.h>
 
@@ -322,7 +325,7 @@
 	.num_cat = ARRAY_SIZE(gprs_categories),
 };
 
-int sgsn_ranap_iu_event(struct ue_conn_ctx *ctx, enum iu_event_type type, void *data);
+int sgsn_ranap_iu_event(struct ue_conn_ctx *ctx, enum ranap_iu_event_type type, void *data);
 
 int main(int argc, char **argv)
 {
@@ -451,7 +454,7 @@
 		return 8;
 	}
 
-	iu_init(tall_bsc_ctx, sccp, gsm0408_gprs_rcvmsg_iu, sgsn_ranap_iu_event);
+	ranap_iu_init(tall_bsc_ctx, DRANAP, "OsmoSGSN-IuPS", sccp, gsm0408_gprs_rcvmsg_iu, sgsn_ranap_iu_event);
 #endif
 
 	if (daemonize) {
diff --git a/src/gprs/sgsn_vty.c b/src/gprs/sgsn_vty.c
index cf44cc4..3a5b2ca 100644
--- a/src/gprs/sgsn_vty.c
+++ b/src/gprs/sgsn_vty.c
@@ -48,7 +48,7 @@
 #include "../../bscconfig.h"
 
 #ifdef BUILD_IU
-#include <openbsc/iu.h>
+#include <osmocom/ranap/iu_client.h>
 #endif
 
 static struct sgsn_config *g_cfg = NULL;
@@ -291,7 +291,7 @@
 		vty_out(vty, " no compression v42bis%s", VTY_NEWLINE);
 
 #ifdef BUILD_IU
-	iu_vty_config_write(vty, " ");
+	ranap_iu_vty_config_write(vty, " ");
 #endif
 
 	return CMD_SUCCESS;
@@ -1285,7 +1285,7 @@
 	install_element(SGSN_NODE, &cfg_comp_v42bisp_cmd);
 
 #ifdef BUILD_IU
-	iu_vty_init(SGSN_NODE, &g_cfg->iu.rab_assign_addr_enc);
+	ranap_iu_vty_init(SGSN_NODE, &g_cfg->iu.rab_assign_addr_enc);
 #endif
 	return 0;
 }
diff --git a/src/libiu/Makefile.am b/src/libiu/Makefile.am
deleted file mode 100644
index e5f9e27..0000000
--- a/src/libiu/Makefile.am
+++ /dev/null
@@ -1,28 +0,0 @@
-AM_CPPFLAGS = \
-	$(all_includes) \
-	-I$(top_srcdir)/include \
-	-I$(top_builddir) \
-	$(NULL)
-
-AM_CFLAGS = \
-	-Wall \
-	$(COVERAGE_CFLAGS) \
-	$(LIBCRYPTO_CFLAGS) \
-	$(LIBASN1C_CFLAGS) \
-	$(LIBOSMOCORE_CFLAGS) \
-	$(LIBOSMOVTY_CFLAGS) \
-	$(LIBOSMOGSM_CFLAGS) \
-	$(LIBOSMOABIS_CFLAGS) \
-	$(LIBOSMOSIGTRAN_CFLAGS) \
-	$(LIBOSMORANAP_CFLAGS) \
-	$(NULL)
-
-noinst_LIBRARIES = \
-	libiu.a \
-	$(NULL)
-
-libiu_a_SOURCES = \
-	iu.c \
-	iu_vty.c \
-	$(NULL)
-
diff --git a/src/libiu/iu.c b/src/libiu/iu.c
deleted file mode 100644
index 7794977..0000000
--- a/src/libiu/iu.c
+++ /dev/null
@@ -1,771 +0,0 @@
-/* Common parts of IuCS and IuPS interfaces implementation */
-
-/* (C) 2016 by sysmocom s.f.m.c. GmbH <info@sysmocom.de>
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <stdint.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <stdbool.h>
-
-#include <osmocom/core/select.h>
-#include <osmocom/core/prim.h>
-#include <osmocom/core/talloc.h>
-#include <osmocom/core/logging.h>
-#include <osmocom/core/application.h>
-#include <osmocom/core/utils.h>
-#include <osmocom/vty/logging.h>
-
-#include <osmocom/gsm/gsm48.h>
-#include <osmocom/gprs/gprs_msgb.h>
-
-#include <osmocom/sigtran/osmo_ss7.h>
-#include <osmocom/sigtran/sccp_sap.h>
-#include <osmocom/sigtran/sccp_helpers.h>
-#include <osmocom/sigtran/protocol/m3ua.h>
-
-#include <openbsc/gprs_sgsn.h>
-#include <openbsc/iu.h>
-#include <openbsc/debug.h>
-
-#include <pdp.h>
-
-#include <osmocom/ranap/ranap_ies_defs.h>
-#include <osmocom/ranap/ranap_common.h>
-#include <osmocom/ranap/ranap_common_cn.h>
-#include <osmocom/ranap/ranap_msg_factory.h>
-
-#include <asn1c/asn1helpers.h>
-
-/* Parsed global RNC id. See also struct RANAP_GlobalRNC_ID, and note that the
- * PLMN identity is a BCD representation of the MCC and MNC.
- * See iu_grnc_id_parse(). */
-struct iu_grnc_id {
-	uint16_t mcc;
-	uint16_t mnc;
-	uint16_t rnc_id;
-};
-
-/* A remote RNC (Radio Network Controller, like BSC but for UMTS) that has
- * called us and is currently reachable at the given osmo_sccp_addr. So, when we
- * know a LAC for a subscriber, we can page it at the RNC matching that LAC or
- * RAC. An HNB-GW typically presents itself as if it were a single RNC, even
- * though it may have several RNCs in hNodeBs connected to it. Those will then
- * share the same RNC id, which they actually receive and adopt from the HNB-GW
- * in the HNBAP HNB REGISTER ACCEPT message. */
-struct iu_rnc {
-	struct llist_head entry;
-
-	uint16_t rnc_id;
-	uint16_t lac; /* Location Area Code (used for CS and PS) */
-	uint8_t rac; /* Routing Area Code (used for PS only) */
-	struct osmo_sccp_addr sccp_addr;
-};
-
-void *talloc_iu_ctx;
-
-/* Implement the extern asn_debug from libasn1c to indicate whether to print
- * asn.1 debug messages (see libasn1c). */
-int asn_debug = 0;
-
-/* Implement the extern asn1_xer_print to indicate whether the ASN.1 binary
- * code decoded and encoded during Iu communication should be logged to stderr
- * (see asn.1 generated code in osmo-iuh). */
-int asn1_xer_print = 0;
-
-void *talloc_asn1_ctx;
-
-iu_recv_cb_t global_iu_recv_cb = NULL;
-iu_event_cb_t global_iu_event_cb = NULL;
-
-static LLIST_HEAD(ue_conn_ctx_list);
-static LLIST_HEAD(rnc_list);
-
-static struct osmo_sccp_instance *g_sccp;
-static struct osmo_sccp_user *g_scu;
-
-const struct value_string iu_event_type_names[] = {
-	OSMO_VALUE_STRING(IU_EVENT_RAB_ASSIGN),
-	OSMO_VALUE_STRING(IU_EVENT_SECURITY_MODE_COMPLETE),
-	OSMO_VALUE_STRING(IU_EVENT_IU_RELEASE),
-	OSMO_VALUE_STRING(IU_EVENT_LINK_INVALIDATED),
-	{ 0, NULL }
-};
-
-struct ue_conn_ctx *ue_conn_ctx_alloc(struct osmo_sccp_addr *addr, uint32_t conn_id)
-{
-	struct ue_conn_ctx *ctx = talloc_zero(talloc_iu_ctx, struct ue_conn_ctx);
-
-	ctx->sccp_addr = *addr;
-	ctx->conn_id = conn_id;
-	llist_add(&ctx->list, &ue_conn_ctx_list);
-
-	return ctx;
-}
-
-struct ue_conn_ctx *ue_conn_ctx_find(uint32_t conn_id)
-{
-	struct ue_conn_ctx *ctx;
-
-	llist_for_each_entry(ctx, &ue_conn_ctx_list, list) {
-		if (ctx->conn_id == conn_id)
-			return ctx;
-	}
-	return NULL;
-}
-
-static struct iu_rnc *iu_rnc_alloc(uint16_t rnc_id, uint16_t lac, uint8_t rac,
-				   struct osmo_sccp_addr *addr)
-{
-	struct iu_rnc *rnc = talloc_zero(talloc_iu_ctx, struct iu_rnc);
-
-	rnc->rnc_id = rnc_id;
-	rnc->lac = lac;
-	rnc->rac = rac;
-	rnc->sccp_addr = *addr;
-	llist_add(&rnc->entry, &rnc_list);
-
-	LOGP(DRANAP, LOGL_NOTICE, "New RNC %d (LAC=%d RAC=%d)\n",
-	     rnc->rnc_id, rnc->lac, rnc->rac);
-
-	return rnc;
-}
-
-static struct iu_rnc *iu_rnc_register(uint16_t rnc_id, uint16_t lac,
-				      uint8_t rac, struct osmo_sccp_addr *addr)
-{
-	struct iu_rnc *rnc;
-	llist_for_each_entry(rnc, &rnc_list, entry) {
-		if (rnc->rnc_id != rnc_id)
-			continue;
-
-		/* We have this RNC Id registered already. Make sure that the
-		 * details match. */
-
-		/* TODO should a mismatch be an error? */
-		if (rnc->lac != lac || rnc->rac != rac)
-			LOGP(DRANAP, LOGL_NOTICE, "RNC %d changes its details:"
-			     " LAC=%d RAC=%d --> LAC=%d RAC=%d\n",
-			     rnc->rnc_id, rnc->lac, rnc->rac,
-			     lac, rac);
-		rnc->lac = lac;
-		rnc->rac = rac;
-
-		if (addr && memcmp(&rnc->sccp_addr, addr, sizeof(*addr)))
-			LOGP(DRANAP, LOGL_NOTICE, "RNC %d on New SCCP Addr %s"
-			     " (LAC=%d RAC=%d)\n",
-			     rnc->rnc_id, osmo_sccp_addr_dump(addr), rnc->lac, rnc->rac);
-		rnc->sccp_addr = *addr;
-		return rnc;
-	}
-
-	/* Not found, make a new one. */
-	return iu_rnc_alloc(rnc_id, lac, rac, addr);
-}
-
-/***********************************************************************
- * RANAP handling
- ***********************************************************************/
-
-int iu_rab_act(struct ue_conn_ctx *ue_ctx, struct msgb *msg)
-{
-	struct osmo_scu_prim *prim;
-
-	/* wrap RANAP message in SCCP N-DATA.req */
-	prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
-	prim->u.data.conn_id = ue_ctx->conn_id;
-	osmo_prim_init(&prim->oph,
-		       SCCP_SAP_USER,
-		       OSMO_SCU_PRIM_N_DATA,
-		       PRIM_OP_REQUEST,
-		       msg);
-	return osmo_sccp_user_sap_down(g_scu, &prim->oph);
-}
-
-int iu_rab_deact(struct ue_conn_ctx *ue_ctx, uint8_t rab_id)
-{
-	/* FIXME */
-	return -1;
-}
-
-int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp,
-		       int send_ck, int new_key)
-{
-	struct osmo_scu_prim *prim;
-	struct msgb *msg;
-
-	/* create RANAP message */
-	msg = ranap_new_msg_sec_mod_cmd(tp->vec.ik, send_ck? tp->vec.ck : NULL,
-			new_key ? RANAP_KeyStatus_new : RANAP_KeyStatus_old);
-	msg->l2h = msg->data;
-	/* wrap RANAP message in SCCP N-DATA.req */
-	prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
-	prim->u.data.conn_id = uectx->conn_id;
-	osmo_prim_init(&prim->oph, SCCP_SAP_USER,
-			OSMO_SCU_PRIM_N_DATA,
-			PRIM_OP_REQUEST, msg);
-	osmo_sccp_user_sap_down(g_scu, &prim->oph);
-
-	return 0;
-}
-
-int iu_tx_common_id(struct ue_conn_ctx *uectx, const char *imsi)
-{
-	struct msgb *msg;
-	struct osmo_scu_prim *prim;
-
-	LOGP(DRANAP, LOGL_INFO, "Transmitting RANAP CommonID (SCCP conn_id %u)\n",
-	     uectx->conn_id);
-
-	msg = ranap_new_msg_common_id(imsi);
-	msg->l2h = msg->data;
-	prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
-	prim->u.data.conn_id = uectx->conn_id;
-	osmo_prim_init(&prim->oph, SCCP_SAP_USER,
-			OSMO_SCU_PRIM_N_DATA,
-			PRIM_OP_REQUEST, msg);
-	osmo_sccp_user_sap_down(g_scu, &prim->oph);
-	return 0;
-}
-
-static int iu_grnc_id_parse(struct iu_grnc_id *dst,
-			    struct RANAP_GlobalRNC_ID *src)
-{
-	/* The size is coming from arbitrary sender, check it gracefully */
-	if (src->pLMNidentity.size != 3) {
-		LOGP(DRANAP, LOGL_ERROR, "Invalid PLMN Identity size:"
-		     " should be 3, is %d\n", src->pLMNidentity.size);
-		return -1;
-	}
-	gsm48_mcc_mnc_from_bcd(&src->pLMNidentity.buf[0],
-			       &dst->mcc, &dst->mnc);
-	dst->rnc_id = (uint16_t)src->rNC_ID;
-	return 0;
-}
-
-#if 0
- -- not used at present --
-static int iu_grnc_id_compose(struct iu_grnc_id *src,
-			      struct RANAP_GlobalRNC_ID *dst)
-{
-	/* The caller must ensure proper size */
-	OSMO_ASSERT(dst->pLMNidentity.size == 3);
-	gsm48_mcc_mnc_to_bcd(&dst->pLMNidentity.buf[0],
-			     src->mcc, src->mnc);
-	dst->rNC_ID = src->rnc_id;
-	return 0;
-}
-#endif
-
-static int ranap_handle_co_initial_ue(void *ctx, RANAP_InitialUE_MessageIEs_t *ies)
-{
-	struct ue_conn_ctx *ue_conn = ctx;
-	struct gprs_ra_id ra_id;
-	struct iu_grnc_id grnc_id;
-	uint16_t sai;
-	struct msgb *msg = msgb_alloc(256, "RANAP->NAS");
-
-	if (ranap_parse_lai(&ra_id, &ies->lai) != 0) {
-		LOGP(DRANAP, LOGL_ERROR, "Failed to parse RANAP LAI IE\n");
-		return -1;
-	}
-
-	if (ies->presenceMask & INITIALUE_MESSAGEIES_RANAP_RAC_PRESENT) {
-		ra_id.rac = asn1str_to_u8(&ies->rac);
-	}
-
-	if (iu_grnc_id_parse(&grnc_id, &ies->globalRNC_ID) != 0) {
-		LOGP(DRANAP, LOGL_ERROR,
-		     "Failed to parse RANAP Global-RNC-ID IE\n");
-		return -1;
-	}
-
-	sai = asn1str_to_u16(&ies->sai.sAC);
-	msgb_gmmh(msg) = msgb_put(msg, ies->nas_pdu.size);
-	memcpy(msgb_gmmh(msg), ies->nas_pdu.buf, ies->nas_pdu.size);
-
-	/* Make sure we know the RNC Id and LAC+RAC coming in on this connection. */
-	iu_rnc_register(grnc_id.rnc_id, ra_id.lac, ra_id.rac, &ue_conn->sccp_addr);
-	ue_conn->ra_id = ra_id;
-
-	/* Feed into the MM layer */
-	msg->dst = ctx;
-	global_iu_recv_cb(msg, &ra_id, &sai);
-
-	msgb_free(msg);
-
-	return 0;
-}
-
-static int ranap_handle_co_dt(void *ctx, RANAP_DirectTransferIEs_t *ies)
-{
-	struct gprs_ra_id _ra_id, *ra_id = NULL;
-	uint16_t _sai, *sai = NULL;
-	struct msgb *msg = msgb_alloc(256, "RANAP->NAS");
-
-	if (ies->presenceMask & DIRECTTRANSFERIES_RANAP_LAI_PRESENT) {
-		if (ranap_parse_lai(&_ra_id, &ies->lai) != 0) {
-			LOGP(DRANAP, LOGL_ERROR, "Failed to parse RANAP LAI IE\n");
-			return -1;
-		}
-		ra_id = &_ra_id;
-		if (ies->presenceMask & DIRECTTRANSFERIES_RANAP_RAC_PRESENT) {
-			_ra_id.rac = asn1str_to_u8(&ies->rac);
-		}
-		if (ies->presenceMask & DIRECTTRANSFERIES_RANAP_SAI_PRESENT) {
-			_sai = asn1str_to_u16(&ies->sai.sAC);
-			sai = &_sai;
-		}
-	}
-
-	msgb_gmmh(msg) = msgb_put(msg, ies->nas_pdu.size);
-	memcpy(msgb_gmmh(msg), ies->nas_pdu.buf, ies->nas_pdu.size);
-
-	/* Feed into the MM/CC/SMS-CP layer */
-	msg->dst = ctx;
-	global_iu_recv_cb(msg, ra_id, sai);
-
-	msgb_free(msg);
-
-	return 0;
-}
-
-static int ranap_handle_co_err_ind(void *ctx, RANAP_ErrorIndicationIEs_t *ies)
-{
-	if (ies->presenceMask & ERRORINDICATIONIES_RANAP_CAUSE_PRESENT)
-		LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication (%s)\n",
-			ranap_cause_str(&ies->cause));
-	else
-		LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication\n");
-
-	return 0;
-}
-
-int iu_tx(struct msgb *msg_nas, uint8_t sapi)
-{
-	struct ue_conn_ctx *uectx = msg_nas->dst;
-	struct msgb *msg;
-	struct osmo_scu_prim *prim;
-
-	LOGP(DRANAP, LOGL_INFO, "Transmitting L3 Message as RANAP DT (SCCP conn_id %u)\n",
-	     uectx->conn_id);
-
-	msg = ranap_new_msg_dt(sapi, msg_nas->data, msgb_length(msg_nas));
-	msgb_free(msg_nas);
-	msg->l2h = msg->data;
-	prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
-	prim->u.data.conn_id = uectx->conn_id;
-	osmo_prim_init(&prim->oph, SCCP_SAP_USER,
-			OSMO_SCU_PRIM_N_DATA,
-			PRIM_OP_REQUEST, msg);
-	osmo_sccp_user_sap_down(g_scu, &prim->oph);
-	return 0;
-}
-
-/* Send Iu Release for the given UE connection.
- * If cause is NULL, the standard "No remaining RAB" cause is sent, otherwise
- * the provided cause. */
-int iu_tx_release(struct ue_conn_ctx *ctx, const struct RANAP_Cause *cause)
-{
-	struct msgb *msg;
-	struct osmo_scu_prim *prim;
-	static const struct RANAP_Cause default_cause = {
-		.present = RANAP_Cause_PR_radioNetwork,
-		.choice.radioNetwork = RANAP_CauseRadioNetwork_no_remaining_rab,
-	};
-
-	if (!cause)
-		cause = &default_cause;
-
-	LOGP(DRANAP, LOGL_INFO, "Transmitting Iu Release (SCCP conn_id %u)\n",
-	     ctx->conn_id);
-
-	msg = ranap_new_msg_iu_rel_cmd(cause);
-	msg->l2h = msg->data;
-	prim = (struct osmo_scu_prim *) msgb_push(msg, sizeof(*prim));
-	prim->u.data.conn_id = ctx->conn_id;
-	osmo_prim_init(&prim->oph, SCCP_SAP_USER,
-			OSMO_SCU_PRIM_N_DATA,
-			PRIM_OP_REQUEST, msg);
-	return osmo_sccp_user_sap_down(g_scu, &prim->oph);
-}
-
-static int ranap_handle_co_iu_rel_req(struct ue_conn_ctx *ctx, RANAP_Iu_ReleaseRequestIEs_t *ies)
-{
-	LOGP(DRANAP, LOGL_INFO, "Received Iu Release Request, Sending Release Command\n");
-	iu_tx_release(ctx, &ies->cause);
-	return 0;
-}
-
-static int ranap_handle_co_rab_ass_resp(struct ue_conn_ctx *ctx, RANAP_RAB_AssignmentResponseIEs_t *ies)
-{
-	int rc = -1;
-
-	LOGP(DRANAP, LOGL_INFO,
-	     "Rx RAB Assignment Response for UE conn_id %u\n", ctx->conn_id);
-	if (ies->presenceMask & RAB_ASSIGNMENTRESPONSEIES_RANAP_RAB_SETUPORMODIFIEDLIST_PRESENT) {
-		/* TODO: Iterate over list of SetupOrModifiedList IEs and handle each one */
-		RANAP_IE_t *ranap_ie = ies->raB_SetupOrModifiedList.raB_SetupOrModifiedList_ies.list.array[0];
-		RANAP_RAB_SetupOrModifiedItemIEs_t setup_ies;
-
-		rc = ranap_decode_rab_setupormodifieditemies_fromlist(&setup_ies, &ranap_ie->value);
-		if (rc) {
-			LOGP(DRANAP, LOGL_ERROR, "Error in ranap_decode_rab_setupormodifieditemies()\n");
-			return rc;
-		}
-
-		rc = global_iu_event_cb(ctx, IU_EVENT_RAB_ASSIGN, &setup_ies);
-
-		ranap_free_rab_setupormodifieditemies(&setup_ies);
-	}
-	/* FIXME: handle RAB Ass failure? */
-
-	return rc;
-}
-
-/* Entry point for connection-oriented RANAP message */
-static void cn_ranap_handle_co(void *ctx, ranap_message *message)
-{
-	int rc;
-
-	LOGP(DRANAP, LOGL_NOTICE, "handle_co(dir=%u, proc=%u)\n", message->direction, message->procedureCode);
-
-	switch (message->direction) {
-	case RANAP_RANAP_PDU_PR_initiatingMessage:
-		switch (message->procedureCode) {
-		case RANAP_ProcedureCode_id_InitialUE_Message:
-			rc = ranap_handle_co_initial_ue(ctx, &message->msg.initialUE_MessageIEs);
-			break;
-		case RANAP_ProcedureCode_id_DirectTransfer:
-			rc = ranap_handle_co_dt(ctx, &message->msg.directTransferIEs);
-			break;
-		case RANAP_ProcedureCode_id_ErrorIndication:
-			rc = ranap_handle_co_err_ind(ctx, &message->msg.errorIndicationIEs);
-			break;
-		case RANAP_ProcedureCode_id_Iu_ReleaseRequest:
-			/* Iu Release Request */
-			rc = ranap_handle_co_iu_rel_req(ctx, &message->msg.iu_ReleaseRequestIEs);
-			break;
-		default:
-			LOGP(DRANAP, LOGL_ERROR, "Received Initiating Message: unknown Procedure Code %d\n",
-			     message->procedureCode);
-			rc = -1;
-			break;
-		}
-		break;
-	case RANAP_RANAP_PDU_PR_successfulOutcome:
-		switch (message->procedureCode) {
-		case RANAP_ProcedureCode_id_SecurityModeControl:
-			/* Security Mode Complete */
-			rc = global_iu_event_cb(ctx, IU_EVENT_SECURITY_MODE_COMPLETE, NULL);
-			break;
-		case RANAP_ProcedureCode_id_Iu_Release:
-			/* Iu Release Complete */
-			rc = global_iu_event_cb(ctx, IU_EVENT_IU_RELEASE, NULL);
-			if (rc) {
-				LOGP(DRANAP, LOGL_ERROR, "Iu Release event: Iu Event callback returned %d\n",
-				     rc);
-			}
-			break;
-		default:
-			LOGP(DRANAP, LOGL_ERROR, "Received Successful Outcome: unknown Procedure Code %d\n",
-			     message->procedureCode);
-			rc = -1;
-			break;
-		}
-		break;
-	case RANAP_RANAP_PDU_PR_outcome:
-		switch (message->procedureCode) {
-		case RANAP_ProcedureCode_id_RAB_Assignment:
-			/* RAB Assignment Response */
-			rc = ranap_handle_co_rab_ass_resp(ctx, &message->msg.raB_AssignmentResponseIEs);
-			break;
-		default:
-			LOGP(DRANAP, LOGL_ERROR, "Received Outcome: unknown Procedure Code %d\n",
-			     message->procedureCode);
-			rc = -1;
-			break;
-		}
-		break;
-	case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:
-	default:
-		LOGP(DRANAP, LOGL_ERROR, "Received Unsuccessful Outcome: Procedure Code %d\n",
-		     message->procedureCode);
-		rc = -1;
-		break;
-	}
-
-	if (rc) {
-		LOGP(DRANAP, LOGL_ERROR, "Error in cn_ranap_handle_co (%d)\n",
-		     rc);
-		/* TODO handling of the error? */
-	}
-}
-
-static int ranap_handle_cl_reset_req(void *ctx, RANAP_ResetIEs_t *ies)
-{
-	/* FIXME: send reset response */
-	return -1;
-}
-
-static int ranap_handle_cl_err_ind(void *ctx, RANAP_ErrorIndicationIEs_t *ies)
-{
-	if (ies->presenceMask & ERRORINDICATIONIES_RANAP_CAUSE_PRESENT)
-		LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication (%s)\n",
-			ranap_cause_str(&ies->cause));
-	else
-		LOGP(DRANAP, LOGL_ERROR, "Rx Error Indication\n");
-
-	return 0;
-}
-
-/* Entry point for connection-less RANAP message */
-static void cn_ranap_handle_cl(void *ctx, ranap_message *message)
-{
-	int rc;
-
-	switch (message->direction) {
-	case RANAP_RANAP_PDU_PR_initiatingMessage:
-		switch (message->procedureCode) {
-		case RANAP_ProcedureCode_id_Reset:
-			/* received reset.req, send reset.resp */
-			rc = ranap_handle_cl_reset_req(ctx, &message->msg.resetIEs);
-			break;
-		case RANAP_ProcedureCode_id_ErrorIndication:
-			rc = ranap_handle_cl_err_ind(ctx, &message->msg.errorIndicationIEs);
-			break;
-		default:
-			rc = -1;
-			break;
-		}
-		break;
-	case RANAP_RANAP_PDU_PR_successfulOutcome:
-	case RANAP_RANAP_PDU_PR_unsuccessfulOutcome:
-	case RANAP_RANAP_PDU_PR_outcome:
-	default:
-		rc = -1;
-		break;
-	}
-
-	if (rc) {
-		LOGP(DRANAP, LOGL_ERROR, "Error in cn_ranap_handle_cl (%d)\n",
-		     rc);
-		/* TODO handling of the error? */
-	}
-}
-
-/***********************************************************************
- * Paging
- ***********************************************************************/
-
-struct osmo_sccp_addr local_sccp_addr = {
-	.presence = OSMO_SCCP_ADDR_T_SSN | OSMO_SCCP_ADDR_T_PC,
-	.ri = OSMO_SCCP_RI_SSN_PC,
-	.ssn = OSMO_SCCP_SSN_RANAP,
-	.pc = 1,
-};
-
-/* Send a paging command down a given SCCP User. tmsi and paging_cause are
- * optional and may be passed NULL and 0, respectively, to disable their use.
- * See enum RANAP_PagingCause.
- *
- * If TMSI is given, the IMSI is not sent over the air interface. Nevertheless,
- * the IMSI is still required for resolution in the HNB-GW and/or(?) RNC. */
-static int iu_tx_paging_cmd(struct osmo_sccp_addr *called_addr,
-			    const char *imsi, const uint32_t *tmsi,
-			    bool is_ps, uint32_t paging_cause)
-{
-	struct msgb *msg;
-	msg = ranap_new_msg_paging_cmd(imsi, tmsi, is_ps? 1 : 0, paging_cause);
-	msg->l2h = msg->data;
-	osmo_sccp_tx_unitdata_msg(g_scu, &local_sccp_addr, called_addr, msg);
-	return 0;
-}
-
-static int iu_page(const char *imsi, const uint32_t *tmsi_or_ptimsi,
-		   uint16_t lac, uint8_t rac, bool is_ps)
-{
-	struct iu_rnc *rnc;
-	int pagings_sent = 0;
-
-	if (tmsi_or_ptimsi) {
-		LOGP(DRANAP, LOGL_DEBUG, "%s: Looking for RNCs to page for IMSI %s"
-		     " (paging will use %s %x)\n",
-		     is_ps? "IuPS" : "IuCS",
-		     imsi,
-		     is_ps? "PTMSI" : "TMSI",
-		     *tmsi_or_ptimsi);
-	} else {
-		LOGP(DRANAP, LOGL_DEBUG, "%s: Looking for RNCs to page for IMSI %s"
-		     " (paging will use IMSI)\n",
-		     is_ps? "IuPS" : "IuCS",
-		     imsi
-		    );
-	}
-
-	llist_for_each_entry(rnc, &rnc_list, entry) {
-		if (rnc->lac != lac)
-			continue;
-		if (is_ps && rnc->rac != rac)
-			continue;
-
-		/* Found a match! */
-		if (iu_tx_paging_cmd(&rnc->sccp_addr, imsi, tmsi_or_ptimsi, is_ps, 0)
-		    == 0) {
-			LOGP(DRANAP, LOGL_DEBUG,
-			     "%s: Paged for IMSI %s on RNC %d, on SCCP addr %s\n",
-			     is_ps? "IuPS" : "IuCS",
-			     imsi, rnc->rnc_id, osmo_sccp_addr_dump(&rnc->sccp_addr));
-			pagings_sent ++;
-		}
-	}
-
-	/* Some logging... */
-	if (pagings_sent > 0) {
-		LOGP(DRANAP, LOGL_DEBUG,
-		     "%s: %d RNCs were paged for IMSI %s.\n",
-		     is_ps? "IuPS" : "IuCS",
-		     pagings_sent, imsi);
-	}
-	else {
-		if (is_ps) {
-			LOGP(DRANAP, LOGL_ERROR, "IuPS: Found no RNC to page for"
-			     " LAC %d RAC %d (would have paged IMSI %s)\n",
-			     lac, rac, imsi);
-		}
-		else {
-			LOGP(DRANAP, LOGL_ERROR, "IuCS: Found no RNC to page for"
-			     " LAC %d (would have paged IMSI %s)\n",
-			     lac, imsi);
-		}
-	}
-
-	return pagings_sent;
-}
-
-int iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac)
-{
-	return iu_page(imsi, tmsi, lac, 0, false);
-}
-
-int iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac)
-{
-	return iu_page(imsi, ptmsi, lac, rac, true);
-}
-
-
-/***********************************************************************
- *
- ***********************************************************************/
-
-int tx_unitdata(struct osmo_sccp_user *scu);
-int tx_conn_req(struct osmo_sccp_user *scu, uint32_t conn_id);
-
-struct osmo_prim_hdr *make_conn_req(uint32_t conn_id);
-struct osmo_prim_hdr *make_dt1_req(uint32_t conn_id, const uint8_t *data, unsigned int len);
-
-struct osmo_prim_hdr *make_conn_resp(struct osmo_scu_connect_param *param)
-{
-	struct msgb *msg = msgb_alloc(1024, "conn_resp");
-	struct osmo_scu_prim *prim;
-
-	prim = (struct osmo_scu_prim *) msgb_put(msg, sizeof(*prim));
-	osmo_prim_init(&prim->oph, SCCP_SAP_USER,
-			OSMO_SCU_PRIM_N_CONNECT,
-			PRIM_OP_RESPONSE, msg);
-	memcpy(&prim->u.connect, param, sizeof(prim->u.connect));
-	return &prim->oph;
-}
-
-static int sccp_sap_up(struct osmo_prim_hdr *oph, void *_scu)
-{
-	struct osmo_sccp_user *scu = _scu;
-	struct osmo_scu_prim *prim = (struct osmo_scu_prim *) oph;
-	struct osmo_prim_hdr *resp = NULL;
-	int rc;
-	struct ue_conn_ctx *ue;
-
-	DEBUGP(DRANAP, "sccp_sap_up(%s)\n", osmo_scu_prim_name(oph));
-
-	switch (OSMO_PRIM_HDR(oph)) {
-	case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_CONFIRM):
-		/* confirmation of outbound connection */
-		rc = -1;
-		break;
-	case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_INDICATION):
-		/* indication of new inbound connection request*/
-		DEBUGP(DRANAP, "N-CONNECT.ind(X->%u)\n", prim->u.connect.conn_id);
-		if (/*  prim->u.connect.called_addr.ssn != OSMO_SCCP_SSN_RANAP || */
-		    !msgb_l2(oph->msg) || msgb_l2len(oph->msg) == 0) {
-			LOGP(DRANAP, LOGL_NOTICE,
-			     "Received invalid N-CONNECT.ind\n");
-			return 0;
-		}
-		ue = ue_conn_ctx_alloc(&prim->u.connect.calling_addr, prim->u.connect.conn_id);
-		/* first ensure the local SCCP socket is ACTIVE */
-		resp = make_conn_resp(&prim->u.connect);
-		osmo_sccp_user_sap_down(scu, resp);
-		/* then handle the RANAP payload */
-		rc = ranap_cn_rx_co(cn_ranap_handle_co, ue, msgb_l2(oph->msg), msgb_l2len(oph->msg));
-		break;
-	case OSMO_PRIM(OSMO_SCU_PRIM_N_DISCONNECT, PRIM_OP_INDICATION):
-		/* indication of disconnect */
-		DEBUGP(DRANAP, "N-DISCONNECT.ind(%u)\n",
-		       prim->u.disconnect.conn_id);
-		ue = ue_conn_ctx_find(prim->u.disconnect.conn_id);
-		rc = ranap_cn_rx_co(cn_ranap_handle_co, ue, msgb_l2(oph->msg), msgb_l2len(oph->msg));
-		break;
-	case OSMO_PRIM(OSMO_SCU_PRIM_N_DATA, PRIM_OP_INDICATION):
-		/* connection-oriented data received */
-		DEBUGP(DRANAP, "N-DATA.ind(%u, %s)\n", prim->u.data.conn_id,
-		       osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));
-		/* resolve UE context */
-		ue = ue_conn_ctx_find(prim->u.data.conn_id);
-		rc = ranap_cn_rx_co(cn_ranap_handle_co, ue, msgb_l2(oph->msg), msgb_l2len(oph->msg));
-		break;
-	case OSMO_PRIM(OSMO_SCU_PRIM_N_UNITDATA, PRIM_OP_INDICATION):
-		/* connection-less data received */
-		DEBUGP(DRANAP, "N-UNITDATA.ind(%s)\n",
-		       osmo_hexdump(msgb_l2(oph->msg), msgb_l2len(oph->msg)));
-		rc = ranap_cn_rx_cl(cn_ranap_handle_cl, scu, msgb_l2(oph->msg), msgb_l2len(oph->msg));
-		break;
-	default:
-		rc = -1;
-		break;
-	}
-
-	msgb_free(oph->msg);
-	return rc;
-}
-
-int iu_init(void *ctx, struct osmo_sccp_instance *sccp,
-	    iu_recv_cb_t iu_recv_cb, iu_event_cb_t iu_event_cb)
-{
-	talloc_iu_ctx = talloc_named_const(ctx, 1, "iu");
-	talloc_asn1_ctx = talloc_named_const(talloc_iu_ctx, 1, "asn1");
-
-	global_iu_recv_cb = iu_recv_cb;
-	global_iu_event_cb = iu_event_cb;
-	g_sccp = sccp;
-	g_scu = osmo_sccp_user_bind(g_sccp, "OsmoMSC-Iu", sccp_sap_up, OSMO_SCCP_SSN_RANAP);
-
-	return 0;
-}
-
diff --git a/src/libiu/iu_vty.c b/src/libiu/iu_vty.c
deleted file mode 100644
index 3fd3cd1..0000000
--- a/src/libiu/iu_vty.c
+++ /dev/null
@@ -1,133 +0,0 @@
-/* OpenBSC Iu related interface to quagga VTY */
-/* (C) 2016 by sysmocom s.m.f.c. GmbH <info@sysmocom.de>
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <stdlib.h>
-#include <string.h>
-
-#include <osmocom/core/logging.h>
-#include <osmocom/vty/command.h>
-#include <osmocom/vty/logging.h>
-#include <osmocom/sigtran/osmo_ss7.h>
-#include <osmocom/sigtran/sccp_sap.h>
-
-#include <openbsc/iu.h>
-
-static enum nsap_addr_enc *g_rab_assign_addr_enc = NULL;
-
-DEFUN(logging_asn_debug,
-      logging_asn_debug_cmd,
-      "logging asn1-debug (1|0)",
-      LOGGING_STR
-      "Log ASN.1 debug messages to stderr\n"
-      "Log ASN.1 debug messages to stderr\n"
-      "Do not log ASN.1 debug messages to stderr\n")
-{
-	asn_debug = atoi(argv[0]);
-	return CMD_SUCCESS;
-}
-
-DEFUN(logging_asn_xer_print,
-      logging_asn_xer_print_cmd,
-      "logging asn1-xer-print (1|0)",
-      LOGGING_STR
-      "Log human readable representations of all ASN.1 messages to stderr\n"
-      "Log decoded ASN.1 messages to stderr\n"
-      "Do not log decoded ASN.1 messages to stderr\n")
-{
-	asn1_xer_print = atoi(argv[0]);
-	return CMD_SUCCESS;
-}
-
-#define IU_STR "Iu interface protocol options\n"
-DEFUN(cfg_iu_rab_assign_addr_enc, cfg_iu_rab_assign_addr_enc_cmd,
-      "iu rab-assign-addr-enc (x213|v4raw)",
-      IU_STR
-      "Choose RAB Assignment's Transport Layer Address encoding\n"
-      "ITU-T X.213 compliant address encoding (default)\n"
-      "32bit length raw IPv4 address (for ip.access nano3G)\n")
-{
-	if (!g_rab_assign_addr_enc) {
-		vty_out(vty, "%%RAB Assignment Transport Layer Address"
-			" encoding not available%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	if (strcmp(argv[0], "v4raw") == 0)
-		*g_rab_assign_addr_enc = NSAP_ADDR_ENC_V4RAW;
-	else
-		*g_rab_assign_addr_enc = NSAP_ADDR_ENC_X213;
-	return CMD_SUCCESS;
-}
-
-extern struct osmo_sccp_addr local_sccp_addr;
-
-/* Note from the future: change-id Ib8c4fcdb4766c5e575618b95ce16dce51063206b will move this file to
- * osmo-iuh, and there, change-id I3bb7fc1cd5261d214c6ba0cccfe95f637e6db087 will drop this vty command
- * and use the point code defined via libosmo-sccp vty commands instead. */
-DEFUN(cfg_iu_local_addr_pc, cfg_iu_local_addr_pc_cmd,
-	"iu local-address point-code PC",
-	IU_STR "Local SCCP Address\n" "Set local point code\n" "point code\n")
-{
-	local_sccp_addr.presence = OSMO_SCCP_ADDR_T_PC | OSMO_SCCP_ADDR_T_SSN;
-	local_sccp_addr.ri = OSMO_SCCP_RI_SSN_PC;
-	local_sccp_addr.pc = osmo_ss7_pointcode_parse(NULL, argv[0]);
-
-	return CMD_SUCCESS;
-}
-
-/* TODO: GT address configuration, in line with 4.5.1.1.1 of TS 25.410 */
-
-int iu_vty_config_write(struct vty *vty, const char *indent)
-{
-	if (!g_rab_assign_addr_enc) {
-		vty_out(vty, "%%RAB Assignment Transport Layer Address"
-			" encoding not available%s", VTY_NEWLINE);
-		return CMD_WARNING;
-	}
-
-	switch (*g_rab_assign_addr_enc) {
-	case NSAP_ADDR_ENC_V4RAW:
-		vty_out(vty, "%siu rab-assign-addr-enc v4raw%s", indent,
-			VTY_NEWLINE);
-		break;
-	case NSAP_ADDR_ENC_X213:
-		/* default value, no need to write anything */
-		break;
-	default:
-		LOGP(0, LOGL_ERROR, "Invalid value for"
-		     " net.iu.rab_assign_addr_enc: %d\n",
-		     *g_rab_assign_addr_enc);
-		return CMD_WARNING;
-	}
-
-	vty_out(vty, "%siu local-address point-code %s%s", indent,
-		osmo_ss7_pointcode_print(NULL, local_sccp_addr.pc), VTY_NEWLINE);
-
-	return CMD_SUCCESS;
-}
-
-void iu_vty_init(int iu_parent_node, enum nsap_addr_enc *rab_assign_addr_enc)
-{
-	g_rab_assign_addr_enc = rab_assign_addr_enc;
-
-	install_element(CFG_LOG_NODE, &logging_asn_debug_cmd);
-	install_element(CFG_LOG_NODE, &logging_asn_xer_print_cmd);
-	install_element(iu_parent_node, &cfg_iu_rab_assign_addr_enc_cmd);
-	install_element(iu_parent_node, &cfg_iu_local_addr_pc_cmd);
-}
diff --git a/src/libmsc/Makefile.am b/src/libmsc/Makefile.am
index 9f246b3..c9b8bb4 100644
--- a/src/libmsc/Makefile.am
+++ b/src/libmsc/Makefile.am
@@ -35,8 +35,6 @@
 	gsm_04_14.c \
 	gsm_04_80.c \
 	gsm_subscriber.c \
-	iucs.c \
-	iucs_ranap.c \
 	mncc.c \
 	mncc_builtin.c \
 	mncc_sock.c \
@@ -52,7 +50,12 @@
 	meas_feed.c \
 	subscr_conn.c \
 	$(NULL)
-if !BUILD_IU
+if BUILD_IU
+libmsc_a_SOURCES += \
+	iucs.c \
+	iucs_ranap.c \
+	$(NULL)
+else
 libmsc_a_SOURCES += \
 	iu_dummy.c \
 	$(NULL)
diff --git a/src/libmsc/a_iface_bssap.c b/src/libmsc/a_iface_bssap.c
index 561ccde..e8a2293 100644
--- a/src/libmsc/a_iface_bssap.c
+++ b/src/libmsc/a_iface_bssap.c
@@ -29,7 +29,6 @@
 #include <openbsc/gsm_data.h>
 #include <openbsc/a_iface_bssap.h>
 #include <openbsc/a_iface.h>
-#include <openbsc/iu.h>
 #include <openbsc/osmo_msc.h>
 #include <osmocom/core/byteswap.h>
 #include <openbsc/a_reset.h>
diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c
index b6746a5..21bc2b8 100644
--- a/src/libmsc/gsm_04_08.c
+++ b/src/libmsc/gsm_04_08.c
@@ -72,13 +72,11 @@
 #include <osmocom/core/utils.h>
 #include <osmocom/gsm/tlv.h>
 #include <osmocom/crypt/auth.h>
-
-#include <openbsc/msc_ifaces.h>
-
 #ifdef BUILD_IU
-#include <openbsc/iu.h>
+#include <osmocom/ranap/iu_client.h>
 #endif
 
+#include <openbsc/msc_ifaces.h>
 #include <openbsc/a_iface.h>
 
 #include <assert.h>
@@ -3412,7 +3410,7 @@
 #ifdef BUILD_IU
 		DEBUGP(DMM, "-> SECURITY MODE CONTROL %s\n",
 		       vlr_subscr_name(conn->vsub));
-		return iu_tx_sec_mode_cmd(conn->iu.ue_ctx, tuple, 0, 1);
+		return ranap_iu_tx_sec_mode_cmd(conn->iu.ue_ctx, &tuple->vec, 0, 1);
 #else
 		LOGP(DMM, LOGL_ERROR, "Cannot send Security Mode Control over RAN_UTRAN_IU,"
 		     " built without Iu support\n");
diff --git a/src/libmsc/gsm_subscriber.c b/src/libmsc/gsm_subscriber.c
index 73361a1..09540c1 100644
--- a/src/libmsc/gsm_subscriber.c
+++ b/src/libmsc/gsm_subscriber.c
@@ -20,6 +20,8 @@
  *
  */
 
+#include "../../bscconfig.h"
+
 #include <unistd.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -32,6 +34,12 @@
 
 #include <osmocom/vty/vty.h>
 
+#ifdef BUILD_IU
+#include <osmocom/ranap/iu_client.h>
+#else
+#include <openbsc/iu_dummy.h>
+#endif
+
 #include <openbsc/gsm_subscriber.h>
 #include <openbsc/gsm_04_08.h>
 #include <openbsc/debug.h>
@@ -40,7 +48,6 @@
 #include <openbsc/db.h>
 #include <openbsc/chan_alloc.h>
 #include <openbsc/vlr.h>
-#include <openbsc/iu.h>
 #include <openbsc/osmo_msc.h>
 #include <openbsc/msc_ifaces.h>
 #include <openbsc/a_iface.h>
@@ -108,10 +115,10 @@
 	case RAN_GERAN_A:
 		return a_iface_tx_paging(vsub->imsi, vsub->tmsi, vsub->lac);
 	case RAN_UTRAN_IU:
-		return iu_page_cs(vsub->imsi,
-				  vsub->tmsi == GSM_RESERVED_TMSI?
-				  NULL : &vsub->tmsi,
-				  vsub->lac);
+		return ranap_iu_page_cs(vsub->imsi,
+					vsub->tmsi == GSM_RESERVED_TMSI?
+					NULL : &vsub->tmsi,
+					vsub->lac);
 	default:
 		break;
 	}
diff --git a/src/libmsc/iu_dummy.c b/src/libmsc/iu_dummy.c
index 1f5dffb..e9d335e 100644
--- a/src/libmsc/iu_dummy.c
+++ b/src/libmsc/iu_dummy.c
@@ -26,39 +26,39 @@
 #include "../../bscconfig.h"
 #ifndef BUILD_IU
 
-#include <stdint.h>
-#include <stdbool.h>
+#include <openbsc/iu_dummy.h>
 
 #include <osmocom/core/logging.h>
 #include <osmocom/vty/logging.h>
 #include <osmocom/core/msgb.h>
 
 struct msgb;
-struct ue_conn_ctx;
+struct ranap_ue_conn_ctx;
 struct gsm_auth_tuple;
 struct RANAP_Cause;
+struct osmo_auth_vector;
 
-int iu_tx(struct msgb *msg, uint8_t sapi)
+int ranap_iu_tx(struct msgb *msg, uint8_t sapi)
 {
 	LOGP(DLGLOBAL, LOGL_INFO, "iu_tx() dummy called, NOT transmitting %d bytes: %s\n",
 	     msg->len, osmo_hexdump(msg->data, msg->len));
 	return 0;
 }
 
-int iu_tx_sec_mode_cmd(struct ue_conn_ctx *uectx, struct gsm_auth_tuple *tp,
-		       int send_ck)
+int ranap_iu_tx_sec_mode_cmd(struct ranap_ue_conn_ctx *uectx, struct osmo_auth_vector *vec,
+			     int send_ck)
 {
 	LOGP(DLGLOBAL, LOGL_INFO, "iu_tx_sec_mode_cmd() dummy called, NOT transmitting Security Mode Command\n");
 	return 0;
 }
 
-int iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac)
+int ranap_iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac)
 {
 	LOGP(DLGLOBAL, LOGL_INFO, "iu_page_cs() dummy called, NOT paging\n");
 	return 23;
 }
 
-int iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac)
+int ranap_iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, uint8_t rac)
 {
 	LOGP(DLGLOBAL, LOGL_INFO, "iu_page_ps() dummy called, NOT paging\n");
 	return 0;
@@ -72,19 +72,19 @@
 	return NULL;
 }
 
-int iu_rab_act(struct ue_conn_ctx *ue_ctx, struct msgb *msg)
+int ranap_iu_rab_act(struct ranap_ue_conn_ctx *ue_ctx, struct msgb *msg)
 {
 	LOGP(DLGLOBAL, LOGL_INFO, "iu_rab_act() dummy called, NOT activating RAB\n");
 	return 0;
 }
 
-int iu_tx_common_id(struct ue_conn_ctx *uectx, const char *imsi)
+int ranap_iu_tx_common_id(struct ranap_ue_conn_ctx *uectx, const char *imsi)
 {
 	LOGP(DLGLOBAL, LOGL_INFO, "iu_tx_common_id() dummy called, NOT sending CommonID\n");
 	return 0;
 }
 
-int iu_tx_release(struct ue_conn_ctx *ctx, const struct RANAP_Cause *cause)
+int ranap_iu_tx_release(struct ranap_ue_conn_ctx *ctx, const struct RANAP_Cause *cause)
 {
 	LOGP(DLGLOBAL, LOGL_INFO, "iu_tx_release() dummy called, NOT sending Release\n");
 	return 0;
diff --git a/src/libmsc/iucs.c b/src/libmsc/iucs.c
index be026c8..04b9ece 100644
--- a/src/libmsc/iucs.c
+++ b/src/libmsc/iucs.c
@@ -25,17 +25,17 @@
 #include <inttypes.h>
 
 #include <osmocom/core/logging.h>
+#include <osmocom/ranap/iu_client.h>
 #include <openbsc/debug.h>
 
 #include <openbsc/gsm_data.h>
-#include <openbsc/iu.h>
 #include <openbsc/gsm_subscriber.h>
 #include <openbsc/osmo_msc.h>
 #include <openbsc/vlr.h>
 
 /* For A-interface see libbsc/bsc_api.c subscr_con_allocate() */
 static struct gsm_subscriber_connection *subscr_conn_allocate_iu(struct gsm_network *network,
-								 struct ue_conn_ctx *ue,
+								 struct ranap_ue_conn_ctx *ue,
 								 uint16_t lac)
 {
 	struct gsm_subscriber_connection *conn;
@@ -57,7 +57,7 @@
 	return conn;
 }
 
-static int same_ue_conn(struct ue_conn_ctx *a, struct ue_conn_ctx *b)
+static int same_ue_conn(struct ranap_ue_conn_ctx *a, struct ranap_ue_conn_ctx *b)
 {
 	if (a == b)
 		return 1;
@@ -103,7 +103,7 @@
  * connection IDs, or return NULL if not found. */
 struct gsm_subscriber_connection *subscr_conn_lookup_iu(
 						struct gsm_network *network,
-						struct ue_conn_ctx *ue)
+						struct ranap_ue_conn_ctx *ue)
 {
 	struct gsm_subscriber_connection *conn;
 
@@ -126,7 +126,7 @@
 }
 
 /* Receive MM/CC/... message from IuCS (SCCP user SAP).
- * msg->dst must reference a struct ue_conn_ctx, which identifies the peer that
+ * msg->dst must reference a struct ranap_ue_conn_ctx, which identifies the peer that
  * sent the msg.
  *
  * For A-interface see libbsc/bsc_api.c gsm0408_rcvmsg(). */
@@ -134,10 +134,10 @@
 			uint16_t *lac)
 {
 	int rc;
-	struct ue_conn_ctx *ue_ctx;
+	struct ranap_ue_conn_ctx *ue_ctx;
 	struct gsm_subscriber_connection *conn;
 
-	ue_ctx = (struct ue_conn_ctx*)msg->dst;
+	ue_ctx = (struct ranap_ue_conn_ctx*)msg->dst;
 
 	/* TODO: are there message types that could allow us to skip this
 	 * search? */
diff --git a/src/libmsc/iucs_ranap.c b/src/libmsc/iucs_ranap.c
index c016474..45de1ca 100644
--- a/src/libmsc/iucs_ranap.c
+++ b/src/libmsc/iucs_ranap.c
@@ -27,11 +27,11 @@
 #include <osmocom/core/logging.h>
 
 #include <osmocom/ranap/ranap_ies_defs.h>
+#include <osmocom/ranap/iu_client.h>
 
 #include <openbsc/debug.h>
 #include <openbsc/gsm_data.h>
 #include <openbsc/gsm_subscriber.h>
-#include <openbsc/iu.h>
 #include <openbsc/iucs.h>
 #include <openbsc/vlr.h>
 #include <openbsc/iucs_ranap.h>
@@ -67,7 +67,7 @@
 }
 
 int iucs_rx_ranap_event(struct gsm_network *network,
-			struct ue_conn_ctx *ue_ctx, int type, void *data)
+			struct ranap_ue_conn_ctx *ue_ctx, int type, void *data)
 {
 	struct gsm_subscriber_connection *conn;
 
@@ -79,19 +79,19 @@
 	}
 
 	switch (type) {
-	case IU_EVENT_IU_RELEASE:
-	case IU_EVENT_LINK_INVALIDATED:
+	case RANAP_IU_EVENT_IU_RELEASE:
+	case RANAP_IU_EVENT_LINK_INVALIDATED:
 		LOGP(DIUCS, LOGL_INFO, "IuCS release for %s\n",
 		     vlr_subscr_name(conn->vsub));
 		msc_subscr_conn_close(conn, 0);
 		return 0;
 
-	case IU_EVENT_SECURITY_MODE_COMPLETE:
+	case RANAP_IU_EVENT_SECURITY_MODE_COMPLETE:
 		LOGP(DIUCS, LOGL_INFO, "IuCS security mode complete for %s\n",
 		     vlr_subscr_name(conn->vsub));
 		return iucs_rx_sec_mode_compl(conn,
 					      (RANAP_SecurityModeCompleteIEs_t*)data);
-	case IU_EVENT_RAB_ASSIGN:
+	case RANAP_IU_EVENT_RAB_ASSIGN:
 		return iucs_rx_rab_assign(conn,
 				(RANAP_RAB_SetupOrModifiedItemIEs_t*)data);
 	default:
diff --git a/src/libmsc/msc_ifaces.c b/src/libmsc/msc_ifaces.c
index 7d2e898..262bf98 100644
--- a/src/libmsc/msc_ifaces.c
+++ b/src/libmsc/msc_ifaces.c
@@ -23,7 +23,6 @@
 #include <openbsc/debug.h>
 #include <openbsc/gsm_data.h>
 #include <openbsc/msc_ifaces.h>
-#include <openbsc/iu.h>
 #include <openbsc/gsm_subscriber.h>
 #include <openbsc/transaction.h>
 #include <openbsc/mgcp.h>
@@ -34,10 +33,13 @@
 #include "../../bscconfig.h"
 
 #ifdef BUILD_IU
+#include <osmocom/ranap/iu_client.h>
 extern struct msgb *ranap_new_msg_rab_assign_voice(uint8_t rab_id,
 						   uint32_t rtp_ip,
 						   uint16_t rtp_port,
 						   bool use_x213_nsap);
+#else
+#include <openbsc/iu_dummy.h>
 #endif /* BUILD_IU */
 
 static int msc_tx(struct gsm_subscriber_connection *conn, struct msgb *msg)
@@ -57,7 +59,7 @@
 
 	case RAN_UTRAN_IU:
 		msg->dst = conn->iu.ue_ctx;
-		return iu_tx(msg, 0);
+		return ranap_iu_tx(msg, 0);
 
 	default:
 		LOGP(DMSC, LOGL_ERROR,
@@ -134,10 +136,10 @@
 
 	DEBUGP(DIUCS, "%s: tx CommonID %s\n",
 	       vlr_subscr_name(conn->vsub), conn->vsub->imsi);
-	return iu_tx_common_id(conn->iu.ue_ctx, conn->vsub->imsi);
+	return ranap_iu_tx_common_id(conn->iu.ue_ctx, conn->vsub->imsi);
 }
 
-static int iu_rab_act_cs(struct ue_conn_ctx *uectx, uint8_t rab_id,
+static int iu_rab_act_cs(struct ranap_ue_conn_ctx *uectx, uint8_t rab_id,
 			 uint32_t rtp_ip, uint16_t rtp_port)
 {
 #ifdef BUILD_IU
@@ -145,7 +147,7 @@
 	bool use_x213_nsap;
 	uint32_t conn_id = uectx->conn_id;
 
-	use_x213_nsap = (uectx->rab_assign_addr_enc == NSAP_ADDR_ENC_X213);
+	use_x213_nsap = (uectx->rab_assign_addr_enc == RANAP_NSAP_ADDR_ENC_X213);
 
 	LOGP(DIUCS, LOGL_DEBUG, "Assigning RAB: conn_id=%u, rab_id=%d,"
 	     " rtp=%x:%u, use_x213_nsap=%d\n", conn_id, rab_id, rtp_ip,
@@ -155,7 +157,7 @@
 					     use_x213_nsap);
 	msg->l2h = msg->data;
 
-	if (iu_rab_act(uectx, msg))
+	if (ranap_iu_rab_act(uectx, msg))
 		LOGP(DIUCS, LOGL_ERROR, "Failed to send RAB Assignment:"
 		     " conn_id=%d rab_id=%d rtp=%x:%u\n",
 		     conn_id, rab_id, rtp_ip, rtp_port);
@@ -170,7 +172,6 @@
 {
 	struct gsm_trans *trans = priv;
 	struct gsm_subscriber_connection *conn = trans->conn;
-	struct ue_conn_ctx *uectx = conn->iu.ue_ctx;
 	uint32_t rtp_ip;
 	int rc;
 
@@ -195,7 +196,7 @@
 
 	if (trans->conn->via_ran == RAN_UTRAN_IU) {
 		/* Assign a voice channel via RANAP on 3G */
-		if (iu_rab_act_cs(uectx, conn->iu.rab_id, rtp_ip, conn->rtp.port_subscr))
+		if (iu_rab_act_cs(conn->iu.ue_ctx, conn->iu.rab_id, rtp_ip, conn->rtp.port_subscr))
 			goto rab_act_cs_error;
 	} else if (trans->conn->via_ran == RAN_GERAN_A) {
 		/* Assign a voice channel via A on 2G */
@@ -234,7 +235,7 @@
 	mgcp = conn->network->mgcpgw.client;
 
 #ifdef BUILD_IU
-	/* FIXME: HACK. where to scope the RAB Id? At the conn / subscriber / ue_conn_ctx? */
+	/* FIXME: HACK. where to scope the RAB Id? At the conn / subscriber / ranap_ue_conn_ctx? */
 	static uint8_t next_iu_rab_id = 1;
 	if (conn->via_ran == RAN_UTRAN_IU)
 		conn->iu.rab_id = next_iu_rab_id ++;
diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c
index 01e7e82..6ae4529 100644
--- a/src/libmsc/msc_vty.c
+++ b/src/libmsc/msc_vty.c
@@ -23,15 +23,19 @@
 /* NOTE: I would have liked to call this the MSC_NODE instead of the MSC_NODE,
  * but MSC_NODE already exists to configure a remote MSC for osmo-bsc. */
 
+#include "../../bscconfig.h"
+
 #include <inttypes.h>
 
 #include <osmocom/vty/command.h>
+#ifdef BUILD_IU
+#include <osmocom/ranap/iu_client.h>
+#endif
 
 #include <openbsc/vty.h>
 #include <openbsc/gsm_data.h>
 #include <openbsc/gsm_subscriber.h>
 #include <openbsc/vlr.h>
-#include <openbsc/iu.h>
 
 static struct cmd_node msc_node = {
 	MSC_NODE,
@@ -99,7 +103,7 @@
 
 	mgcpgw_client_config_write(vty, " ");
 #ifdef BUILD_IU
-	iu_vty_config_write(vty, " ");
+	ranap_iu_vty_config_write(vty, " ");
 #endif
 
 	return CMD_SUCCESS;
@@ -153,6 +157,6 @@
 
 	mgcpgw_client_vty_init(MSC_NODE, &msc_network->mgcpgw.conf);
 #ifdef BUILD_IU
-	iu_vty_init(MSC_NODE, &msc_network->iu.rab_assign_addr_enc);
+	ranap_iu_vty_init(MSC_NODE, &msc_network->iu.rab_assign_addr_enc);
 #endif
 }
diff --git a/src/libmsc/osmo_msc.c b/src/libmsc/osmo_msc.c
index 866cfbd..4d24f22 100644
--- a/src/libmsc/osmo_msc.c
+++ b/src/libmsc/osmo_msc.c
@@ -28,11 +28,17 @@
 #include <openbsc/db.h>
 #include <openbsc/vlr.h>
 #include <openbsc/osmo_msc.h>
-#include <openbsc/iu.h>
 #include <openbsc/a_iface.h>
 
 #include <openbsc/gsm_04_11.h>
 
+#include "../../bscconfig.h"
+#ifdef BUILD_IU
+#include <osmocom/ranap/iu_client.h>
+#else
+#include <openbsc/iu_dummy.h>
+#endif
+
 /* Receive a SAPI-N-REJECT from BSC */
 void msc_sapi_n_reject(struct gsm_subscriber_connection *conn, int dlci)
 {
@@ -285,7 +291,7 @@
 
 	switch (conn->via_ran) {
 	case RAN_UTRAN_IU:
-		iu_tx_release(conn->iu.ue_ctx, NULL);
+		ranap_iu_tx_release(conn->iu.ue_ctx, NULL);
 		/* FIXME: keep the conn until the Iu Release Outcome is
 		 * received from the UE, or a timeout expires. For now, the log
 		 * says "unknown UE" for each release outcome. */
diff --git a/src/libmsc/subscr_conn.c b/src/libmsc/subscr_conn.c
index cdeeae9..bcab8e4 100644
--- a/src/libmsc/subscr_conn.c
+++ b/src/libmsc/subscr_conn.c
@@ -30,10 +30,8 @@
 #include <openbsc/debug.h>
 #include <openbsc/transaction.h>
 #include <openbsc/signal.h>
-#include <openbsc/iu.h>
 #include <openbsc/a_iface.h>
 
-
 #define SUBSCR_CONN_TIMEOUT 5 /* seconds */
 
 static const struct value_string subscr_conn_fsm_event_names[] = {
diff --git a/src/osmo-msc/Makefile.am b/src/osmo-msc/Makefile.am
index bd734d1..87b6133 100644
--- a/src/osmo-msc/Makefile.am
+++ b/src/osmo-msc/Makefile.am
@@ -50,7 +50,6 @@
 	$(NULL)
 if BUILD_IU
 osmo_msc_LDADD += \
-	$(top_builddir)/src/libiu/libiu.a \
 	$(LIBOSMORANAP_LIBS) \
 	$(LIBASN1C_LIBS) \
 	$(NULL)
diff --git a/src/osmo-msc/msc_main.c b/src/osmo-msc/msc_main.c
index cd713ee..de6af5d 100644
--- a/src/osmo-msc/msc_main.c
+++ b/src/osmo-msc/msc_main.c
@@ -66,9 +66,11 @@
 #include <osmocom/sigtran/osmo_ss7.h>
 #include <openbsc/mgcpgw_client.h>
 
-#include <openbsc/msc_ifaces.h>
+#ifdef BUILD_IU
+#include <osmocom/ranap/iu_client.h>
+#endif
 
-#include <openbsc/iu.h>
+#include <openbsc/msc_ifaces.h>
 #include <openbsc/iucs.h>
 #include <openbsc/iucs_ranap.h>
 #include <openbsc/a_iface.h>
@@ -312,6 +314,7 @@
 	.is_config_node	= bsc_vty_is_config_node,
 };
 
+#ifdef BUILD_IU
 static int rcvmsg_iu_cs(struct msgb *msg, struct gprs_ra_id *ra_id, uint16_t *sai)
 {
 	DEBUGP(DIUCS, "got IuCS message"
@@ -326,14 +329,15 @@
 	return gsm0408_rcvmsg_iucs(msc_network, msg, ra_id? &ra_id->lac : NULL);
 }
 
-static int rx_iu_event(struct ue_conn_ctx *ctx, enum iu_event_type type,
+static int rx_iu_event(struct ranap_ue_conn_ctx *ctx, enum ranap_iu_event_type type,
 		       void *data)
 {
 	DEBUGP(DIUCS, "got IuCS event %u: %s\n", type,
-	       iu_event_type_str(type));
+	       ranap_iu_event_type_str(type));
 
 	return iucs_rx_ranap_event(msc_network, ctx, type, data);
 }
+#endif
 
 #define DEFAULT_M3UA_REMOTE_IP "127.0.0.1"
 #define DEFAULT_PC_A "0.23.1"
@@ -564,7 +568,7 @@
 
 #ifdef BUILD_IU
 	/* Set up IuCS */
-	iu_init(tall_msc_ctx, msc_network->iu.sccp, rcvmsg_iu_cs, rx_iu_event);
+	ranap_iu_init(tall_msc_ctx, DRANAP, "OsmoMSC-IuCS", msc_network->iu.sccp, rcvmsg_iu_cs, rx_iu_event);
 #endif
 
 	/* Set up A interface */
