New upstream version 0.9.14
diff --git a/include/Makefile.in b/include/Makefile.in
index ecbeebe..1d7fb81 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -36,7 +36,7 @@
 DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \
 	$(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -126,6 +126,8 @@
 LIBOBJS = @LIBOBJS@
 LIBOSMOCORE_CFLAGS = @LIBOSMOCORE_CFLAGS@
 LIBOSMOCORE_LIBS = @LIBOSMOCORE_LIBS@
+LIBOSMOGSM_CFLAGS = @LIBOSMOGSM_CFLAGS@
+LIBOSMOGSM_LIBS = @LIBOSMOGSM_LIBS@
 LIBOSMOSCCP_CFLAGS = @LIBOSMOSCCP_CFLAGS@
 LIBOSMOSCCP_LIBS = @LIBOSMOSCCP_LIBS@
 LIBOSMOVTY_CFLAGS = @LIBOSMOVTY_CFLAGS@
diff --git a/include/openbsc/Makefile.am b/include/openbsc/Makefile.am
index 325d66d..9ec92c1 100644
--- a/include/openbsc/Makefile.am
+++ b/include/openbsc/Makefile.am
@@ -11,7 +11,8 @@
 		gb_proxy.h gprs_sgsn.h gsm_04_08_gprs.h sgsn.h \
 		gprs_ns_frgre.h auth.h osmo_msc.h bsc_msc.h bsc_nat.h \
 		osmo_bsc_rf.h osmo_bsc.h network_listen.h bsc_nat_sccp.h \
-		osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h
+		osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h \
+		bss.h gsm_data_shared.h
 
 openbsc_HEADERS = gsm_04_08.h meas_rep.h bsc_api.h
 openbscdir = $(includedir)/openbsc
diff --git a/include/openbsc/Makefile.in b/include/openbsc/Makefile.in
index faca5a3..8d61f4a 100644
--- a/include/openbsc/Makefile.in
+++ b/include/openbsc/Makefile.in
@@ -36,7 +36,7 @@
 DIST_COMMON = $(noinst_HEADERS) $(openbsc_HEADERS) \
 	$(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
+am__aclocal_m4_deps = $(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -110,6 +110,8 @@
 LIBOBJS = @LIBOBJS@
 LIBOSMOCORE_CFLAGS = @LIBOSMOCORE_CFLAGS@
 LIBOSMOCORE_LIBS = @LIBOSMOCORE_LIBS@
+LIBOSMOGSM_CFLAGS = @LIBOSMOGSM_CFLAGS@
+LIBOSMOGSM_LIBS = @LIBOSMOGSM_LIBS@
 LIBOSMOSCCP_CFLAGS = @LIBOSMOSCCP_CFLAGS@
 LIBOSMOSCCP_LIBS = @LIBOSMOSCCP_LIBS@
 LIBOSMOVTY_CFLAGS = @LIBOSMOVTY_CFLAGS@
@@ -191,7 +193,8 @@
 		gb_proxy.h gprs_sgsn.h gsm_04_08_gprs.h sgsn.h \
 		gprs_ns_frgre.h auth.h osmo_msc.h bsc_msc.h bsc_nat.h \
 		osmo_bsc_rf.h osmo_bsc.h network_listen.h bsc_nat_sccp.h \
-		osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h
+		osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h \
+		bss.h gsm_data_shared.h
 
 openbsc_HEADERS = gsm_04_08.h meas_rep.h bsc_api.h
 openbscdir = $(includedir)/openbsc
diff --git a/include/openbsc/abis_nm.h b/include/openbsc/abis_nm.h
index c93db58..ae4f625 100644
--- a/include/openbsc/abis_nm.h
+++ b/include/openbsc/abis_nm.h
@@ -22,15 +22,15 @@
 #ifndef _NM_H
 #define _NM_H
 
-#include <sys/types.h>
-#include <osmocore/tlv.h>
-#include <osmocore/protocol/gsm_12_21.h>
+#include <osmocom/gsm/tlv.h>
+#include <osmocom/gsm/abis_nm.h>
+#include <osmocom/gsm/protocol/gsm_12_21.h>
 
 struct cell_global_id {
-	u_int16_t mcc;
-	u_int16_t mnc;
-	u_int16_t lac;
-	u_int16_t ci;
+	uint16_t mcc;
+	uint16_t mnc;
+	uint16_t lac;
+	uint16_t ci;
 };
 
 /* The BCCH info from an ip.access test, in host byte order
@@ -38,26 +38,22 @@
 struct ipac_bcch_info {
 	struct llist_head list;
 
-	u_int16_t info_type;
-	u_int8_t freq_qual;
-	u_int16_t arfcn;
-	u_int8_t rx_lev;
-	u_int8_t rx_qual;
+	uint16_t info_type;
+	uint8_t freq_qual;
+	uint16_t arfcn;
+	uint8_t rx_lev;
+	uint8_t rx_qual;
 	int16_t freq_err;
-	u_int16_t frame_offset;
-	u_int32_t frame_nr_offset;
-	u_int8_t bsic;
+	uint16_t frame_offset;
+	uint32_t frame_nr_offset;
+	uint8_t bsic;
 	struct cell_global_id cgi;
-	u_int8_t ba_list_si2[16];
-	u_int8_t ba_list_si2bis[16];
-	u_int8_t ba_list_si2ter[16];
-	u_int8_t ca_list_si1[16];
+	uint8_t ba_list_si2[16];
+	uint8_t ba_list_si2bis[16];
+	uint8_t ba_list_si2ter[16];
+	uint8_t ca_list_si1[16];
 };
 
-extern const struct value_string abis_nm_adm_state_names[];
-extern const struct value_string abis_nm_obj_class_names[];
-extern const struct tlv_definition nm_att_tlvdef;
-
 /* PUBLIC */
 
 struct msgb;
@@ -72,60 +68,58 @@
 
 extern int abis_nm_rcvmsg(struct msgb *msg);
 
-int abis_nm_tlv_parse(struct tlv_parsed *tp, struct gsm_bts *bts, const u_int8_t *buf, int len);
+int abis_nm_tlv_parse(struct tlv_parsed *tp, struct gsm_bts *bts, const uint8_t *buf, int len);
 int abis_nm_rx(struct msgb *msg);
-int abis_nm_opstart(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i0, u_int8_t i1, u_int8_t i2);
-int abis_nm_chg_adm_state(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i0,
-			  u_int8_t i1, u_int8_t i2, enum abis_nm_adm_state adm_state);
-int abis_nm_establish_tei(struct gsm_bts *bts, u_int8_t trx_nr,
-			  u_int8_t e1_port, u_int8_t e1_timeslot, u_int8_t e1_subslot,
-			  u_int8_t tei);
+int abis_nm_opstart(struct gsm_bts *bts, uint8_t obj_class, uint8_t i0, uint8_t i1, uint8_t i2);
+int abis_nm_chg_adm_state(struct gsm_bts *bts, uint8_t obj_class, uint8_t i0,
+			  uint8_t i1, uint8_t i2, enum abis_nm_adm_state adm_state);
+int abis_nm_establish_tei(struct gsm_bts *bts, uint8_t trx_nr,
+			  uint8_t e1_port, uint8_t e1_timeslot, uint8_t e1_subslot,
+			  uint8_t tei);
 int abis_nm_conn_terr_sign(struct gsm_bts_trx *trx,
-			   u_int8_t e1_port, u_int8_t e1_timeslot, u_int8_t e1_subslot);
+			   uint8_t e1_port, uint8_t e1_timeslot, uint8_t e1_subslot);
 int abis_nm_conn_terr_traf(struct gsm_bts_trx_ts *ts,
-			   u_int8_t e1_port, u_int8_t e1_timeslot,
-			   u_int8_t e1_subslot);
-int abis_nm_set_bts_attr(struct gsm_bts *bts, u_int8_t *attr, int attr_len);
-int abis_nm_set_radio_attr(struct gsm_bts_trx *trx, u_int8_t *attr, int attr_len);
-int abis_nm_set_channel_attr(struct gsm_bts_trx_ts *ts, u_int8_t chan_comb);
-int abis_nm_sw_act_req_ack(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i1,
-			u_int8_t i2, u_int8_t i3, int nack, u_int8_t *attr, int att_len);
-int abis_nm_raw_msg(struct gsm_bts *bts, int len, u_int8_t *msg);
+			   uint8_t e1_port, uint8_t e1_timeslot,
+			   uint8_t e1_subslot);
+int abis_nm_set_bts_attr(struct gsm_bts *bts, uint8_t *attr, int attr_len);
+int abis_nm_set_radio_attr(struct gsm_bts_trx *trx, uint8_t *attr, int attr_len);
+int abis_nm_set_channel_attr(struct gsm_bts_trx_ts *ts, uint8_t chan_comb);
+int abis_nm_sw_act_req_ack(struct gsm_bts *bts, uint8_t obj_class, uint8_t i1,
+			uint8_t i2, uint8_t i3, int nack, uint8_t *attr, int att_len);
+int abis_nm_raw_msg(struct gsm_bts *bts, int len, uint8_t *msg);
 int abis_nm_event_reports(struct gsm_bts *bts, int on);
 int abis_nm_reset_resource(struct gsm_bts *bts);
 int abis_nm_software_load(struct gsm_bts *bts, int trx_nr, const char *fname,
-			  u_int8_t win_size, int forced,
+			  uint8_t win_size, int forced,
 			  gsm_cbfn *cbfn, void *cb_data);
 int abis_nm_software_load_status(struct gsm_bts *bts);
 int abis_nm_software_activate(struct gsm_bts *bts, const char *fname,
 			      gsm_cbfn *cbfn, void *cb_data);
 
-int abis_nm_conn_mdrop_link(struct gsm_bts *bts, u_int8_t e1_port0, u_int8_t ts0,
-			    u_int8_t e1_port1, u_int8_t ts1);
+int abis_nm_conn_mdrop_link(struct gsm_bts *bts, uint8_t e1_port0, uint8_t ts0,
+			    uint8_t e1_port1, uint8_t ts1);
 
-int abis_nm_perform_test(struct gsm_bts *bts, u_int8_t obj_class,
-			 u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr,
-			 u_int8_t test_nr, u_int8_t auton_report, struct msgb *msg);
-
-int abis_nm_chcomb4pchan(enum gsm_phys_chan_config pchan);
+int abis_nm_perform_test(struct gsm_bts *bts, uint8_t obj_class,
+			 uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,
+			 uint8_t test_nr, uint8_t auton_report, struct msgb *msg);
 
 /* Siemens / BS-11 specific */
 int abis_nm_bs11_reset_resource(struct gsm_bts *bts);
 int abis_nm_bs11_db_transmission(struct gsm_bts *bts, int begin);
 int abis_nm_bs11_create_object(struct gsm_bts *bts, enum abis_bs11_objtype type,
-			  u_int8_t idx, u_int8_t attr_len, const u_int8_t *attr);
-int abis_nm_bs11_create_envaBTSE(struct gsm_bts *bts, u_int8_t idx);
-int abis_nm_bs11_create_bport(struct gsm_bts *bts, u_int8_t idx);
+			  uint8_t idx, uint8_t attr_len, const uint8_t *attr);
+int abis_nm_bs11_create_envaBTSE(struct gsm_bts *bts, uint8_t idx);
+int abis_nm_bs11_create_bport(struct gsm_bts *bts, uint8_t idx);
 int abis_nm_bs11_delete_object(struct gsm_bts *bts,
-				enum abis_bs11_objtype type, u_int8_t idx);
-int abis_nm_bs11_delete_bport(struct gsm_bts *bts, u_int8_t idx);
-int abis_nm_bs11_conn_oml_tei(struct gsm_bts *bts, u_int8_t e1_port,
-			  u_int8_t e1_timeslot, u_int8_t e1_subslot, u_int8_t tei);
+				enum abis_bs11_objtype type, uint8_t idx);
+int abis_nm_bs11_delete_bport(struct gsm_bts *bts, uint8_t idx);
+int abis_nm_bs11_conn_oml_tei(struct gsm_bts *bts, uint8_t e1_port,
+			  uint8_t e1_timeslot, uint8_t e1_subslot, uint8_t tei);
 int abis_nm_bs11_get_oml_tei_ts(struct gsm_bts *bts);
 int abis_nm_bs11_get_serno(struct gsm_bts *bts);
-int abis_nm_bs11_set_trx_power(struct gsm_bts_trx *trx, u_int8_t level);
+int abis_nm_bs11_set_trx_power(struct gsm_bts_trx *trx, uint8_t level);
 int abis_nm_bs11_get_trx_power(struct gsm_bts_trx *trx);
-int abis_nm_bs11_logon(struct gsm_bts *bts, u_int8_t level, const char *name, int on);
+int abis_nm_bs11_logon(struct gsm_bts *bts, uint8_t level, const char *name, int on);
 int abis_nm_bs11_factory_logon(struct gsm_bts *bts, int on);
 int abis_nm_bs11_infield_logon(struct gsm_bts *bts, int on);
 int abis_nm_bs11_set_trx1_pw(struct gsm_bts *bts, const char *password);
@@ -135,33 +129,31 @@
 int abis_nm_bs11_get_cclk(struct gsm_bts *bts);
 int abis_nm_bs11_get_state(struct gsm_bts *bts);
 int abis_nm_bs11_load_swl(struct gsm_bts *bts, const char *fname,
-			  u_int8_t win_size, int forced, gsm_cbfn *cbfn);
+			  uint8_t win_size, int forced, gsm_cbfn *cbfn);
 int abis_nm_bs11_set_ext_time(struct gsm_bts *bts);
-int abis_nm_bs11_get_bport_line_cfg(struct gsm_bts *bts, u_int8_t bport);
-int abis_nm_bs11_set_bport_line_cfg(struct gsm_bts *bts, u_int8_t bport, enum abis_bs11_line_cfg line_cfg);
+int abis_nm_bs11_get_bport_line_cfg(struct gsm_bts *bts, uint8_t bport);
+int abis_nm_bs11_set_bport_line_cfg(struct gsm_bts *bts, uint8_t bport, enum abis_bs11_line_cfg line_cfg);
 int abis_nm_bs11_bsc_disconnect(struct gsm_bts *bts, int reconnect);
 int abis_nm_bs11_restart(struct gsm_bts *bts);
 
 /* ip.access nanoBTS specific commands */
-int abis_nm_ipaccess_msg(struct gsm_bts *bts, u_int8_t msg_type,
-			 u_int8_t obj_class, u_int8_t bts_nr,
-			 u_int8_t trx_nr, u_int8_t ts_nr,
-			 u_int8_t *attr, int attr_len);
-int abis_nm_ipaccess_set_nvattr(struct gsm_bts_trx *trx, u_int8_t *attr,
+int abis_nm_ipaccess_msg(struct gsm_bts *bts, uint8_t msg_type,
+			 uint8_t obj_class, uint8_t bts_nr,
+			 uint8_t trx_nr, uint8_t ts_nr,
+			 uint8_t *attr, int attr_len);
+int abis_nm_ipaccess_set_nvattr(struct gsm_bts_trx *trx, uint8_t *attr,
 				int attr_len);
 int abis_nm_ipaccess_restart(struct gsm_bts_trx *trx);
-int abis_nm_ipaccess_set_attr(struct gsm_bts *bts, u_int8_t obj_class,
-				u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr,
-				u_int8_t *attr, u_int8_t attr_len);
+int abis_nm_ipaccess_set_attr(struct gsm_bts *bts, uint8_t obj_class,
+				uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,
+				uint8_t *attr, uint8_t attr_len);
 int abis_nm_ipaccess_rsl_connect(struct gsm_bts_trx *trx, 
-				 u_int32_t ip, u_int16_t port, u_int8_t stream);
-void abis_nm_ipaccess_cgi(u_int8_t *buf, struct gsm_bts *bts);
-int ipac_parse_bcch_info(struct ipac_bcch_info *binf, u_int8_t *buf);
-const char *ipacc_testres_name(u_int8_t res);
+				 uint32_t ip, uint16_t port, uint8_t stream);
+void abis_nm_ipaccess_cgi(uint8_t *buf, struct gsm_bts *bts);
+int ipac_parse_bcch_info(struct ipac_bcch_info *binf, uint8_t *buf);
+const char *ipacc_testres_name(uint8_t res);
 
 /* Functions calling into other code parts */
-const char *nm_opstate_name(u_int8_t os);
-const char *nm_avail_name(u_int8_t avail);
 int nm_is_running(struct gsm_nm_state *s);
 
 int abis_nm_vty_init(void);
diff --git a/include/openbsc/abis_om2000.h b/include/openbsc/abis_om2000.h
index e4f19cf..2ff7270 100644
--- a/include/openbsc/abis_om2000.h
+++ b/include/openbsc/abis_om2000.h
@@ -34,6 +34,13 @@
 	OM2K_MO_CLS_RX				= 0x0c,
 };
 
+enum om2k_mo_state {
+	OM2K_MO_S_RESET = 0,
+	OM2K_MO_S_STARTED,
+	OM2K_MO_S_ENABLED,
+	OM2K_MO_S_DISABLED,
+};
+
 struct abis_om2k_mo {
 	uint8_t class;
 	uint8_t bts;
@@ -41,12 +48,26 @@
 	uint8_t inst;
 } __attribute__ ((packed));
 
+/* on-wire format for IS conn group */
 struct om2k_is_conn_grp {
 	uint16_t icp1;
 	uint16_t icp2;
 	uint8_t cont_idx;
 } __attribute__ ((packed));
 
+/* internal data formant for IS conn group */
+struct is_conn_group {
+	struct llist_head list;
+	uint16_t icp1;
+	uint16_t icp2;
+	uint8_t ci;
+};
+
+extern const struct abis_om2k_mo om2k_mo_cf;
+extern const struct abis_om2k_mo om2k_mo_is;
+extern const struct abis_om2k_mo om2k_mo_con;
+extern const struct abis_om2k_mo om2k_mo_tf;
+
 extern const struct value_string om2k_mo_class_short_vals[];
 
 int abis_om2k_rcvmsg(struct msgb *msg);
@@ -63,8 +84,7 @@
 int abis_om2k_tx_test_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
 int abis_om2k_tx_op_info(struct gsm_bts *bts, const struct abis_om2k_mo *mo,
 			 uint8_t operational);
-int abis_om2k_tx_is_conf_req(struct gsm_bts *bts, struct om2k_is_conn_grp *cg,
-			     unsigned int num_cg);
+int abis_om2k_tx_is_conf_req(struct gsm_bts *bts);
 int abis_om2k_tx_tf_conf_req(struct gsm_bts *bts);
 int abis_om2k_tx_rx_conf_req(struct gsm_bts_trx *trx);
 int abis_om2k_tx_tx_conf_req(struct gsm_bts_trx *trx);
diff --git a/include/openbsc/abis_rsl.h b/include/openbsc/abis_rsl.h
index 295b01f..3b4df90 100644
--- a/include/openbsc/abis_rsl.h
+++ b/include/openbsc/abis_rsl.h
@@ -22,9 +22,9 @@
 #ifndef _RSL_H
 #define _RSL_H
 
-#include <osmocore/protocol/gsm_08_58.h>
+#include <osmocom/gsm/protocol/gsm_08_58.h>
 
-#include <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
 
 struct gsm_bts;
 struct gsm_lchan;
@@ -32,61 +32,56 @@
 struct gsm_bts_trx_ts;
 
 
-int rsl_bcch_info(struct gsm_bts_trx *trx, u_int8_t type,
-		  const u_int8_t *data, int len);
-int rsl_sacch_filling(struct gsm_bts_trx *trx, u_int8_t type, 
-		      const u_int8_t *data, int len);
-int rsl_chan_activate(struct gsm_bts_trx *trx, u_int8_t chan_nr,
-		      u_int8_t act_type,
+int rsl_bcch_info(struct gsm_bts_trx *trx, uint8_t type,
+		  const uint8_t *data, int len);
+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type,
+		      const uint8_t *data, int len);
+int rsl_chan_activate(struct gsm_bts_trx *trx, uint8_t chan_nr,
+		      uint8_t act_type,
 		      struct rsl_ie_chan_mode *chan_mode,
 		      struct rsl_ie_chan_ident *chan_ident,
-		      u_int8_t bs_power, u_int8_t ms_power,
-		      u_int8_t ta);
-int rsl_chan_activate_lchan(struct gsm_lchan *lchan, u_int8_t act_type, 
-			    u_int8_t ta, u_int8_t ho_ref);
+		      uint8_t bs_power, uint8_t ms_power,
+		      uint8_t ta);
+int rsl_chan_activate_lchan(struct gsm_lchan *lchan, uint8_t act_type,
+			    uint8_t ta, uint8_t ho_ref);
 int rsl_chan_mode_modify_req(struct gsm_lchan *ts);
 int rsl_encryption_cmd(struct msgb *msg);
-int rsl_paging_cmd(struct gsm_bts *bts, u_int8_t paging_group, u_int8_t len,
-		   u_int8_t *ms_ident, u_int8_t chan_needed);
-int rsl_imm_assign_cmd(struct gsm_bts *bts, u_int8_t len, u_int8_t *val);
+int rsl_paging_cmd(struct gsm_bts *bts, uint8_t paging_group, uint8_t len,
+		   uint8_t *ms_ident, uint8_t chan_needed);
+int rsl_imm_assign_cmd(struct gsm_bts *bts, uint8_t len, uint8_t *val);
 
-int rsl_data_request(struct msgb *msg, u_int8_t link_id);
-int rsl_establish_request(struct gsm_lchan *lchan, u_int8_t link_id);
-int rsl_relase_request(struct gsm_lchan *lchan, u_int8_t link_id);
+int rsl_data_request(struct msgb *msg, uint8_t link_id);
+int rsl_establish_request(struct gsm_lchan *lchan, uint8_t link_id);
+int rsl_relase_request(struct gsm_lchan *lchan, uint8_t link_id);
 
 /* Siemens vendor-specific RSL extensions */
 int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci);
 
 /* ip.access specfic RSL extensions */
 int rsl_ipacc_crcx(struct gsm_lchan *lchan);
-int rsl_ipacc_mdcx(struct gsm_lchan *lchan, u_int32_t ip,
-		   u_int16_t port, u_int8_t rtp_payload2);
+int rsl_ipacc_mdcx(struct gsm_lchan *lchan, uint32_t ip,
+		   uint16_t port, uint8_t rtp_payload2);
 int rsl_ipacc_mdcx_to_rtpsock(struct gsm_lchan *lchan);
 int rsl_ipacc_pdch_activate(struct gsm_bts_trx_ts *ts, int act);
 
 int abis_rsl_rcvmsg(struct msgb *msg);
 
-unsigned int get_paging_group(u_int64_t imsi, unsigned int bs_cc_chans,
-			      int n_pag_blocks);
-unsigned int n_pag_blocks(int bs_ccch_sdcch_comb, unsigned int bs_ag_blks_res);
-u_int64_t str_to_imsi(const char *imsi_str);
-u_int8_t lchan2chan_nr(const struct gsm_lchan *lchan);
-int rsl_release_request(struct gsm_lchan *lchan, u_int8_t link_id, u_int8_t reason);
+uint64_t str_to_imsi(const char *imsi_str);
+int rsl_release_request(struct gsm_lchan *lchan, uint8_t link_id, uint8_t reason);
 
 int rsl_lchan_set_state(struct gsm_lchan *lchan, int);
 
 /* to be provided by external code */
 int abis_rsl_sendmsg(struct msgb *msg);
 int rsl_deact_sacch(struct gsm_lchan *lchan);
-int rsl_lchan_rll_release(struct gsm_lchan *lchan, u_int8_t link_id);
+int rsl_lchan_rll_release(struct gsm_lchan *lchan, uint8_t link_id);
 
 /* BCCH related code */
 int rsl_ccch_conf_to_bs_cc_chans(int ccch_conf);
 int rsl_ccch_conf_to_bs_ccch_sdcch_comb(int ccch_conf);
-int rsl_number_of_paging_subchannels(struct gsm_bts *bts);
 
-int rsl_sacch_info_modify(struct gsm_lchan *lchan, u_int8_t type,
-			  const u_int8_t *data, int len);
+int rsl_sacch_info_modify(struct gsm_lchan *lchan, uint8_t type,
+			  const uint8_t *data, int len);
 
 int rsl_chan_bs_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int db);
 int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int dbm);
diff --git a/include/openbsc/bsc_msc.h b/include/openbsc/bsc_msc.h
index d06ae05..9543002 100644
--- a/include/openbsc/bsc_msc.h
+++ b/include/openbsc/bsc_msc.h
@@ -22,25 +22,33 @@
 #ifndef BSC_MSC_H
 #define BSC_MSC_H
 
-#include <osmocore/write_queue.h>
-#include <osmocore/timer.h>
+#include <osmocom/core/write_queue.h>
+#include <osmocom/core/timer.h>
+
+struct bsc_msc_dest {
+	struct llist_head list;
+
+	char *ip;
+	int port;
+	int dscp;
+};
+
 
 struct bsc_msc_connection {
-	struct write_queue write_queue;
+	struct osmo_wqueue write_queue;
 	int is_connected;
 	int is_authenticated;
 	int first_contact;
-	const char *ip;
-	int port;
-	int prio;
+
+	struct llist_head *dests;
 
 	void (*connection_loss) (struct bsc_msc_connection *);
 	void (*connected) (struct bsc_msc_connection *);
-	struct timer_list reconnect_timer;
-	struct timer_list timeout_timer;
+	struct osmo_timer_list reconnect_timer;
+	struct osmo_timer_list timeout_timer;
 };
 
-struct bsc_msc_connection *bsc_msc_create(const char *ip, int port, int prio);
+struct bsc_msc_connection *bsc_msc_create(void *ctx, struct llist_head *dest);
 int bsc_msc_connect(struct bsc_msc_connection *);
 void bsc_msc_schedule_connect(struct bsc_msc_connection *);
 
diff --git a/include/openbsc/bsc_nat.h b/include/openbsc/bsc_nat.h
index f74cae2..97fa4fe 100644
--- a/include/openbsc/bsc_nat.h
+++ b/include/openbsc/bsc_nat.h
@@ -1,6 +1,6 @@
 /*
- * (C) 2010 by Holger Hans Peter Freyther <zecke@selfish.org>
- * (C) 2010 by On-Waves
+ * (C) 2010-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
+ * (C) 2010-2011 by On-Waves
  * All Rights Reserved
  *
  * This program is free software; you can redistribute it and/or modify
@@ -23,22 +23,23 @@
 
 #include "mgcp.h"
 
-#include <sys/types.h>
 
-#include <osmocore/select.h>
-#include <osmocore/msgb.h>
-#include <osmocore/msgfile.h>
-#include <osmocore/timer.h>
-#include <osmocore/write_queue.h>
-#include <osmocore/rate_ctr.h>
-#include <osmocore/statistics.h>
-#include <osmocore/protocol/gsm_04_08.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/msgfile.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/write_queue.h>
+#include <osmocom/core/rate_ctr.h>
+#include <osmocom/core/statistics.h>
+#include <osmocom/gsm/protocol/gsm_04_08.h>
 
 #include <regex.h>
 
 #define DIR_BSC 1
 #define DIR_MSC 2
 
+#define PAGIN_GROUP_UNASSIGNED -1
+
 struct sccp_source_reference;
 struct sccp_connections;
 struct bsc_nat_parsed;
@@ -56,6 +57,16 @@
 };
 
 /*
+ * Is this terminated to the MSC, to the local machine (release
+ * handling for IMSI filtering) or to a USSD provider?
+ */
+enum {
+	NAT_CON_END_MSC,
+	NAT_CON_END_LOCAL,
+	NAT_CON_END_USSD,
+};
+
+/*
  * Per BSC data structure
  */
 struct bsc_connection {
@@ -65,17 +76,17 @@
 	int authenticated;
 
 	/* the fd we use to communicate */
-	struct write_queue write_queue;
+	struct osmo_wqueue write_queue;
 
 	/* the BSS associated */
 	struct bsc_config *cfg;
 
 	/* a timeout node */
-	struct timer_list id_timeout;
+	struct osmo_timer_list id_timeout;
 
 	/* pong timeout */
-	struct timer_list ping_timeout;
-	struct timer_list pong_timeout;
+	struct osmo_timer_list ping_timeout;
+	struct osmo_timer_list pong_timeout;
 
 	/* mgcp related code */
 	char *_endpoint_status;
@@ -125,6 +136,7 @@
 	char *acc_lst_name;
 
 	int forbid_paging;
+	int paging_group;
 
 	/* audio handling */
 	int max_endpoints;
@@ -142,6 +154,14 @@
 	uint16_t lac;
 };
 
+struct bsc_nat_paging_group {
+	struct llist_head entry;
+
+	/* list of lac entries */
+	struct llist_head lists;
+	int nr;
+};
+
 /**
  * BSCs point of view of endpoints
  */
@@ -159,21 +179,21 @@
  */
 struct bsc_nat_statistics {
 	struct {
-		struct counter *conn;
-		struct counter *calls;
+		struct osmo_counter *conn;
+		struct osmo_counter *calls;
 	} sccp;
 
 	struct {
-		struct counter *reconn;
-                struct counter *auth_fail;
+		struct osmo_counter *reconn;
+                struct osmo_counter *auth_fail;
 	} bsc;
 
 	struct {
-		struct counter *reconn;
+		struct osmo_counter *reconn;
 	} msc;
 
 	struct {
-		struct counter *reconn;
+		struct osmo_counter *reconn;
 	} ussd;
 };
 
@@ -216,6 +236,9 @@
 	/* access lists */
 	struct llist_head access_lists;
 
+	/* paging groups */
+	struct llist_head paging_groups;
+
 	/* known BSC's */
 	struct llist_head bsc_configs;
 	int num_bsc;
@@ -227,8 +250,8 @@
 	int mgcp_length;
 
 	/* msc things */
-	char *msc_ip;
-	int msc_port;
+	struct llist_head dests;
+	struct bsc_msc_dest *main_dest;
 	struct bsc_msc_connection *msc_con;
 	char *token;
 
@@ -244,20 +267,37 @@
 
 	/* number rewriting */
 	char *num_rewr_name;
-	struct msg_entries *num_rewr;
+	struct llist_head num_rewr;
+
+	char *smsc_rewr_name;
+	struct llist_head smsc_rewr;
+	char *tpdest_match_name;
+	struct llist_head tpdest_match;
 
 	/* USSD messages  we want to match */
 	char *ussd_lst_name;
 	char *ussd_query;
+	regex_t ussd_query_re;
 	char *ussd_token;
 	char *ussd_local;
-	struct bsc_fd ussd_listen;
+	struct osmo_fd ussd_listen;
 	struct bsc_nat_ussd_con *ussd_con;
 
+	/* for maintainenance */
+	int blocked;
+
 	/* statistics */
 	struct bsc_nat_statistics stats;
 };
 
+struct bsc_nat_ussd_con {
+	struct osmo_wqueue queue;
+	struct bsc_nat *nat;
+	int authorized;
+
+	struct osmo_timer_list auth_timeout;
+};
+
 /* create and init the structures */
 struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token);
 struct bsc_config *bsc_config_num(struct bsc_nat *nat, int num);
@@ -285,7 +325,7 @@
  */
 int bsc_nat_filter_ipa(int direction, struct msgb *msg, struct bsc_nat_parsed *parsed);
 int bsc_nat_vty_init(struct bsc_nat *nat);
-struct bsc_connection *bsc_nat_find_bsc(struct bsc_nat *nat, struct msgb *msg, int *_lac);
+int bsc_nat_find_paging(struct msgb *msg, const uint8_t **,int *len);
 
 /**
  * Content filtering.
@@ -326,12 +366,12 @@
 
 
 int bsc_write(struct bsc_connection *bsc, struct msgb *msg, int id);
-int bsc_do_write(struct write_queue *queue, struct msgb *msg, int id);
-int bsc_write_msg(struct write_queue *queue, struct msgb *msg);
-int bsc_write_cb(struct bsc_fd *bfd, struct msgb *msg);
+int bsc_do_write(struct osmo_wqueue *queue, struct msgb *msg, int id);
+int bsc_write_msg(struct osmo_wqueue *queue, struct msgb *msg);
+int bsc_write_cb(struct osmo_fd *bfd, struct msgb *msg);
 
 /* IMSI allow/deny handling */
-void bsc_parse_reg(void *ctx, regex_t *reg, char **imsi, int argc, const char **argv);
+int bsc_parse_reg(void *ctx, regex_t *reg, char **imsi, int argc, const char **argv) __attribute__ ((warn_unused_result));
 struct bsc_nat_acc_lst *bsc_nat_acc_lst_find(struct bsc_nat *nat, const char *name);
 struct bsc_nat_acc_lst *bsc_nat_acc_lst_get(struct bsc_nat *nat, const char *name);
 void bsc_nat_acc_lst_delete(struct bsc_nat_acc_lst *lst);
@@ -350,6 +390,27 @@
 int bsc_check_ussd(struct sccp_connections *con, struct bsc_nat_parsed *parsed, struct msgb *msg);
 int bsc_close_ussd_connections(struct bsc_nat *nat);
 
-struct msgb *bsc_nat_rewrite_setup(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *, const char *imsi);
+struct msgb *bsc_nat_rewrite_msg(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *, const char *imsi);
+
+/** paging group handling */
+struct bsc_nat_paging_group *bsc_nat_paging_group_num(struct bsc_nat *nat, int group);
+struct bsc_nat_paging_group *bsc_nat_paging_group_create(struct bsc_nat *nat, int group);
+void bsc_nat_paging_group_delete(struct bsc_nat_paging_group *);
+void bsc_nat_paging_group_add_lac(struct bsc_nat_paging_group *grp, int lac);
+void bsc_nat_paging_group_del_lac(struct bsc_nat_paging_group *grp, int lac);
+
+/**
+ * Number rewriting support below
+ */
+struct bsc_nat_num_rewr_entry {
+	struct llist_head list;
+
+	regex_t msisdn_reg;
+	regex_t num_reg;
+
+	char *replace;
+};
+
+void bsc_nat_num_rewr_entry_adapt(void *ctx, struct llist_head *head, const struct osmo_config_list *);
 
 #endif
diff --git a/include/openbsc/bsc_nat_sccp.h b/include/openbsc/bsc_nat_sccp.h
index 0ade668..20db2c1 100644
--- a/include/openbsc/bsc_nat_sccp.h
+++ b/include/openbsc/bsc_nat_sccp.h
@@ -22,7 +22,6 @@
 #ifndef BSC_NAT_SCCP_H
 #define BSC_NAT_SCCP_H
 
-#include <sys/types.h>
 #include <osmocom/sccp/sccp_types.h>
 
 /*
@@ -77,9 +76,13 @@
 	/* status */
 	int con_type;
 	int con_local;
+	int authorized;
 	int imsi_checked;
 	char *imsi;
 
+	/* remember which Transactions we run over the bypass */
+	char ussd_ti[8];
+
 	/*
 	 * audio handling. Remember if we have ever send a CRCX,
 	 * remember the endpoint used by the MSC and BSC.
diff --git a/include/openbsc/bsc_rll.h b/include/openbsc/bsc_rll.h
index b2898d1..729ba60 100644
--- a/include/openbsc/bsc_rll.h
+++ b/include/openbsc/bsc_rll.h
@@ -10,10 +10,10 @@
 	BSC_RLLR_IND_TIMEOUT,
 };
 
-int rll_establish(struct gsm_lchan *lchan, u_int8_t link_id,
-		  void (*cb)(struct gsm_lchan *, u_int8_t, void *,
+int rll_establish(struct gsm_lchan *lchan, uint8_t link_id,
+		  void (*cb)(struct gsm_lchan *, uint8_t, void *,
 			     enum bsc_rllr_ind),
 		  void *data);
-void rll_indication(struct gsm_lchan *lchan, u_int8_t link_id, u_int8_t type);
+void rll_indication(struct gsm_lchan *lchan, uint8_t link_id, uint8_t type);
 
 #endif /* _BSC_RLL_H */
diff --git a/include/openbsc/bss.h b/include/openbsc/bss.h
new file mode 100644
index 0000000..05495dd
--- /dev/null
+++ b/include/openbsc/bss.h
@@ -0,0 +1,17 @@
+#ifndef _BSS_H_
+#define _BSS_H_
+
+struct gsm_network;
+struct msgb;
+
+/* start and stop network */
+extern int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *), const char *cfg_file);
+extern int bsc_shutdown_net(struct gsm_network *net);
+
+/* register all supported BTS */
+extern int bts_init(void);
+extern int bts_model_bs11_init(void);
+extern int bts_model_rbs2k_init(void);
+extern int bts_model_nanobts_init(void);
+extern int bts_model_hslfemto_init(void);
+#endif
diff --git a/include/openbsc/crc24.h b/include/openbsc/crc24.h
index 358fcb5..756638c 100644
--- a/include/openbsc/crc24.h
+++ b/include/openbsc/crc24.h
@@ -1,8 +1,10 @@
 #ifndef _CRC24_H
 #define _CRC24_H
 
+#include <stdint.h>
+
 #define INIT_CRC24	0xffffff
 
-u_int32_t crc24_calc(u_int32_t fcs, u_int8_t *cp, unsigned int len);
+uint32_t crc24_calc(uint32_t fcs, uint8_t *cp, unsigned int len);
 
 #endif
diff --git a/include/openbsc/db.h b/include/openbsc/db.h
index a939b0d..37011a1 100644
--- a/include/openbsc/db.h
+++ b/include/openbsc/db.h
@@ -20,7 +20,7 @@
 #ifndef _DB_H
 #define _DB_H
 
-#include <sys/types.h>
+#include "gsm_subscriber.h"
 
 struct gsm_equipment;
 struct gsm_network;
@@ -29,8 +29,6 @@
 struct gsm_sms;
 struct gsm_subscriber;
 
-enum gsm_subscriber_field;
-
 /* one time initialisation */
 int db_init(const char *name);
 int db_prepare();
@@ -45,7 +43,7 @@
 int db_sync_subscriber(struct gsm_subscriber *subscriber);
 int db_subscriber_alloc_tmsi(struct gsm_subscriber *subscriber);
 int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber);
-int db_subscriber_alloc_token(struct gsm_subscriber *subscriber, u_int32_t* token);
+int db_subscriber_alloc_token(struct gsm_subscriber *subscriber, uint32_t* token);
 int db_subscriber_assoc_imei(struct gsm_subscriber *subscriber, char *imei);
 int db_sync_equipment(struct gsm_equipment *equip);
 int db_subscriber_update(struct gsm_subscriber *subscriber);
@@ -71,12 +69,12 @@
 
 /* APDU blob storage */
 int db_apdu_blob_store(struct gsm_subscriber *subscr, 
-			u_int8_t apdu_id_flags, u_int8_t len,
-			u_int8_t *apdu);
+			uint8_t apdu_id_flags, uint8_t len,
+			uint8_t *apdu);
 
 /* Statistics counter storage */
-struct counter;
-int db_store_counter(struct counter *ctr);
+struct osmo_counter;
+int db_store_counter(struct osmo_counter *ctr);
 struct rate_ctr_group;
 int db_store_rate_ctr_group(struct rate_ctr_group *ctrg);
 
diff --git a/include/openbsc/debug.h b/include/openbsc/debug.h
index eb290e4..ff4aec1 100644
--- a/include/openbsc/debug.h
+++ b/include/openbsc/debug.h
@@ -2,10 +2,10 @@
 #define _DEBUG_H
 
 #include <stdio.h>
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
 
 #define DEBUG
-#include <osmocore/logging.h>
+#include <osmocom/core/logging.h>
 
 /* Debug Areas of the code */
 enum {
diff --git a/include/openbsc/e1_input.h b/include/openbsc/e1_input.h
index 3c8af38..0d79c7d 100644
--- a/include/openbsc/e1_input.h
+++ b/include/openbsc/e1_input.h
@@ -4,10 +4,10 @@
 #include <stdlib.h>
 #include <netinet/in.h>
 
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
 #include <openbsc/gsm_data.h>
-#include <osmocore/msgb.h>
-#include <osmocore/select.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/select.h>
 #include <openbsc/subchan_demux.h>
 
 #define NUM_E1_TS   32
@@ -37,12 +37,12 @@
 	struct llist_head tx_list;
 
 	/* SAPI and TEI on the E1 TS */
-	u_int8_t sapi;
-	u_int8_t tei;
+	uint8_t sapi;
+	uint8_t tei;
 
 	union {
 		struct {
-			u_int8_t channel;
+			uint8_t channel;
 		} misdn;
 	} driver;
 };
@@ -69,7 +69,7 @@
 			/* delay for the queue */
 			int delay;
 			/* timer when to dequeue next frame */
-			struct timer_list tx_timer;
+			struct osmo_timer_list tx_timer;
 		} sign;
 		struct {
 			/* subchannel demuxer for frames from E1 */
@@ -81,15 +81,15 @@
 	union {
 		struct {
 			/* mISDN driver has one fd for each ts */
-			struct bsc_fd fd;
+			struct osmo_fd fd;
 		} misdn;
 		struct {
 			/* ip.access driver has one fd for each ts */
-			struct bsc_fd fd;
+			struct osmo_fd fd;
 		} ipaccess;
 		struct {
 			/* DAHDI driver has one fd for each ts */
-			struct bsc_fd fd;
+			struct osmo_fd fd;
 			struct lapd_instance *lapd;
 		} dahdi;
 	} driver;
@@ -125,21 +125,21 @@
 int e1inp_line_register(struct e1inp_line *line);
 
 /* get a line by its ID */
-struct e1inp_line *e1inp_line_get(u_int8_t e1_nr);
+struct e1inp_line *e1inp_line_get(uint8_t e1_nr);
 
 /* create a line in the E1 input core */
-struct e1inp_line *e1inp_line_create(u_int8_t e1_nr, const char *driver_name);
+struct e1inp_line *e1inp_line_create(uint8_t e1_nr, const char *driver_name);
 
 /* find a sign_link for given TEI and SAPI in a TS */
 struct e1inp_sign_link *
-e1inp_lookup_sign_link(struct e1inp_ts *ts, u_int8_t tei,
-			u_int8_t sapi);
+e1inp_lookup_sign_link(struct e1inp_ts *ts, uint8_t tei,
+			uint8_t sapi);
 
 /* create a new signalling link in a E1 timeslot */
 struct e1inp_sign_link *
 e1inp_sign_link_create(struct e1inp_ts *ts, enum e1inp_sign_type type,
-			struct gsm_bts_trx *trx, u_int8_t tei,
-			u_int8_t sapi);
+			struct gsm_bts_trx *trx, uint8_t tei,
+			uint8_t sapi);
 
 /* configure and initialize one e1inp_ts */
 int e1inp_ts_config(struct e1inp_ts *ts, struct e1inp_line *line,
@@ -150,20 +150,20 @@
 
 /* Receive a packet from the E1 driver */
 int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg,
-		u_int8_t tei, u_int8_t sapi);
+		uint8_t tei, uint8_t sapi);
 
 /* called by driver if it wants to transmit on a given TS */
 struct msgb *e1inp_tx_ts(struct e1inp_ts *e1i_ts,
 			 struct e1inp_sign_link **sign_link);
 
 /* called by driver in case some kind of link state event */
-int e1inp_event(struct e1inp_ts *ts, int evt, u_int8_t tei, u_int8_t sapi);
+int e1inp_event(struct e1inp_ts *ts, int evt, uint8_t tei, uint8_t sapi);
 
 /* Write LAPD frames to the fd. */
 void e1_set_pcap_fd(int fd);
 
 /* called by TRAU muxer to obtain the destination mux entity */
-struct subch_mux *e1inp_get_mux(u_int8_t e1_nr, u_int8_t ts_nr);
+struct subch_mux *e1inp_get_mux(uint8_t e1_nr, uint8_t ts_nr);
 
 void e1inp_sign_link_destroy(struct e1inp_sign_link *link);
 int e1inp_line_update(struct e1inp_line *line);
@@ -175,6 +175,7 @@
 
 int ia_config_connect(struct gsm_bts *bts, struct sockaddr_in *sin);
 int ipaccess_setup(struct gsm_network *gsmnet);
+int hsl_setup(struct gsm_network *gsmnet);
 
 extern struct llist_head e1inp_driver_list;
 extern struct llist_head e1inp_line_list;
diff --git a/include/openbsc/gb_proxy.h b/include/openbsc/gb_proxy.h
index 18ded22..c0cdcbf 100644
--- a/include/openbsc/gb_proxy.h
+++ b/include/openbsc/gb_proxy.h
@@ -1,16 +1,15 @@
 #ifndef _GB_PROXY_H
 #define _GB_PROXY_H
 
-#include <sys/types.h>
 
-#include <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
 
 #include <openbsc/gprs_ns.h>
 #include <osmocom/vty/command.h>
 
 struct gbproxy_config {
 	/* parsed from config file */
-	u_int16_t nsip_sgsn_nsei;
+	uint16_t nsip_sgsn_nsei;
 
 	/* misc */
 	struct gprs_ns_inst *nsi;
diff --git a/include/openbsc/gprs_bssgp.h b/include/openbsc/gprs_bssgp.h
index e432cf7..cef4c30 100644
--- a/include/openbsc/gprs_bssgp.h
+++ b/include/openbsc/gprs_bssgp.h
@@ -182,7 +182,7 @@
 /* Find a BTS context based on BVCI+NSEI tuple */
 struct bssgp_bvc_ctx *btsctx_by_bvci_nsei(uint16_t bvci, uint16_t nsei);
 
-#include <osmocore/tlv.h>
+#include <osmocom/gsm/tlv.h>
 
 /* BSSGP-UL-UNITDATA.ind */
 int gprs_bssgp_rcvmsg(struct msgb *msg);
diff --git a/include/openbsc/gprs_gmm.h b/include/openbsc/gprs_gmm.h
index bd129ae..f6b3e5e 100644
--- a/include/openbsc/gprs_gmm.h
+++ b/include/openbsc/gprs_gmm.h
@@ -1,7 +1,7 @@
 #ifndef _GPRS_GMM_H
 #define _GPRS_GMM_H
 
-#include <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
 #include <openbsc/gprs_sgsn.h>
 
 int gsm48_tx_gsm_deact_pdp_req(struct sgsn_pdp_ctx *pdp, uint8_t sm_cause);
diff --git a/include/openbsc/gprs_llc.h b/include/openbsc/gprs_llc.h
index 02945e1..9f17605 100644
--- a/include/openbsc/gprs_llc.h
+++ b/include/openbsc/gprs_llc.h
@@ -99,8 +99,8 @@
 
 	enum gprs_llc_lle_state state;
 
-	struct timer_list t200;
-	struct timer_list t201;	/* wait for acknowledgement */
+	struct osmo_timer_list t200;
+	struct osmo_timer_list t201;	/* wait for acknowledgement */
 
 	uint16_t v_sent;
 	uint16_t v_ack;
diff --git a/include/openbsc/gprs_ns.h b/include/openbsc/gprs_ns.h
index 953c364..8f28d46 100644
--- a/include/openbsc/gprs_ns.h
+++ b/include/openbsc/gprs_ns.h
@@ -77,10 +77,10 @@
 
 /* Our Implementation */
 #include <netinet/in.h>
-#include <osmocore/linuxlist.h>
-#include <osmocore/msgb.h>
-#include <osmocore/timer.h>
-#include <osmocore/select.h>
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
 
 #define NS_TIMERS_COUNT 7
 #define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries)"
@@ -133,13 +133,13 @@
 
 	/* NS-over-IP specific bits */
 	struct {
-		struct bsc_fd fd;
+		struct osmo_fd fd;
 		uint32_t local_ip;
 		uint16_t local_port;
 	} nsip;
 	/* NS-over-FR-over-GRE-over-IP specific bits */
 	struct {
-		struct bsc_fd fd;
+		struct osmo_fd fd;
 		uint32_t local_ip;
 		int enabled:1;
 	} frgre;
@@ -163,7 +163,7 @@
 	uint32_t state;
 	uint32_t remote_state;
 
-	struct timer_list timer;
+	struct osmo_timer_list timer;
 	enum nsvc_timer_mode timer_mode;
 	int alive_retries;
 
diff --git a/include/openbsc/gprs_sgsn.h b/include/openbsc/gprs_sgsn.h
index b470c53..5023d06 100644
--- a/include/openbsc/gprs_sgsn.h
+++ b/include/openbsc/gprs_sgsn.h
@@ -4,7 +4,7 @@
 #include <stdint.h>
 #include <netinet/in.h>
 
-#include <osmocore/gsm48.h>
+#include <osmocom/gsm/gsm48.h>
 
 #include <osmocom/crypt/gprs_cipher.h>
 
@@ -102,7 +102,7 @@
 	uint16_t		nsei;
 	uint16_t		bvci;
 	struct rate_ctr_group	*ctrg;
-	struct timer_list	timer;
+	struct osmo_timer_list	timer;
 	unsigned int		T;		/* Txxxx number */
 	unsigned int		num_T_exp;	/* number of consecutive T expirations */
 
@@ -168,7 +168,7 @@
 	//uint32_t		charging_id;
 	int			reordering_reqd;
 
-	struct timer_list	timer;
+	struct osmo_timer_list	timer;
 	unsigned int		T;		/* Txxxx number */
 	unsigned int		num_T_exp;	/* number of consecutive T expirations */
 };
diff --git a/include/openbsc/gsm_04_08.h b/include/openbsc/gsm_04_08.h
index 1c879ed..b9b89e6 100644
--- a/include/openbsc/gsm_04_08.h
+++ b/include/openbsc/gsm_04_08.h
@@ -3,8 +3,8 @@
 
 #include <openbsc/meas_rep.h>
 
-#include <osmocore/protocol/gsm_04_08.h>
-#include <osmocore/gsm48.h>
+#include <osmocom/gsm/protocol/gsm_04_08.h>
+#include <osmocom/gsm/gsm48.h>
 
 struct msgb;
 struct gsm_bts;
@@ -28,37 +28,37 @@
 void gsm0408_clear_all_trans(struct gsm_network *net, int protocol);
 int gsm0408_dispatch(struct gsm_subscriber_connection *conn, struct msgb *msg);
 
-int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id);
+int gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id);
 int gsm0408_new_conn(struct gsm_subscriber_connection *conn);
-enum gsm_chan_t get_ctype_by_chreq(struct gsm_network *bts, u_int8_t ra);
-enum gsm_chreq_reason_t get_reason_by_chreq(u_int8_t ra, int neci);
+enum gsm_chan_t get_ctype_by_chreq(struct gsm_network *bts, uint8_t ra);
+enum gsm_chreq_reason_t get_reason_by_chreq(uint8_t ra, int neci);
 void gsm_net_update_ctype(struct gsm_network *net);
 
 int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn);
-int gsm48_tx_mm_auth_req(struct gsm_subscriber_connection *conn, u_int8_t *rand, int key_seq);
+int gsm48_tx_mm_auth_req(struct gsm_subscriber_connection *conn, uint8_t *rand, int key_seq);
 int gsm48_tx_mm_auth_rej(struct gsm_subscriber_connection *conn);
 int gsm48_send_rr_release(struct gsm_lchan *lchan);
 int gsm48_send_rr_ciph_mode(struct gsm_lchan *lchan, int want_imeisv);
-int gsm48_send_rr_app_info(struct gsm_subscriber_connection *conn, u_int8_t apdu_id,
-			   u_int8_t apdu_len, const u_int8_t *apdu);
-int gsm48_send_rr_ass_cmd(struct gsm_lchan *dest_lchan, struct gsm_lchan *lchan, u_int8_t power_class);
+int gsm48_send_rr_app_info(struct gsm_subscriber_connection *conn, uint8_t apdu_id,
+			   uint8_t apdu_len, const uint8_t *apdu);
+int gsm48_send_rr_ass_cmd(struct gsm_lchan *dest_lchan, struct gsm_lchan *lchan, uint8_t power_class);
 int gsm48_send_ho_cmd(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan,
-		      u_int8_t power_command, u_int8_t ho_ref);
+		      uint8_t power_command, uint8_t ho_ref);
 
 int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void *arg);
 
 /* convert a ASCII phone number to call-control BCD */
-int encode_bcd_number(u_int8_t *bcd_lv, u_int8_t max_len,
+int encode_bcd_number(uint8_t *bcd_lv, uint8_t max_len,
 		      int h_len, const char *input);
-int decode_bcd_number(char *output, int output_len, const u_int8_t *bcd_lv,
+int decode_bcd_number(char *output, int output_len, const uint8_t *bcd_lv,
 		      int h_len);
 
-int send_siemens_mrpci(struct gsm_lchan *lchan, u_int8_t *classmark2_lv);
+int send_siemens_mrpci(struct gsm_lchan *lchan, uint8_t *classmark2_lv);
 int gsm48_extract_mi(uint8_t *classmark2, int length, char *mi_string, uint8_t *mi_type);
-int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_string, u_int8_t *mi_type);
+int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_string, uint8_t *mi_type);
 int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn, struct msgb *msg, struct gsm_subscriber *subscr);
 
-int gsm48_lchan_modify(struct gsm_lchan *lchan, u_int8_t lchan_mode);
+int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t lchan_mode);
 int gsm48_rx_rr_modif_ack(struct msgb *msg);
 int gsm48_parse_meas_rep(struct gsm_meas_rep *rep, struct msgb *msg);
 
diff --git a/include/openbsc/gsm_04_08_gprs.h b/include/openbsc/gsm_04_08_gprs.h
index 8de6362..e5c3edd 100644
--- a/include/openbsc/gsm_04_08_gprs.h
+++ b/include/openbsc/gsm_04_08_gprs.h
@@ -2,7 +2,7 @@
 #define _GSM48_GPRS_H
 
 #include <stdint.h>
-#include <osmocore/protocol/gsm_04_08.h>
+#include <osmocom/gsm/protocol/gsm_04_08.h>
 
 /* Table 10.4 / 10.4a, GPRS Mobility Management (GMM) */
 #define GSM48_MT_GMM_ATTACH_REQ		0x01
diff --git a/include/openbsc/gsm_04_11.h b/include/openbsc/gsm_04_11.h
index 5969788..2abe3e2 100644
--- a/include/openbsc/gsm_04_11.h
+++ b/include/openbsc/gsm_04_11.h
@@ -1,26 +1,26 @@
 #ifndef _GSM_04_11_H
 #define _GSM_04_11_H
 
-#include <osmocore/protocol/gsm_04_11.h>
+#include <osmocom/gsm/protocol/gsm_04_11.h>
 
 #define UM_SAPI_SMS 3	/* See GSM 04.05/04.06 */
 
 /* SMS deliver PDU */
 struct sms_deliver {
-	u_int8_t mti:2;		/* message type indicator */
-	u_int8_t mms:1;		/* more messages to send */
-	u_int8_t rp:1;		/* reply path */
-	u_int8_t udhi:1;	/* user data header indicator */
-	u_int8_t sri:1;		/* status report indication */
-	u_int8_t *orig_addr;	/* originating address */
-	u_int8_t pid;		/* protocol identifier */
-	u_int8_t dcs;		/* data coding scheme */
+	uint8_t mti:2;		/* message type indicator */
+	uint8_t mms:1;		/* more messages to send */
+	uint8_t rp:1;		/* reply path */
+	uint8_t udhi:1;	/* user data header indicator */
+	uint8_t sri:1;		/* status report indication */
+	uint8_t *orig_addr;	/* originating address */
+	uint8_t pid;		/* protocol identifier */
+	uint8_t dcs;		/* data coding scheme */
 				/* service centre time stamp */
-	u_int8_t ud_len;	/* user data length */
-	u_int8_t *user_data;	/* user data */
+	uint8_t ud_len;	/* user data length */
+	uint8_t *user_data;	/* user data */
 
-	u_int8_t msg_ref;	/* message reference */
-	u_int8_t *smsc;
+	uint8_t msg_ref;	/* message reference */
+	uint8_t *smsc;
 };
 
 struct msgb;
diff --git a/include/openbsc/gsm_04_80.h b/include/openbsc/gsm_04_80.h
index 796a1c1..0a60652 100644
--- a/include/openbsc/gsm_04_80.h
+++ b/include/openbsc/gsm_04_80.h
@@ -1,9 +1,9 @@
 #ifndef _GSM_04_80_H
 #define _GSM_04_80_H
 
-#include <osmocore/msgb.h>
-#include <osmocore/protocol/gsm_04_80.h>
-#include <osmocore/gsm0480.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/gsm/protocol/gsm_04_80.h>
+#include <osmocom/gsm/gsm0480.h>
 
 struct gsm_subscriber_connection;
 
diff --git a/include/openbsc/gsm_data.h b/include/openbsc/gsm_data.h
index ae448c4..715ff1b 100644
--- a/include/openbsc/gsm_data.h
+++ b/include/openbsc/gsm_data.h
@@ -1,97 +1,12 @@
 #ifndef _GSM_DATA_H
 #define _GSM_DATA_H
 
-#include <sys/types.h>
+#include <stdint.h>
 
-struct osmo_msc_data;
-struct osmo_bsc_sccp_con;
-struct gsm_sms_queue;
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
 
-enum gsm_phys_chan_config {
-	GSM_PCHAN_NONE,
-	GSM_PCHAN_CCCH,
-	GSM_PCHAN_CCCH_SDCCH4,
-	GSM_PCHAN_TCH_F,
-	GSM_PCHAN_TCH_H,
-	GSM_PCHAN_SDCCH8_SACCH8C,
-	GSM_PCHAN_PDCH,		/* GPRS PDCH */
-	GSM_PCHAN_TCH_F_PDCH,	/* TCH/F if used, PDCH otherwise */
-	GSM_PCHAN_UNKNOWN,
-};
-
-enum gsm_chan_t {
-	GSM_LCHAN_NONE,
-	GSM_LCHAN_SDCCH,
-	GSM_LCHAN_TCH_F,
-	GSM_LCHAN_TCH_H,
-	GSM_LCHAN_UNKNOWN,
-};
-
-/* RRLP mode of operation */
-enum rrlp_mode {
-	RRLP_MODE_NONE,
-	RRLP_MODE_MS_BASED,
-	RRLP_MODE_MS_PREF,
-	RRLP_MODE_ASS_PREF,
-};
-
-/* Channel Request reason */
-enum gsm_chreq_reason_t {
-	GSM_CHREQ_REASON_EMERG,
-	GSM_CHREQ_REASON_PAG,
-	GSM_CHREQ_REASON_CALL,
-	GSM_CHREQ_REASON_LOCATION_UPD,
-	GSM_CHREQ_REASON_OTHER,
-};
-
-#include <osmocore/timer.h>
-#include <openbsc/system_information.h>
 #include <openbsc/rest_octets.h>
-#include <openbsc/mncc.h>
-
-#include <osmocore/tlv.h>
-#include <osmocore/bitvec.h>
-#include <osmocore/statistics.h>
-#include <osmocore/gsm_utils.h>
-#include <osmocore/utils.h>
-#include <osmocore/rxlev_stat.h>
-
-#include <osmocore/protocol/gsm_08_58.h>
-
-
-#define TRX_NR_TS	8
-#define TS_MAX_LCHAN	8
-
-#define HARDCODED_ARFCN 123
-#define HARDCODED_TSC	7
-#define HARDCODED_BSIC	0x3f	/* NCC = 7 / BCC = 7 */
-
-/* for multi-drop config */
-#define HARDCODED_BTS0_TS	1
-#define HARDCODED_BTS1_TS	6
-#define HARDCODED_BTS2_TS	11
-
-/* reserved according to GSM 03.03 § 2.4 */
-#define GSM_RESERVED_TMSI   0xFFFFFFFF
-
-enum gsm_hooks {
-	GSM_HOOK_NM_SWLOAD,
-	GSM_HOOK_RR_PAGING,
-	GSM_HOOK_RR_SECURITY,
-};
-
-enum gsm_paging_event {
-	GSM_PAGING_SUCCEEDED,
-	GSM_PAGING_EXPIRED,
-	GSM_PAGING_OOM,
-	GSM_PAGING_BUSY,
-};
-
-enum bts_gprs_mode {
-	BTS_GPRS_NONE = 0,
-	BTS_GPRS_GPRS = 1,
-	BTS_GPRS_EGPRS = 2,
-};
 
 #define OBSC_NM_W_ACK_CB(__msgb) (__msgb)->cb[3]
 
@@ -104,11 +19,11 @@
 	unsigned char *bssgp_cell_id;
 
 	/* Identifiers of a BTS, equal to 'struct bssgp_bts_ctx' */
-	u_int16_t nsei;
-	u_int16_t bvci;
+	uint16_t nsei;
+	uint16_t bvci;
 
 	/* Identifier of a MS (inside BTS), equal to 'struct sgsn_mm_ctx' */
-	u_int32_t tlli;
+	uint32_t tlli;
 } __attribute__((packed));
 #define OBSC_MSGB_CB(__msgb)	((struct openbsc_msgb_cb *)&((__msgb)->cb[0]))
 #define msgb_tlli(__x)		OBSC_MSGB_CB(__x)->tlli
@@ -144,32 +59,18 @@
 struct gsm_auth_info {
 	enum gsm_auth_algo auth_algo;
 	unsigned int a3a8_ki_len;
-	u_int8_t a3a8_ki[16];
+	uint8_t a3a8_ki[16];
 };
 
 struct gsm_auth_tuple {
 	int use_count;
 	int key_seq;
-	u_int8_t rand[16];
-	u_int8_t sres[4];
-	u_int8_t kc[8];
+	uint8_t rand[16];
+	uint8_t sres[4];
+	uint8_t kc[8];
 };
 #define GSM_KEY_SEQ_INVAL	7	/* GSM 04.08 - 10.5.1.2 */
 
-
-struct gsm_lchan;
-struct gsm_subscriber;
-struct gsm_mncc;
-struct rtp_socket;
-struct bsc_api;
-
-/* Network Management State */
-struct gsm_nm_state {
-	u_int8_t operational;
-	u_int8_t administrative;
-	u_int8_t availability;
-};
-
 /*
  * LOCATION UPDATING REQUEST state
  *
@@ -178,7 +79,7 @@
  *	- Accept/Reject according to global policy
  */
 struct gsm_loc_updating_operation {
-        struct timer_list updating_timer;
+        struct osmo_timer_list updating_timer;
 	unsigned int waiting_for_imsi : 1;
 	unsigned int waiting_for_imei : 1;
 	unsigned int key_seq : 4;
@@ -198,7 +99,7 @@
  * a couple of seconds to work around MSC issues.
  */
 struct gsm_anchor_operation {
-	struct timer_list timeout;
+	struct osmo_timer_list timeout;
 };
 
 /* Maximum number of neighbor cells whose average we track */
@@ -208,32 +109,11 @@
 
 /* processed neighbor measurements for one cell */
 struct neigh_meas_proc {
-	u_int16_t arfcn;
-	u_int8_t bsic;
-	u_int8_t rxlev[MAX_WIN_NEIGH_AVG];
+	uint16_t arfcn;
+	uint8_t bsic;
+	uint8_t rxlev[MAX_WIN_NEIGH_AVG];
 	unsigned int rxlev_cnt;
-	u_int8_t last_seen_nr;
-};
-
-#define MAX_A5_KEY_LEN	(128/8)
-#define A38_XOR_MIN_KEY_LEN	12
-#define A38_XOR_MAX_KEY_LEN	16
-#define A38_COMP128_KEY_LEN	16
-#define RSL_ENC_ALG_A5(x)	(x+1)
-
-/* is the data link established? who established it? */
-#define LCHAN_SAPI_UNUSED	0
-#define LCHAN_SAPI_MS		1
-#define LCHAN_SAPI_NET		2
-
-/* state of a logical channel */
-enum gsm_lchan_state {
-	LCHAN_S_NONE,		/* channel is not active */
-	LCHAN_S_ACT_REQ,	/* channel activatin requested */
-	LCHAN_S_ACTIVE,		/* channel is active and operational */
-	LCHAN_S_REL_REQ,	/* channel release has been requested */
-	LCHAN_S_REL_ERR,	/* channel is in an error state */
-	LCHAN_S_INACTIVE,	/* channel is set inactive */
+	uint8_t last_seen_nr;
 };
 
 /* the per subscriber data for lchan */
@@ -264,427 +144,65 @@
 	struct gsm_bts *bts;
 
 	/* for assignment handling */
-	struct timer_list T10;
+	struct osmo_timer_list T10;
 	struct gsm_lchan *secondary_lchan;
 
 };
 
-struct gsm_lchan {
-	/* The TS that we're part of */
-	struct gsm_bts_trx_ts *ts;
-	/* The logical subslot number in the TS */
-	u_int8_t nr;
-	/* The logical channel type */
-	enum gsm_chan_t type;
-	/* RSL channel mode */
-	enum rsl_cmod_spd rsl_cmode;
-	/* If TCH, traffic channel mode */
-	enum gsm48_chan_mode tch_mode;
-	/* State */
-	enum gsm_lchan_state state;
-	/* Power levels for MS and BTS */
-	u_int8_t bs_power;
-	u_int8_t ms_power;
-	/* Encryption information */
-	struct {
-		u_int8_t alg_id;
-		u_int8_t key_len;
-		u_int8_t key[MAX_A5_KEY_LEN];
-	} encr;
 
-	struct timer_list T3101;
-	struct timer_list T3111;
-	struct timer_list error_timer;
+#define ROLE_BSC
+#include "gsm_data_shared.h"
 
-	/* AMR bits */
-	struct gsm48_multi_rate_conf mr_conf;
-	
-	/* Established data link layer services */
-	u_int8_t sapis[8];
-	int sach_deact;
-	int release_reason;
-
-	/* GSM Random Access data */
-	struct gsm48_req_ref *rqd_ref;
-	uint8_t rqd_ta;
-
-	/* cache of last measurement reports on this lchan */
-	struct gsm_meas_rep meas_rep[6];
-	int meas_rep_idx;
-
-	/* table of neighbor cell measurements */
-	struct neigh_meas_proc neigh_meas[MAX_NEIGH_MEAS];
-
-	struct {
-		u_int32_t bound_ip;
-		u_int32_t connect_ip;
-		u_int16_t bound_port;
-		u_int16_t connect_port;
-		u_int16_t conn_id;
-		u_int8_t rtp_payload;
-		u_int8_t rtp_payload2;
-		u_int8_t speech_mode;
-		struct rtp_socket *rtp_socket;
-	} abis_ip;
-
-	struct gsm_subscriber_connection *conn;
-};
-
-struct gsm_e1_subslot {
-	/* Number of E1 link */
-	u_int8_t	e1_nr;
-	/* Number of E1 TS inside E1 link */
-	u_int8_t	e1_ts;
-	/* Sub-slot within the E1 TS, 0xff if full TS */
-	u_int8_t	e1_ts_ss;
-};
-
-#define TS_F_PDCH_MODE	0x1000
-/* One Timeslot in a TRX */
-struct gsm_bts_trx_ts {
-	struct gsm_bts_trx *trx;
-	/* number of this timeslot at the TRX */
-	u_int8_t nr;
-
-	enum gsm_phys_chan_config pchan;
-
-	unsigned int flags;
-	struct gsm_nm_state nm_state;
-	struct tlv_parsed nm_attr;
-	u_int8_t nm_chan_comb;
-
-	struct {
-		/* Parameters below are configured by VTY */
-		int enabled;
-		u_int8_t maio;
-		u_int8_t hsn;
-		struct bitvec arfcns;
-		u_int8_t arfcns_data[1024/8];
-		/* This is the pre-computed MA for channel assignments */
-		struct bitvec ma;
-		u_int8_t ma_len;	/* part of ma_data that is used */
-		u_int8_t ma_data[8];	/* 10.5.2.21: max 8 bytes value part */
-	} hopping;
-
-	/* To which E1 subslot are we connected */
-	struct gsm_e1_subslot e1_link;
-
-	struct gsm_lchan lchan[TS_MAX_LCHAN];
-};
-
-/* One TRX in a BTS */
-struct gsm_bts_trx {
-	/* list header in bts->trx_list */
-	struct llist_head list;
-
-	struct gsm_bts *bts;
-	/* number of this TRX in the BTS */
-	u_int8_t nr;
-	/* human readable name / description */
-	char *description;
-	/* how do we talk RSL with this TRX? */
-	struct gsm_e1_subslot rsl_e1_link;
-	u_int8_t rsl_tei;
-	struct e1inp_sign_link *rsl_link;
-	/* Some BTS (specifically Ericsson RBS) have a per-TRX OML Link */
-	struct e1inp_sign_link *oml_link;
-
-	struct gsm_nm_state nm_state;
-	struct tlv_parsed nm_attr;
-	struct {
-		struct gsm_nm_state nm_state;
-	} bb_transc;
-
-	u_int16_t arfcn;
-	int nominal_power;		/* in dBm */
-	unsigned int max_power_red;	/* in actual dB */
-
-	union {
-		struct {
-			struct {
-				struct gsm_nm_state nm_state;
-			} bbsig;
-			struct {
-				struct gsm_nm_state nm_state;
-			} pa;
-		} bs11;
-		struct {
-			unsigned int test_state;
-			u_int8_t test_nr;
-			struct rxlev_stats rxlev_stat;
-		} ipaccess;
-	};
-	struct gsm_bts_trx_ts ts[TRX_NR_TS];
-};
-
-#define GSM_BTS_SI(bts, i)	(void *)(bts->si_buf[i])
-
-enum gsm_bts_type {
-	GSM_BTS_TYPE_UNKNOWN,
-	GSM_BTS_TYPE_BS11,
-	GSM_BTS_TYPE_NANOBTS,
-	GSM_BTS_TYPE_RBS2000,
-	GSM_BTS_TYPE_HSL_FEMTO,
-};
-
-struct vty;
-
-struct gsm_bts_model {
-	struct llist_head list;
-
-	enum gsm_bts_type type;
-	const char *name;
-
-	int (*oml_rcvmsg)(struct msgb *msg);
-
-	void (*config_write_bts)(struct vty *vty, struct gsm_bts *bts);
-	void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx);
-	void (*config_write_ts)(struct vty *vty, struct gsm_bts_trx_ts *ts);
-
-	struct tlv_definition nm_att_tlvdef;
-
-	struct bitvec features;
-	uint8_t _features_data[128/8];
-};
-
-enum gsm_bts_features {
-	BTS_FEAT_HSCSD,
-	BTS_FEAT_GPRS,
-	BTS_FEAT_EGPRS,
-	BTS_FEAT_ECSD,
-	BTS_FEAT_HOPPING,
-};
-
-/*
- * This keeps track of the paging status of one BTS. It
- * includes a number of pending requests, a back pointer
- * to the gsm_bts, a timer and some more state.
- */
-struct gsm_bts_paging_state {
-	/* pending requests */
-	struct llist_head pending_requests;
-	struct gsm_bts *bts;
-
-	struct timer_list work_timer;
-	struct timer_list credit_timer;
-
-	/* free chans needed */
-	int free_chans_need;
-
-	/* load */
-	u_int16_t available_slots;
-};
-
-struct gsm_envabtse {
-	struct gsm_nm_state nm_state;
-};
-
-struct gsm_bts_gprs_nsvc {
-	struct gsm_bts *bts;
-	/* data read via VTY config file, to configure the BTS
-	 * via OML from BSC */
-	int id;
-	u_int16_t nsvci;
-	u_int16_t local_port;	/* on the BTS */
-	u_int16_t remote_port;	/* on the SGSN */
-	u_int32_t remote_ip;	/* on the SGSN */
-
-	struct gsm_nm_state nm_state;
-};
-
-enum neigh_list_manual_mode {
-	NL_MODE_AUTOMATIC = 0,
-	NL_MODE_MANUAL = 1,
-	NL_MODE_MANUAL_SI5SEP = 2, /* SI2 and SI5 have separate neighbor lists */
-};
-
-/* One BTS */
-struct gsm_bts {
-	/* list header in net->bts_list */
-	struct llist_head list;
-
-	struct gsm_network *network;
-	/* number of ths BTS in network */
-	u_int8_t nr;
-	/* human readable name / description */
-	char *description;
-	/* Cell Identity */
-	u_int16_t cell_identity;
-	/* location area code of this BTS */
-	u_int16_t location_area_code;
-	/* Training Sequence Code */
-	u_int8_t tsc;
-	/* Base Station Identification Code (BSIC) */
-	u_int8_t bsic;
-	/* type of BTS */
-	enum gsm_bts_type type;
-	struct gsm_bts_model *model;
-	enum gsm_band band;
-	/* should the channel allocator allocate channels from high TRX to TRX0,
-	 * rather than starting from TRX0 and go upwards? */
-	int chan_alloc_reverse;
-	/* maximum Tx power that the MS is permitted to use in this cell */
-	int ms_max_power;
-
-	/* how do we talk OML with this TRX? */
-	struct gsm_e1_subslot oml_e1_link;
-	u_int8_t oml_tei;
-	struct e1inp_sign_link *oml_link;
-
-	/* Abis network management O&M handle */
-	struct abis_nm_h *nmh;
-	struct gsm_nm_state nm_state;
-	struct tlv_parsed nm_attr;
-
-	/* number of this BTS on given E1 link */
-	u_int8_t bts_nr;
-
-	/* paging state and control */
-	struct gsm_bts_paging_state paging;
-
-	/* CCCH is on C0 */
-	struct gsm_bts_trx *c0;
-
-	struct {
-		struct gsm_nm_state nm_state;
-	} site_mgr;
-
-	enum neigh_list_manual_mode neigh_list_manual_mode;
-	/* parameters from which we build SYSTEM INFORMATION */
-	struct {
-		struct gsm48_rach_control rach_control;
-		u_int8_t ncc_permitted;
-		struct gsm48_cell_sel_par cell_sel_par;
-		struct gsm48_si_selection_params cell_ro_sel_par; /* rest octet */
-		struct gsm48_cell_options cell_options;
-		struct gsm48_control_channel_descr chan_desc;
-		struct bitvec neigh_list;
-		struct bitvec cell_alloc;
-		struct bitvec si5_neigh_list;
-		struct {
-			/* bitmask large enough for all possible ARFCN's */
-			u_int8_t neigh_list[1024/8];
-			u_int8_t cell_alloc[1024/8];
-			/* If the user wants a different neighbor list in SI5 than in SI2 */
-			u_int8_t si5_neigh_list[1024/8];
-		} data;
-	} si_common;
-
-	/* do we use static (user-defined) system information messages? (bitmask) */
-	uint32_t si_mode_static;
-	/* bitmask of all SI that are present/valid in si_buf */
-	uint32_t si_valid;
-	/* buffers where we put the pre-computed SI */
-	sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE];
-
-	/* ip.accesss Unit ID's have Site/BTS/TRX layout */
-	union {
-		struct {
-			u_int16_t site_id;
-			u_int16_t bts_id;
-			u_int32_t flags;
-		} ip_access;
-		struct {
-			struct {
-				struct gsm_nm_state nm_state;
-			} cclk;
-			struct {
-				struct gsm_nm_state nm_state;
-			} rack;
-			struct gsm_envabtse envabtse[4];
-		} bs11;
-		struct {
-			struct {
-				struct llist_head conn_groups;
-			} is;
-			struct {
-				struct llist_head conn_groups;
-			} con;
-		} rbs2000;
-		struct {
-			unsigned long serno;
-		} hsl;
-	};
-
-	/* Not entirely sure how ip.access specific this is */
-	struct {
-		enum bts_gprs_mode mode;
-		struct {
-			struct gsm_nm_state nm_state;
-			u_int16_t nsei;
-			uint8_t timer[7];
-		} nse;
-		struct {
-			struct gsm_nm_state nm_state;
-			u_int16_t bvci;
-			uint8_t timer[11];
-		} cell;
-		struct gsm_bts_gprs_nsvc nsvc[2];
-		u_int8_t rac;
-	} gprs;
-
-	/* RACH NM values */
-	int rach_b_thresh;
-	int rach_ldavg_slots;
-	
-	/* transceivers */
-	int num_trx;
-	struct llist_head trx_list;
-
-	/* Abis NM queue */
-	struct llist_head abis_queue;
-	int abis_nm_pend;
-};
 
 /* Some statistics of our network */
 struct gsmnet_stats {
 	struct {
-		struct counter *total;
-		struct counter *no_channel;
+		struct osmo_counter *total;
+		struct osmo_counter *no_channel;
 	} chreq;
 	struct {
-		struct counter *attempted;
-		struct counter *no_channel;	/* no channel available */
-		struct counter *timeout;		/* T3103 timeout */
-		struct counter *completed;	/* HO COMPL received */
-		struct counter *failed;		/* HO FAIL received */
+		struct osmo_counter *attempted;
+		struct osmo_counter *no_channel;	/* no channel available */
+		struct osmo_counter *timeout;		/* T3103 timeout */
+		struct osmo_counter *completed;	/* HO COMPL received */
+		struct osmo_counter *failed;		/* HO FAIL received */
 	} handover;
 	struct {
-		struct counter *attach;
-		struct counter *normal;
-		struct counter *periodic;
-		struct counter *detach;
+		struct osmo_counter *attach;
+		struct osmo_counter *normal;
+		struct osmo_counter *periodic;
+		struct osmo_counter *detach;
 	} loc_upd_type;
 	struct {
-		struct counter *reject;
-		struct counter *accept;
+		struct osmo_counter *reject;
+		struct osmo_counter *accept;
 	} loc_upd_resp;
 	struct {
-		struct counter *attempted;
-		struct counter *detached;
-		struct counter *completed;
-		struct counter *expired;
+		struct osmo_counter *attempted;
+		struct osmo_counter *detached;
+		struct osmo_counter *completed;
+		struct osmo_counter *expired;
 	} paging;
 	struct {
-		struct counter *submitted; /* MO SMS submissions */
-		struct counter *no_receiver;
-		struct counter *delivered; /* MT SMS deliveries */
-		struct counter *rp_err_mem;
-		struct counter *rp_err_other;
+		struct osmo_counter *submitted; /* MO SMS submissions */
+		struct osmo_counter *no_receiver;
+		struct osmo_counter *delivered; /* MT SMS deliveries */
+		struct osmo_counter *rp_err_mem;
+		struct osmo_counter *rp_err_other;
 	} sms;
 	struct {
-		struct counter *mo_setup;
-		struct counter *mo_connect_ack;
-		struct counter *mt_setup;
-		struct counter *mt_connect;
+		struct osmo_counter *mo_setup;
+		struct osmo_counter *mo_connect_ack;
+		struct osmo_counter *mt_setup;
+		struct osmo_counter *mt_connect;
 	} call;
 	struct {
-		struct counter *rf_fail;
-		struct counter *rll_err;
+		struct osmo_counter *rf_fail;
+		struct osmo_counter *rll_err;
 	} chan;
 	struct {
-		struct counter *oml_fail;
-		struct counter *rsl_fail;
+		struct osmo_counter *oml_fail;
+		struct osmo_counter *rsl_fail;
 	} bts;
 };
 
@@ -699,8 +217,8 @@
 
 struct gsm_network {
 	/* global parameters */
-	u_int16_t country_code;
-	u_int16_t network_code;
+	uint16_t country_code;
+	uint16_t network_code;
 	char *name_long;
 	char *name_short;
 	enum gsm_auth_policy auth_policy;
@@ -780,50 +298,32 @@
 	struct gsm_subscriber *receiver;
 
 	unsigned long validity_minutes;
-	u_int8_t reply_path_req;
-	u_int8_t status_rep_req;
-	u_int8_t ud_hdr_ind;
-	u_int8_t protocol_id;
-	u_int8_t data_coding_scheme;
-	u_int8_t msg_ref;
+	uint8_t reply_path_req;
+	uint8_t status_rep_req;
+	uint8_t ud_hdr_ind;
+	uint8_t protocol_id;
+	uint8_t data_coding_scheme;
+	uint8_t msg_ref;
 	char dest_addr[20+1];	/* DA LV is 12 bytes max, i.e. 10 bytes
 				 * BCD == 20 bytes string */
-	u_int8_t user_data_len;
-	u_int8_t user_data[SMS_TEXT_SIZE];
+	uint8_t user_data_len;
+	uint8_t user_data[SMS_TEXT_SIZE];
 
 	char text[SMS_TEXT_SIZE];
 };
 
-
-struct gsm_network *gsm_network_init(u_int16_t country_code, u_int16_t network_code,
+struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_code,
 				     int (*mncc_recv)(struct gsm_network *, struct msgb *));
-struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type,
-			      u_int8_t tsc, u_int8_t bsic);
-struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);
 int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type);
 
 struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num);
 
 /* Get reference to a neighbor cell on a given BCCH ARFCN */
 struct gsm_bts *gsm_bts_neighbor(const struct gsm_bts *bts,
-				 u_int16_t arfcn, u_int8_t bsic);
+				 uint16_t arfcn, uint8_t bsic);
 
-struct gsm_bts_trx *gsm_bts_trx_num(struct gsm_bts *bts, int num);
-
-const char *gsm_pchan_name(enum gsm_phys_chan_config c);
-enum gsm_phys_chan_config gsm_pchan_parse(const char *name);
-const char *gsm_lchant_name(enum gsm_chan_t c);
-const char *gsm_chreq_name(enum gsm_chreq_reason_t c);
-char *gsm_trx_name(struct gsm_bts_trx *trx);
-char *gsm_ts_name(struct gsm_bts_trx_ts *ts);
-char *gsm_lchan_name(struct gsm_lchan *lchan);
-const char *gsm_lchans_name(enum gsm_lchan_state s);
-
-void set_ts_e1link(struct gsm_bts_trx_ts *ts, u_int8_t e1_nr,
-		   u_int8_t e1_ts, u_int8_t e1_ts_ss);
 enum gsm_bts_type parse_btstype(const char *arg);
 const char *btstype2str(enum gsm_bts_type type);
-struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr);
 struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
 				struct gsm_bts *start_bts);
 
@@ -853,7 +353,6 @@
 	return 0;
 }
 
-
 enum gsm_auth_policy gsm_auth_policy_parse(const char *arg);
 const char *gsm_auth_policy_name(enum gsm_auth_policy policy);
 
@@ -863,17 +362,24 @@
 enum bts_gprs_mode bts_gprs_mode_parse(const char *arg);
 const char *bts_gprs_mode_name(enum bts_gprs_mode mode);
 
-void gsm_trx_lock_rf(struct gsm_bts_trx *trx, int locked);
-
-int gsm48_ra_id_by_bts(u_int8_t *buf, struct gsm_bts *bts);
+int gsm48_ra_id_by_bts(uint8_t *buf, struct gsm_bts *bts);
 void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts);
 struct gsm_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan);
 
 int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum gsm_bts_features feat);
-int gsm_bts_has_feature(struct gsm_bts *bts, enum gsm_bts_features feat);
 int gsm_bts_model_register(struct gsm_bts_model *model);
 
 struct gsm_subscriber_connection *subscr_con_allocate(struct gsm_lchan *lchan);
 void subscr_con_free(struct gsm_subscriber_connection *conn);
 
-#endif
+struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net,
+					enum gsm_bts_type type,
+					uint8_t tsc, uint8_t bsic);
+void set_ts_e1link(struct gsm_bts_trx_ts *ts, uint8_t e1_nr,
+		   uint8_t e1_ts, uint8_t e1_ts_ss);
+
+void gsm_trx_lock_rf(struct gsm_bts_trx *trx, int locked);
+int gsm_bts_has_feature(struct gsm_bts *bts, enum gsm_bts_features feat);
+struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr);
+
+#endif /* _GSM_DATA_H */
diff --git a/include/openbsc/gsm_data_shared.h b/include/openbsc/gsm_data_shared.h
new file mode 100644
index 0000000..011e0aa
--- /dev/null
+++ b/include/openbsc/gsm_data_shared.h
@@ -0,0 +1,590 @@
+#ifndef _GSM_DATA_SHAREDH
+#define _GSM_DATA_SHAREDH
+
+#include <stdbool.h>
+#include <stdint.h>
+
+#include <osmocom/core/timer.h>
+#include <osmocom/core/bitvec.h>
+#include <osmocom/core/statistics.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/gsm/gsm_utils.h>
+#include <osmocom/gsm/tlv.h>
+#include <osmocom/gsm/rxlev_stat.h>
+#include <osmocom/gsm/sysinfo.h>
+
+#include <osmocom/gsm/protocol/gsm_08_58.h>
+#include <osmocom/gsm/protocol/gsm_12_21.h>
+
+struct osmo_msc_data;
+struct osmo_bsc_sccp_con;
+struct gsm_sms_queue;
+
+/* RRLP mode of operation */
+enum rrlp_mode {
+	RRLP_MODE_NONE,
+	RRLP_MODE_MS_BASED,
+	RRLP_MODE_MS_PREF,
+	RRLP_MODE_ASS_PREF,
+};
+
+/* Channel Request reason */
+enum gsm_chreq_reason_t {
+	GSM_CHREQ_REASON_EMERG,
+	GSM_CHREQ_REASON_PAG,
+	GSM_CHREQ_REASON_CALL,
+	GSM_CHREQ_REASON_LOCATION_UPD,
+	GSM_CHREQ_REASON_OTHER,
+};
+
+#define TRX_NR_TS	8
+#define TS_MAX_LCHAN	8
+
+#define HARDCODED_ARFCN 123
+#define HARDCODED_TSC	7
+#define HARDCODED_BSIC	0x3f	/* NCC = 7 / BCC = 7 */
+
+/* for multi-drop config */
+#define HARDCODED_BTS0_TS	1
+#define HARDCODED_BTS1_TS	6
+#define HARDCODED_BTS2_TS	11
+
+/* reserved according to GSM 03.03 § 2.4 */
+#define GSM_RESERVED_TMSI   0xFFFFFFFF
+
+enum gsm_hooks {
+	GSM_HOOK_NM_SWLOAD,
+	GSM_HOOK_RR_PAGING,
+	GSM_HOOK_RR_SECURITY,
+};
+
+enum gsm_paging_event {
+	GSM_PAGING_SUCCEEDED,
+	GSM_PAGING_EXPIRED,
+	GSM_PAGING_OOM,
+	GSM_PAGING_BUSY,
+};
+
+enum bts_gprs_mode {
+	BTS_GPRS_NONE = 0,
+	BTS_GPRS_GPRS = 1,
+	BTS_GPRS_EGPRS = 2,
+};
+
+struct gsm_lchan;
+struct gsm_subscriber;
+struct gsm_mncc;
+struct rtp_socket;
+struct bsc_api;
+
+/* Network Management State */
+struct gsm_nm_state {
+	uint8_t operational;
+	uint8_t administrative;
+	uint8_t availability;
+};
+
+struct gsm_abis_mo {
+	uint8_t obj_class;
+	struct abis_om_obj_inst obj_inst;
+	const char *name;
+	struct gsm_nm_state nm_state;
+	struct tlv_parsed *nm_attr;
+	struct gsm_bts *bts;
+};
+
+#define MAX_A5_KEY_LEN	(128/8)
+#define A38_XOR_MIN_KEY_LEN	12
+#define A38_XOR_MAX_KEY_LEN	16
+#define A38_COMP128_KEY_LEN	16
+#define RSL_ENC_ALG_A5(x)	(x+1)
+
+/* is the data link established? who established it? */
+#define LCHAN_SAPI_UNUSED	0
+#define LCHAN_SAPI_MS		1
+#define LCHAN_SAPI_NET		2
+
+/* state of a logical channel */
+enum gsm_lchan_state {
+	LCHAN_S_NONE,		/* channel is not active */
+	LCHAN_S_ACT_REQ,	/* channel activatin requested */
+	LCHAN_S_ACTIVE,		/* channel is active and operational */
+	LCHAN_S_REL_REQ,	/* channel release has been requested */
+	LCHAN_S_REL_ERR,	/* channel is in an error state */
+	LCHAN_S_INACTIVE,	/* channel is set inactive */
+};
+
+/* BTS ONLY */
+#define MAX_NUM_UL_MEAS	104
+#define LC_UL_M_F_L1_VALID	(1 << 0)
+#define LC_UL_M_F_RES_VALID	(1 << 1)
+
+struct bts_ul_meas {
+	/* BER in units of 0.01%: 10.000 == 100% ber, 0 == 0% ber */
+	uint16_t ber10k;
+	/* timing advance offset (in quarter bits) */
+	int16_t ta_offs_qbits;
+	/* C/I ratio in dB */
+	float c_i;
+	/* flags */
+	uint8_t is_sub:1;
+	/* RSSI in dBm * -1 */
+	uint8_t inv_rssi;
+};
+/* /BTS ONLY */
+
+struct gsm_lchan {
+	/* The TS that we're part of */
+	struct gsm_bts_trx_ts *ts;
+	/* The logical subslot number in the TS */
+	uint8_t nr;
+	/* The logical channel type */
+	enum gsm_chan_t type;
+	/* RSL channel mode */
+	enum rsl_cmod_spd rsl_cmode;
+	/* If TCH, traffic channel mode */
+	enum gsm48_chan_mode tch_mode;
+	/* State */
+	enum gsm_lchan_state state;
+	/* Power levels for MS and BTS */
+	uint8_t bs_power;
+	uint8_t ms_power;
+	/* Encryption information */
+	struct {
+		uint8_t alg_id;
+		uint8_t key_len;
+		uint8_t key[MAX_A5_KEY_LEN];
+	} encr;
+
+	/* AMR bits */
+	struct gsm48_multi_rate_conf mr_conf;
+
+	/* Established data link layer services */
+	uint8_t sapis[8];
+	int sach_deact;
+	int release_reason;
+
+	struct {
+		uint32_t bound_ip;
+		uint32_t connect_ip;
+		uint16_t bound_port;
+		uint16_t connect_port;
+		uint16_t conn_id;
+		uint8_t rtp_payload;
+		uint8_t rtp_payload2;
+		uint8_t speech_mode;
+		struct rtp_socket *rtp_socket;
+	} abis_ip;
+
+	uint8_t rqd_ta;
+
+#ifdef ROLE_BSC
+	struct osmo_timer_list T3101;
+	struct osmo_timer_list T3111;
+	struct osmo_timer_list error_timer;
+
+	/* table of neighbor cell measurements */
+	struct neigh_meas_proc neigh_meas[MAX_NEIGH_MEAS];
+
+	/* cache of last measurement reports on this lchan */
+	struct gsm_meas_rep meas_rep[6];
+	int meas_rep_idx;
+
+	/* GSM Random Access data */
+	struct gsm48_req_ref *rqd_ref;
+
+	struct gsm_subscriber_connection *conn;
+#else
+	struct lapdm_channel lapdm_ch;
+	struct {
+		/* bitmask of all SI that are present/valid in si_buf */
+		uint32_t valid;
+		uint32_t last;
+		/* buffers where we put the pre-computed SI */
+		sysinfo_buf_t buf[_MAX_SYSINFO_TYPE];
+	} si;
+	struct {
+		uint8_t flags;
+		/* RSL measurment result number, 0 at lchan_act */
+		uint8_t res_nr;
+		/* current Tx power level of the BTS */
+		uint8_t bts_tx_pwr;
+		/* number of measurements stored in array below */
+		uint8_t num_ul_meas;
+		struct bts_ul_meas uplink[MAX_NUM_UL_MEAS];
+		/* last L1 header from the MS */
+		uint8_t l1_info[2];
+		struct {
+			uint8_t rxlev_full;
+			uint8_t rxlev_sub;
+			uint8_t rxqual_full;
+			uint8_t rxqual_sub;
+		} res;
+	} meas;
+#endif
+};
+
+
+struct gsm_e1_subslot {
+	/* Number of E1 link */
+	uint8_t	e1_nr;
+	/* Number of E1 TS inside E1 link */
+	uint8_t	e1_ts;
+	/* Sub-slot within the E1 TS, 0xff if full TS */
+	uint8_t	e1_ts_ss;
+};
+
+#define TS_F_PDCH_MODE	0x1000
+/* One Timeslot in a TRX */
+struct gsm_bts_trx_ts {
+	struct gsm_bts_trx *trx;
+	/* number of this timeslot at the TRX */
+	uint8_t nr;
+
+	enum gsm_phys_chan_config pchan;
+
+	unsigned int flags;
+	struct gsm_abis_mo mo;
+	struct tlv_parsed nm_attr;
+	uint8_t nm_chan_comb;
+	int tsc;		/* -1 == use BTS TSC */
+
+	struct {
+		/* Parameters below are configured by VTY */
+		int enabled;
+		uint8_t maio;
+		uint8_t hsn;
+		struct bitvec arfcns;
+		uint8_t arfcns_data[1024/8];
+		/* This is the pre-computed MA for channel assignments */
+		struct bitvec ma;
+		uint8_t ma_len;	/* part of ma_data that is used */
+		uint8_t ma_data[8];	/* 10.5.2.21: max 8 bytes value part */
+	} hopping;
+
+	/* To which E1 subslot are we connected */
+	struct gsm_e1_subslot e1_link;
+
+	struct gsm_lchan lchan[TS_MAX_LCHAN];
+};
+
+/* One TRX in a BTS */
+struct gsm_bts_trx {
+	/* list header in bts->trx_list */
+	struct llist_head list;
+
+	struct gsm_bts *bts;
+	/* number of this TRX in the BTS */
+	uint8_t nr;
+	/* human readable name / description */
+	char *description;
+	/* how do we talk RSL with this TRX? */
+	struct gsm_e1_subslot rsl_e1_link;
+	uint8_t rsl_tei;
+	struct e1inp_sign_link *rsl_link;
+	/* Some BTS (specifically Ericsson RBS) have a per-TRX OML Link */
+	struct e1inp_sign_link *oml_link;
+
+	struct gsm_abis_mo mo;
+	struct tlv_parsed nm_attr;
+	struct {
+		struct gsm_abis_mo mo;
+	} bb_transc;
+
+	uint16_t arfcn;
+	int nominal_power;		/* in dBm */
+	unsigned int max_power_red;	/* in actual dB */
+
+	struct {
+		void *l1h;
+	} role_bts;
+
+	union {
+		struct {
+			struct {
+				struct gsm_abis_mo mo;
+			} bbsig;
+			struct {
+				struct gsm_abis_mo mo;
+			} pa;
+		} bs11;
+		struct {
+			unsigned int test_state;
+			uint8_t test_nr;
+			struct rxlev_stats rxlev_stat;
+		} ipaccess;
+	};
+	struct gsm_bts_trx_ts ts[TRX_NR_TS];
+};
+
+#define GSM_BTS_SI(bts, i)	(void *)(bts->si_buf[i])
+
+enum gsm_bts_type {
+	GSM_BTS_TYPE_UNKNOWN,
+	GSM_BTS_TYPE_BS11,
+	GSM_BTS_TYPE_NANOBTS,
+	GSM_BTS_TYPE_RBS2000,
+	GSM_BTS_TYPE_HSL_FEMTO,
+};
+
+struct vty;
+
+struct gsm_bts_model {
+	struct llist_head list;
+
+	enum gsm_bts_type type;
+	const char *name;
+
+	bool started;
+	int (*start)(struct gsm_network *net);
+	int (*oml_rcvmsg)(struct msgb *msg);
+
+	void (*config_write_bts)(struct vty *vty, struct gsm_bts *bts);
+	void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx);
+	void (*config_write_ts)(struct vty *vty, struct gsm_bts_trx_ts *ts);
+
+	struct tlv_definition nm_att_tlvdef;
+
+	struct bitvec features;
+	uint8_t _features_data[128/8];
+};
+
+enum gsm_bts_features {
+	BTS_FEAT_HSCSD,
+	BTS_FEAT_GPRS,
+	BTS_FEAT_EGPRS,
+	BTS_FEAT_ECSD,
+	BTS_FEAT_HOPPING,
+};
+
+/*
+ * This keeps track of the paging status of one BTS. It
+ * includes a number of pending requests, a back pointer
+ * to the gsm_bts, a timer and some more state.
+ */
+struct gsm_bts_paging_state {
+	/* pending requests */
+	struct llist_head pending_requests;
+	struct gsm_bts *bts;
+
+	struct osmo_timer_list work_timer;
+	struct osmo_timer_list credit_timer;
+
+	/* free chans needed */
+	int free_chans_need;
+
+	/* load */
+	uint16_t available_slots;
+};
+
+struct gsm_envabtse {
+	struct gsm_abis_mo mo;
+};
+
+struct gsm_bts_gprs_nsvc {
+	struct gsm_bts *bts;
+	/* data read via VTY config file, to configure the BTS
+	 * via OML from BSC */
+	int id;
+	uint16_t nsvci;
+	uint16_t local_port;	/* on the BTS */
+	uint16_t remote_port;	/* on the SGSN */
+	uint32_t remote_ip;	/* on the SGSN */
+
+	struct gsm_abis_mo mo;
+};
+
+enum neigh_list_manual_mode {
+	NL_MODE_AUTOMATIC = 0,
+	NL_MODE_MANUAL = 1,
+	NL_MODE_MANUAL_SI5SEP = 2, /* SI2 and SI5 have separate neighbor lists */
+};
+
+/* One BTS */
+struct gsm_bts {
+	/* list header in net->bts_list */
+	struct llist_head list;
+
+	/* number of ths BTS in network */
+	uint8_t nr;
+	/* human readable name / description */
+	char *description;
+	/* Cell Identity */
+	uint16_t cell_identity;
+	/* location area code of this BTS */
+	uint16_t location_area_code;
+	/* Training Sequence Code */
+	uint8_t tsc;
+	/* Base Station Identification Code (BSIC) */
+	uint8_t bsic;
+	/* type of BTS */
+	enum gsm_bts_type type;
+	struct gsm_bts_model *model;
+	enum gsm_band band;
+	/* maximum Tx power that the MS is permitted to use in this cell */
+	int ms_max_power;
+
+	/* how do we talk OML with this TRX? */
+	struct gsm_e1_subslot oml_e1_link;
+	uint8_t oml_tei;
+	struct e1inp_sign_link *oml_link;
+
+	/* Abis network management O&M handle */
+	struct abis_nm_h *nmh;
+
+	struct gsm_abis_mo mo;
+
+	/* number of this BTS on given E1 link */
+	uint8_t bts_nr;
+
+	/* paging state and control */
+	struct gsm_bts_paging_state paging;
+
+	/* CCCH is on C0 */
+	struct gsm_bts_trx *c0;
+
+	struct {
+		struct gsm_abis_mo mo;
+	} site_mgr;
+
+	/* bitmask of all SI that are present/valid in si_buf */
+	uint32_t si_valid;
+	/* buffers where we put the pre-computed SI */
+	sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE];
+
+	/* ip.accesss Unit ID's have Site/BTS/TRX layout */
+	union {
+		struct {
+			uint16_t site_id;
+			uint16_t bts_id;
+			uint32_t flags;
+		} ip_access;
+		struct {
+			struct {
+				struct gsm_abis_mo mo;
+			} cclk;
+			struct {
+				struct gsm_abis_mo mo;
+			} rack;
+			struct gsm_envabtse envabtse[4];
+		} bs11;
+		struct {
+			struct {
+				struct gsm_abis_mo mo;
+				struct llist_head conn_groups;
+			} is;
+			struct {
+				struct gsm_abis_mo mo;
+				struct llist_head conn_groups;
+			} con;
+			struct {
+				struct gsm_abis_mo mo;
+			} dp;
+			struct {
+				struct gsm_abis_mo mo;
+			} tf;
+		} rbs2000;
+		struct {
+			unsigned long serno;
+		} hsl;
+	};
+
+	/* Not entirely sure how ip.access specific this is */
+	struct {
+		enum bts_gprs_mode mode;
+		struct {
+			struct gsm_abis_mo mo;
+			uint16_t nsei;
+			uint8_t timer[7];
+		} nse;
+		struct {
+			struct gsm_abis_mo mo;
+			uint16_t bvci;
+			uint8_t timer[11];
+		} cell;
+		struct gsm_bts_gprs_nsvc nsvc[2];
+		uint8_t rac;
+	} gprs;
+
+	/* RACH NM values */
+	int rach_b_thresh;
+	int rach_ldavg_slots;
+
+	/* transceivers */
+	int num_trx;
+	struct llist_head trx_list;
+
+#ifdef ROLE_BSC
+	/* Abis NM queue */
+	struct llist_head abis_queue;
+	int abis_nm_pend;
+
+	struct gsm_network *network;
+
+	/* should the channel allocator allocate channels from high TRX to TRX0,
+	 * rather than starting from TRX0 and go upwards? */
+	int chan_alloc_reverse;
+
+	enum neigh_list_manual_mode neigh_list_manual_mode;
+	/* parameters from which we build SYSTEM INFORMATION */
+	struct {
+		struct gsm48_rach_control rach_control;
+		uint8_t ncc_permitted;
+		struct gsm48_cell_sel_par cell_sel_par;
+		struct gsm48_si_selection_params cell_ro_sel_par; /* rest octet */
+		struct gsm48_cell_options cell_options;
+		struct gsm48_control_channel_descr chan_desc;
+		struct bitvec neigh_list;
+		struct bitvec cell_alloc;
+		struct bitvec si5_neigh_list;
+		struct {
+			/* bitmask large enough for all possible ARFCN's */
+			uint8_t neigh_list[1024/8];
+			uint8_t cell_alloc[1024/8];
+			/* If the user wants a different neighbor list in SI5 than in SI2 */
+			uint8_t si5_neigh_list[1024/8];
+		} data;
+	} si_common;
+
+	/* do we use static (user-defined) system information messages? (bitmask) */
+	uint32_t si_mode_static;
+#endif /* ROLE_BSC */
+	void *role;
+};
+
+
+struct gsm_bts *gsm_bts_alloc(void *talloc_ctx);
+struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts);
+
+struct gsm_bts_trx *gsm_bts_trx_num(struct gsm_bts *bts, int num);
+
+const char *gsm_pchan_name(enum gsm_phys_chan_config c);
+enum gsm_phys_chan_config gsm_pchan_parse(const char *name);
+const char *gsm_lchant_name(enum gsm_chan_t c);
+const char *gsm_chreq_name(enum gsm_chreq_reason_t c);
+char *gsm_trx_name(struct gsm_bts_trx *trx);
+char *gsm_ts_name(struct gsm_bts_trx_ts *ts);
+char *gsm_lchan_name(struct gsm_lchan *lchan);
+const char *gsm_lchans_name(enum gsm_lchan_state s);
+
+
+void gsm_abis_mo_reset(struct gsm_abis_mo *mo);
+
+struct gsm_abis_mo *
+gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,
+	    struct abis_om_obj_inst *obj_inst);
+
+struct gsm_nm_state *
+gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class,
+		 struct abis_om_obj_inst *obj_inst);
+void *
+gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,
+	     struct abis_om_obj_inst *obj_inst);
+
+/* reset the state of all MO in the BTS */
+void gsm_bts_mo_reset(struct gsm_bts *bts);
+
+uint8_t gsm_ts2chan_nr(const struct gsm_bts_trx_ts *ts, uint8_t lchan_nr);
+uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan);
+
+#endif
diff --git a/include/openbsc/gsm_subscriber.h b/include/openbsc/gsm_subscriber.h
index c365bc7..6cf8573 100644
--- a/include/openbsc/gsm_subscriber.h
+++ b/include/openbsc/gsm_subscriber.h
@@ -1,9 +1,8 @@
 #ifndef _GSM_SUBSCR_H
 #define _GSM_SUBSCR_H
 
-#include <sys/types.h>
 #include "gsm_data.h"
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
 
 #define GSM_IMEI_LENGTH 17
 #define GSM_IMSI_LENGTH 17
@@ -24,24 +23,24 @@
 	char name[GSM_NAME_LENGTH];
 
 	struct gsm48_classmark1 classmark1;
-	u_int8_t classmark2_len;
-	u_int8_t classmark2[3];
-	u_int8_t classmark3_len;
-	u_int8_t classmark3[14];
+	uint8_t classmark2_len;
+	uint8_t classmark2[3];
+	uint8_t classmark3_len;
+	uint8_t classmark3[14];
 };
 
 struct gsm_subscriber {
 	struct gsm_network *net;
 	long long unsigned int id;
 	char imsi[GSM_IMSI_LENGTH];
-	u_int32_t tmsi;
-	u_int16_t lac;
+	uint32_t tmsi;
+	uint16_t lac;
 	char name[GSM_NAME_LENGTH];
 	char extension[GSM_EXTENSION_LENGTH];
 	int authorized;
 
 	/* Temporary field which is not stored in the DB/HLR */
-	u_int32_t flags;
+	uint32_t flags;
 
 	/* Every user can only have one equipment in use at any given
 	 * point in time */
@@ -72,7 +71,7 @@
 struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr);
 struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr);
 struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net,
-					  u_int32_t tmsi);
+					  uint32_t tmsi);
 struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net,
 					  const char *imsi);
 struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net,
diff --git a/include/openbsc/ipaccess.h b/include/openbsc/ipaccess.h
index 1d00d97..c2ca2a5 100644
--- a/include/openbsc/ipaccess.h
+++ b/include/openbsc/ipaccess.h
@@ -3,56 +3,8 @@
 
 #include "e1_input.h"
 #include "gsm_subscriber.h"
-#include <osmocore/linuxlist.h>
-
-#define IPA_TCP_PORT_OML	3002
-#define IPA_TCP_PORT_RSL	3003
-
-struct ipaccess_head {
-	u_int16_t len;	/* network byte order */
-	u_int8_t proto;
-	u_int8_t data[0];
-} __attribute__ ((packed));
-
-struct ipaccess_head_ext {
-	uint8_t proto;
-	uint8_t data[0];
-} __attribute__ ((packed));
-
-enum ipaccess_proto {
-	IPAC_PROTO_RSL		= 0x00,
-	IPAC_PROTO_IPACCESS	= 0xfe,
-	IPAC_PROTO_SCCP		= 0xfd,
-	IPAC_PROTO_OML		= 0xff,
-
-
-	/* OpenBSC extensions */
-	IPAC_PROTO_OSMO		= 0xee,
-	IPAC_PROTO_MGCP_OLD	= 0xfc,
-};
-
-enum ipaccess_msgtype {
-	IPAC_MSGT_PING		= 0x00,
-	IPAC_MSGT_PONG		= 0x01,
-	IPAC_MSGT_ID_GET	= 0x04,
-	IPAC_MSGT_ID_RESP	= 0x05,
-	IPAC_MSGT_ID_ACK	= 0x06,
-
-	/* OpenBSC extension */
-	IPAC_MSGT_SCCP_OLD	= 0xff,
-};
-
-enum ipaccess_id_tags {
-	IPAC_IDTAG_SERNR		= 0x00,
-	IPAC_IDTAG_UNITNAME		= 0x01,
-	IPAC_IDTAG_LOCATION1		= 0x02,
-	IPAC_IDTAG_LOCATION2		= 0x03,
-	IPAC_IDTAG_EQUIPVERS		= 0x04,
-	IPAC_IDTAG_SWVERSION		= 0x05,
-	IPAC_IDTAG_IPADDR		= 0x06,
-	IPAC_IDTAG_MACADDR		= 0x07,
-	IPAC_IDTAG_UNIT			= 0x08,
-};
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/gsm/protocol/ipaccess.h>
 
 struct ipac_msgt_sccp_state {
 	uint8_t	src_ref[3];
@@ -62,54 +14,38 @@
 	char		imsi[GSM_IMSI_LENGTH];
 } __attribute__((packed));
 
+/*
+ * @add_remove 0 for remove, 1 for add, 3 to asK
+ * @nr_lacs Number of extra lacs inside this package
+ * @lac One lac entry
+ */
+struct ipac_ext_lac_cmd {
+	uint8_t add_remove;
+	uint8_t nr_extra_lacs;
+	uint16_t lac;
+	uint8_t data[0];
+} __attribute__((packed));
+
 int ipaccess_connect(struct e1inp_line *line, struct sockaddr_in *sa);
 
 /*
  * methods for parsing and sending a message
  */
-int ipaccess_rcvmsg_base(struct msgb *msg, struct bsc_fd *bfd);
-struct msgb *ipaccess_read_msg(struct bsc_fd *bfd, int *error);
+int ipaccess_rcvmsg_base(struct msgb *msg, struct osmo_fd *bfd);
+struct msgb *ipaccess_read_msg(struct osmo_fd *bfd, int *error);
 void ipaccess_prepend_header(struct msgb *msg, int proto);
+void ipaccess_prepend_header_ext(struct msgb *msg, int proto);
+int ipaccess_send_pong(int fd);
 int ipaccess_send_id_ack(int fd);
 int ipaccess_send_id_req(int fd);
 
+const char *ipaccess_idtag_name(uint8_t tag);
 int ipaccess_idtag_parse(struct tlv_parsed *dec, unsigned char *buf, int len);
+int ipaccess_parse_unitid(const char *str, uint16_t *site_id, uint16_t *bts_id, uint16_t *trx_id);
 
 int ipaccess_drop_oml(struct gsm_bts *bts);
 int ipaccess_drop_rsl(struct gsm_bts_trx *trx);
 
-/*
- * Firmware specific header
- */
-struct sdp_firmware {
-	char magic[4];
-	char more_magic[2];
-	u_int16_t more_more_magic;
-	u_int32_t header_length;
-	u_int32_t file_length;
-	char sw_part[20];
-	char text1[64];
-	char time[12];
-	char date[14];
-	char text2[10];
-	char version[20];
-	u_int16_t table_offset;
-	/* stuff i don't know */
-} __attribute__((packed));
-
-struct sdp_header_entry {
-	u_int16_t something1;
-	char text1[64];
-	char time[12];
-	char date[14];
-	char text2[10];
-	char version[20];
-	u_int32_t length;
-	u_int32_t addr1;
-	u_int32_t addr2;
-	u_int32_t start;
-} __attribute__((packed));
-
 struct sdp_header_item {
 	struct sdp_header_entry header_entry;
 	struct llist_head entry;
diff --git a/include/openbsc/meas_rep.h b/include/openbsc/meas_rep.h
index 3c2c8d1..f235df6 100644
--- a/include/openbsc/meas_rep.h
+++ b/include/openbsc/meas_rep.h
@@ -1,21 +1,23 @@
 #ifndef _MEAS_REP_H
 #define _MEAS_REP_H
 
+#include <stdint.h>
+
 #define MRC_F_PROCESSED	0x0001
 
 /* extracted from a L3 measurement report IE */
 struct gsm_meas_rep_cell {
-	u_int8_t rxlev;
-	u_int8_t bsic;
-	u_int8_t neigh_idx;
-	u_int16_t arfcn;
+	uint8_t rxlev;
+	uint8_t bsic;
+	uint8_t neigh_idx;
+	uint16_t arfcn;
 	unsigned int flags;
 };
 
 /* RX Level and RX Quality */
 struct gsm_rx_lev_qual {
-	u_int8_t rx_lev;
-	u_int8_t rx_qual;
+	uint8_t rx_lev;
+	uint8_t rx_qual;
 };
 
 /* unidirectional measumrement report */
@@ -38,7 +40,7 @@
 	struct gsm_lchan *lchan;
 
 	/* number of the measurement report */
-	u_int8_t nr;
+	uint8_t nr;
 	/* flags, see MEAS_REP_F_* */
 	unsigned int flags;
 
@@ -46,11 +48,11 @@
 	struct gsm_meas_rep_unidir ul;
 	struct gsm_meas_rep_unidir dl;
 
-	u_int8_t bs_power;
-	u_int8_t ms_timing_offset;
+	uint8_t bs_power;
+	uint8_t ms_timing_offset;
 	struct {
 		int8_t pwr;	/* MS power in dBm */
-		u_int8_t ta;	/* MS timing advance */
+		uint8_t ta;	/* MS timing advance */
 	} ms_l1;
 
 	/* neighbor measurement reports for up to 6 cells */
diff --git a/include/openbsc/mgcp.h b/include/openbsc/mgcp.h
index 516b76e..b9f8116 100644
--- a/include/openbsc/mgcp.h
+++ b/include/openbsc/mgcp.h
@@ -23,8 +23,8 @@
 #ifndef OPENBSC_MGCP_H
 #define OPENBSC_MGCP_H
 
-#include <osmocore/msgb.h>
-#include <osmocore/write_queue.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/write_queue.h>
 
 #include "debug.h"
 
@@ -135,7 +135,7 @@
 	struct in_addr transcoder_in;
 	int transcoder_remote_base;
 
-	struct write_queue gw_fd;
+	struct osmo_wqueue gw_fd;
 
 	struct mgcp_port_range bts_ports;
 	struct mgcp_port_range net_ports;
diff --git a/include/openbsc/mgcp_internal.h b/include/openbsc/mgcp_internal.h
index 7c6bb54..a9d5149 100644
--- a/include/openbsc/mgcp_internal.h
+++ b/include/openbsc/mgcp_internal.h
@@ -23,7 +23,7 @@
 #ifndef OPENBSC_MGCP_DATA_H
 #define OPENBSC_MGCP_DATA_H
 
-#include <osmocore/select.h>
+#include <osmocom/core/select.h>
 
 #define CI_UNUSED 0
 
@@ -66,8 +66,8 @@
 	/*
 	 * Each end has a socket...
 	 */
-	struct bsc_fd rtp;
-	struct bsc_fd rtcp;
+	struct osmo_fd rtp;
+	struct osmo_fd rtcp;
 
 	int local_port;
 	int local_alloc;
diff --git a/include/openbsc/mncc.h b/include/openbsc/mncc.h
index e514c19..ed1bfd6 100644
--- a/include/openbsc/mncc.h
+++ b/include/openbsc/mncc.h
@@ -24,8 +24,8 @@
 #ifndef _MNCC_H
 #define _MNCC_H
 
-#include <osmocore/linuxlist.h>
-#include <osmocore/mncc.h>
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/gsm/mncc.h>
 
 #include <stdint.h>
 
diff --git a/include/openbsc/osmo_bsc.h b/include/openbsc/osmo_bsc.h
index ef0f11a..2620147 100644
--- a/include/openbsc/osmo_bsc.h
+++ b/include/openbsc/osmo_bsc.h
@@ -16,8 +16,8 @@
 	/* SCCP connection realted */
 	struct sccp_connection *sccp;
 	struct bsc_msc_connection *msc_con;
-	struct timer_list sccp_it_timeout;
-	struct timer_list sccp_cc_timeout;
+	struct osmo_timer_list sccp_it_timeout;
+	struct osmo_timer_list sccp_cc_timeout;
 
 	struct llist_head sccp_queue;
 	unsigned int sccp_queue_size;
diff --git a/include/openbsc/osmo_bsc_rf.h b/include/openbsc/osmo_bsc_rf.h
index e43ae2e..6db28cd 100644
--- a/include/openbsc/osmo_bsc_rf.h
+++ b/include/openbsc/osmo_bsc_rf.h
@@ -1,32 +1,32 @@
 #ifndef OSMO_BSC_RF
 #define OSMO_BSC_RF
 
-#include <osmocore/write_queue.h>
-#include <osmocore/timer.h>
+#include <osmocom/core/write_queue.h>
+#include <osmocom/core/timer.h>
 
 struct gsm_network;
 
 struct osmo_bsc_rf {
 	/* the value of signal.h */
 	int policy;
-	struct bsc_fd listen;
+	struct osmo_fd listen;
 	struct gsm_network *gsm_network;
 
 	const char *last_state_command;
 
 	/* delay the command */
 	char last_request;
-	struct timer_list delay_cmd;
+	struct osmo_timer_list delay_cmd;
 
 	/* verify that RF is up as it should be */
-	struct timer_list rf_check;
+	struct osmo_timer_list rf_check;
 
 	/* some handling for the automatic grace switch */
-	struct timer_list grace_timeout;
+	struct osmo_timer_list grace_timeout;
 };
 
 struct osmo_bsc_rf_conn {
-	struct write_queue queue;
+	struct osmo_wqueue queue;
 	struct osmo_bsc_rf *rf;
 };
 
diff --git a/include/openbsc/osmo_msc_data.h b/include/openbsc/osmo_msc_data.h
index 8f9ca68..3212b36 100644
--- a/include/openbsc/osmo_msc_data.h
+++ b/include/openbsc/osmo_msc_data.h
@@ -25,7 +25,7 @@
 
 #include "bsc_msc.h"
 
-#include <osmocore/timer.h>
+#include <osmocom/core/timer.h>
 
 struct osmo_bsc_rf;
 struct gsm_network;
@@ -36,15 +36,15 @@
 };
 
 struct osmo_msc_data {
+	/* Back pointer */
+	struct gsm_network *network;
+
 	/* Connection data */
 	char *bsc_token;
-	int msc_port;
-	int msc_ip_dscp;
-	char *msc_ip;
 	int ping_timeout;
 	int pong_timeout;
-	struct timer_list ping_timer;
-	struct timer_list pong_timer;
+	struct osmo_timer_list ping_timer;
+	struct osmo_timer_list pong_timer;
 	struct bsc_msc_connection *msc_con;
 	int core_ncc;
 	int core_mcc;
@@ -54,13 +54,17 @@
 	struct gsm_audio_support **audio_support;
 	int audio_length;
 
+	/* destinations */
+	struct llist_head dests;
+
 
 	/* mgcp agent */
-	struct write_queue mgcp_agent;
+	struct osmo_wqueue mgcp_agent;
 
 	/* rf ctl related bits */
 	char *mid_call_txt;
 	int mid_call_timeout;
+	char *rf_ctrl_name;
 	struct osmo_bsc_rf *rf_ctl;
 
 	/* ussd welcome text */
diff --git a/include/openbsc/paging.h b/include/openbsc/paging.h
index f719199..0872eb8 100644
--- a/include/openbsc/paging.h
+++ b/include/openbsc/paging.h
@@ -23,10 +23,10 @@
 #include <stdlib.h>
 #include <string.h>
 
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
 #include "gsm_data.h"
 #include "gsm_subscriber.h"
-#include <osmocore/timer.h>
+#include <osmocom/core/timer.h>
 
 /**
  * A pending paging request
@@ -43,7 +43,7 @@
 	int chan_type;
 
 	/* Timer 3113: how long do we try to page? */
-	struct timer_list T3113;
+	struct osmo_timer_list T3113;
 
 	/* How often did we ask the BTS to page? */
 	int attempts;
@@ -53,9 +53,6 @@
 	void *cbfn_param;
 };
 
-/* call once for every gsm_bts... */
-void paging_init(struct gsm_bts *bts);
-
 /* schedule paging request */
 int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr,
 		   int type, gsm_cbfn *cbfn, void *data);
@@ -66,6 +63,9 @@
 			 struct msgb *msg);
 
 /* update paging load */
-void paging_update_buffer_space(struct gsm_bts *bts, u_int16_t);
+void paging_update_buffer_space(struct gsm_bts *bts, uint16_t);
+
+/* pending paging requests */
+unsigned int paging_pending_requests_nr(struct gsm_bts *bts);
 
 #endif
diff --git a/include/openbsc/rest_octets.h b/include/openbsc/rest_octets.h
index 6d90119..2d16a1f 100644
--- a/include/openbsc/rest_octets.h
+++ b/include/openbsc/rest_octets.h
@@ -1,14 +1,13 @@
 #ifndef _REST_OCTETS_H
 #define _REST_OCTETS_H
 
-#include <sys/types.h>
 #include <openbsc/gsm_04_08.h>
 
 /* generate SI1 rest octets */
-int rest_octets_si1(u_int8_t *data, u_int8_t *nch_pos);
+int rest_octets_si1(uint8_t *data, uint8_t *nch_pos);
 
 struct gsm48_si_selection_params {
-	u_int16_t penalty_time:5,
+	uint16_t penalty_time:5,
 		  temp_offs:3,
 		  cell_resel_off:6,
 		  cbq:1,
@@ -16,18 +15,18 @@
 };
 
 struct gsm48_si_power_offset {
-	u_int8_t power_offset:2,
+	uint8_t power_offset:2,
 		 present:1;
 };
 
 struct gsm48_si3_gprs_ind {
-	u_int8_t si13_position:1,
+	uint8_t si13_position:1,
 		 ra_colour:3,
 		 present:1;
 };
 
 struct gsm48_lsa_params {
-	u_int32_t prio_thr:3,
+	uint32_t prio_thr:3,
 		 lsa_offset:3,
 		 mcc:12,
 		 mnc:12;
@@ -37,26 +36,26 @@
 struct gsm48_si_ro_info {
 	struct gsm48_si_selection_params selection_params;
 	struct gsm48_si_power_offset power_offset;
-	u_int8_t si2ter_indicator;
-	u_int8_t early_cm_ctrl;
+	uint8_t si2ter_indicator;
+	uint8_t early_cm_ctrl;
 	struct {
-		u_int8_t where:3,
+		uint8_t where:3,
 			 present:1;
 	} scheduling;
 	struct gsm48_si3_gprs_ind gprs_ind;
 
 	/* SI 4 specific */
 	struct gsm48_lsa_params lsa_params;
-	u_int16_t cell_id;
-	u_int8_t break_ind;	/* do we have SI7 + SI8 ? */
+	uint16_t cell_id;
+	uint8_t break_ind;	/* do we have SI7 + SI8 ? */
 };
 
 
 /* Generate SI3 Rest Octests (Chapter 10.5.2.34 / Table 10.4.72) */
-int rest_octets_si3(u_int8_t *data, const struct gsm48_si_ro_info *si3);
+int rest_octets_si3(uint8_t *data, const struct gsm48_si_ro_info *si3);
 
 /* Generate SI4 Rest Octets (Chapter 10.5.2.35) */
-int rest_octets_si4(u_int8_t *data, const struct gsm48_si_ro_info *si4);
+int rest_octets_si4(uint8_t *data, const struct gsm48_si_ro_info *si4);
 
 enum pbcch_carrier_type {
 	PBCCH_BCCH,
@@ -75,59 +74,59 @@
 struct gprs_cell_options {
 	enum gprs_nmo nmo;
 	/* T3168: wait for packet uplink assignment message */
-	u_int32_t t3168;	/* in milliseconds */
+	uint32_t t3168;	/* in milliseconds */
 	/* T3192: wait for release of the TBF after reception of the final block */
-	u_int32_t t3192;	/* in milliseconds */
-	u_int32_t drx_timer_max;/* in seconds */
-	u_int32_t bs_cv_max;
+	uint32_t t3192;	/* in milliseconds */
+	uint32_t drx_timer_max;/* in seconds */
+	uint32_t bs_cv_max;
 
-	u_int8_t ext_info_present;
+	uint8_t ext_info_present;
 	struct {
-		u_int8_t egprs_supported;
-			u_int8_t use_egprs_p_ch_req;
-			u_int8_t bep_period;
-		u_int8_t pfc_supported;
-		u_int8_t dtm_supported;
-		u_int8_t bss_paging_coordination;
+		uint8_t egprs_supported;
+			uint8_t use_egprs_p_ch_req;
+			uint8_t bep_period;
+		uint8_t pfc_supported;
+		uint8_t dtm_supported;
+		uint8_t bss_paging_coordination;
 	} ext_info;
 };
 
 /* TS 04.60 Table 12.9.2 */
 struct gprs_power_ctrl_pars {
-	u_int8_t alpha;
-	u_int8_t t_avg_w;
-	u_int8_t t_avg_t;
-	u_int8_t pc_meas_chan;
-	u_int8_t n_avg_i;
+	uint8_t alpha;
+	uint8_t t_avg_w;
+	uint8_t t_avg_t;
+	uint8_t pc_meas_chan;
+	uint8_t n_avg_i;
 };
 
 struct gsm48_si13_info {
 	struct gprs_cell_options cell_opts;
 	struct gprs_power_ctrl_pars pwr_ctrl_pars;
-	u_int8_t bcch_change_mark;
-	u_int8_t si_change_field;
-	u_int8_t pbcch_present;
+	uint8_t bcch_change_mark;
+	uint8_t si_change_field;
+	uint8_t pbcch_present;
 
 	union {
 		struct {
-			u_int8_t rac;
-			u_int8_t spgc_ccch_sup;
-			u_int8_t net_ctrl_ord;
-			u_int8_t prio_acc_thr;
+			uint8_t rac;
+			uint8_t spgc_ccch_sup;
+			uint8_t net_ctrl_ord;
+			uint8_t prio_acc_thr;
 		} no_pbcch;
 		struct {
-			u_int8_t psi1_rep_per;
-			u_int8_t pb;
-			u_int8_t tsc;
-			u_int8_t tn;
+			uint8_t psi1_rep_per;
+			uint8_t pb;
+			uint8_t tsc;
+			uint8_t tn;
 			enum pbcch_carrier_type carrier_type;
-			u_int16_t arfcn;
-			u_int8_t maio;
+			uint16_t arfcn;
+			uint8_t maio;
 		} pbcch;
 	};
 };
 
 /* Generate SI13 Rest Octests (Chapter 10.5.2.37b) */
-int rest_octets_si13(u_int8_t *data, const struct gsm48_si13_info *si13);
+int rest_octets_si13(uint8_t *data, const struct gsm48_si13_info *si13);
 
 #endif /* _REST_OCTETS_H */
diff --git a/include/openbsc/rtp_proxy.h b/include/openbsc/rtp_proxy.h
index 53b58b4..94d2579 100644
--- a/include/openbsc/rtp_proxy.h
+++ b/include/openbsc/rtp_proxy.h
@@ -24,8 +24,10 @@
 
 #include <netinet/in.h>
 
-#include <osmocore/linuxlist.h>
-#include <osmocore/select.h>
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/core/select.h>
+
+#include <openbsc/mncc.h>
 
 #define RTP_PT_GSM_FULL 3
 #define RTP_PT_GSM_HALF 96
@@ -48,7 +50,7 @@
 	struct sockaddr_in sin_local;
 	struct sockaddr_in sin_remote;
 
-	struct bsc_fd bfd;
+	struct osmo_fd bfd;
 	/* linked list of to-be-transmitted msgb's */
 	struct llist_head tx_queue;
 };
@@ -67,23 +69,23 @@
 		} proxy;
 		struct {
 			struct gsm_network *net;
-			u_int32_t callref;
+			uint32_t callref;
 		} receive;
 	};
 	enum rtp_tx_action tx_action;
 	struct {
-		u_int16_t sequence;
-		u_int32_t timestamp;
-		u_int32_t ssrc;
+		uint16_t sequence;
+		uint32_t timestamp;
+		uint32_t ssrc;
 		struct timeval last_tv;
 	} transmit;
 };
 
 struct rtp_socket *rtp_socket_create(void);
-int rtp_socket_bind(struct rtp_socket *rs, u_int32_t ip);
-int rtp_socket_connect(struct rtp_socket *rs, u_int32_t ip, u_int16_t port);
+int rtp_socket_bind(struct rtp_socket *rs, uint32_t ip);
+int rtp_socket_connect(struct rtp_socket *rs, uint32_t ip, uint16_t port);
 int rtp_socket_proxy(struct rtp_socket *this, struct rtp_socket *other);
-int rtp_socket_upstream(struct rtp_socket *this, struct gsm_network *net, u_int32_t callref);
+int rtp_socket_upstream(struct rtp_socket *this, struct gsm_network *net, uint32_t callref);
 int rtp_socket_free(struct rtp_socket *rs);
 int rtp_send_frame(struct rtp_socket *rs, struct gsm_data_frame *frame);
 
diff --git a/include/openbsc/sgsn.h b/include/openbsc/sgsn.h
index 84db87e..7456614 100644
--- a/include/openbsc/sgsn.h
+++ b/include/openbsc/sgsn.h
@@ -1,9 +1,8 @@
 #ifndef _SGSN_H
 #define _SGSN_H
 
-#include <sys/types.h>
 
-#include <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
 
 #include <openbsc/gprs_ns.h>
 #include <openbsc/gprs_sgsn.h>
@@ -22,11 +21,11 @@
 	char *config_file;
 	struct sgsn_config cfg;
 	/* File descriptor wrappers for LibGTP */
-	struct bsc_fd gtp_fd0;
-	struct bsc_fd gtp_fd1c;
-	struct bsc_fd gtp_fd1u;
+	struct osmo_fd gtp_fd0;
+	struct osmo_fd gtp_fd1c;
+	struct osmo_fd gtp_fd1u;
 	/* Timer for libGTP */
-	struct timer_list gtp_timer;
+	struct osmo_timer_list gtp_timer;
 	/* GSN instance for libgtp */
 	struct gsn_t *gsn;
 };
diff --git a/include/openbsc/signal.h b/include/openbsc/signal.h
index a2257db..2991cfa 100644
--- a/include/openbsc/signal.h
+++ b/include/openbsc/signal.h
@@ -27,7 +27,7 @@
 
 #include <openbsc/gsm_data.h>
 
-#include <osmocore/signal.h>
+#include <osmocom/core/signal.h>
 
 /*
  * Signalling subsystems
@@ -84,6 +84,7 @@
 	S_NM_TEST_REP,		/* GSM 12.21 Test Report */
 	S_NM_STATECHG_OPER,	/* Operational State changed*/
 	S_NM_STATECHG_ADM,	/* Administrative State changed */
+	S_NM_OM2K_CONF_RES,	/* OM2K Configuration Result */
 };
 
 /* SS_LCHAN signals */
@@ -169,15 +170,30 @@
 
 struct ipacc_ack_signal_data {
 	struct gsm_bts_trx *trx;
-	u_int8_t msg_type;	
+	uint8_t msg_type;
 };
 
+struct abis_om2k_mo;
+
 struct nm_statechg_signal_data {
-	u_int8_t obj_class;
+	struct gsm_bts *bts;
+	uint8_t obj_class;
 	void *obj;
 	struct gsm_nm_state *old_state;
 	struct gsm_nm_state *new_state;
+
+	/* This pointer is vaold for TS 12.21 MO */
 	struct abis_om_obj_inst *obj_inst;
+	/* This pointer is vaold for RBS2000 MO */
+	struct abis_om2k_mo *om2k_mo;
+};
+
+struct nm_om2k_signal_data {
+	struct gsm_bts *bts;
+	void *obj;
+	struct abis_om2k_mo *om2k_mo;
+
+	uint8_t accordance_ind;
 };
 
 struct nm_nack_signal_data {
diff --git a/include/openbsc/socket.h b/include/openbsc/socket.h
index 4d31611..0fd85f1 100644
--- a/include/openbsc/socket.h
+++ b/include/openbsc/socket.h
@@ -1,14 +1,14 @@
 #ifndef _BSC_SOCKET_H
 #define _BSC_SOCKET_H
 
-#include <sys/types.h>
-#include <osmocore/select.h>
+#include <osmocom/core/select.h>
 
 #ifndef IPPROTO_GRE
 #define IPPROTO_GRE 47
 #endif
 
-int make_sock(struct bsc_fd *bfd, int proto, u_int32_t ip, u_int16_t port,
-	      int (*cb)(struct bsc_fd *fd, unsigned int what));
+int make_sock(struct osmo_fd *bfd, int proto,
+	      uint32_t ip, uint16_t port, int priv_nr,
+	      int (*cb)(struct osmo_fd *fd, unsigned int what), void *data);
 
 #endif /* _BSC_SOCKET_H */
diff --git a/include/openbsc/subchan_demux.h b/include/openbsc/subchan_demux.h
index da2a7f3..b71c856 100644
--- a/include/openbsc/subchan_demux.h
+++ b/include/openbsc/subchan_demux.h
@@ -20,8 +20,8 @@
  *
  */
 
-#include <sys/types.h>
-#include <osmocore/linuxlist.h>
+#include <stdint.h>
+#include <osmocom/core/linuxlist.h>
 
 #define NR_SUBCH	4
 #define TRAU_FRAME_SIZE	40
@@ -32,8 +32,8 @@
 /***********************************************************************/
 
 struct demux_subch {
-	u_int8_t out_bitbuf[TRAU_FRAME_BITS];
-	u_int16_t out_idx; /* next bit to be written in out_bitbuf */
+	uint8_t out_bitbuf[TRAU_FRAME_BITS];
+	uint16_t out_idx; /* next bit to be written in out_bitbuf */
 	/* number of consecutive zeros that we have received (for sync) */
 	unsigned int consecutive_zeros;
 	/* are we in TRAU frame sync or not? */
@@ -42,12 +42,12 @@
 
 struct subch_demux {
 	/* bitmask of currently active subchannels */
-	u_int8_t chan_activ;
+	uint8_t chan_activ;
 	/* one demux_subch struct for every subchannel */
 	struct demux_subch subch[NR_SUBCH];
 	/* callback to be called once we have received a complete
 	 * frame on a given subchannel */
-	int (*out_cb)(struct subch_demux *dmx, int ch, u_int8_t *data, int len,
+	int (*out_cb)(struct subch_demux *dmx, int ch, uint8_t *data, int len,
 		      void *);
 	/* user-provided data, transparently passed to out_cb() */
 	void *data;
@@ -57,7 +57,7 @@
 int subch_demux_init(struct subch_demux *dmx);
 
 /* feed 'len' number of muxed bytes into the demultiplexer */
-int subch_demux_in(struct subch_demux *dmx, u_int8_t *data, int len);
+int subch_demux_in(struct subch_demux *dmx, uint8_t *data, int len);
 
 /* activate decoding/processing for one subchannel */
 int subch_demux_activate(struct subch_demux *dmx, int subch);
@@ -76,7 +76,7 @@
 	unsigned int bit_len;	/* total number of bits in 'bits' */
 	unsigned int next_bit;	/* next bit to be transmitted */
 
-	u_int8_t bits[0];	/* one bit per byte */
+	uint8_t bits[0];	/* one bit per byte */
 };
 
 struct mux_subch {
@@ -92,10 +92,10 @@
 int subchan_mux_init(struct subch_mux *mx);
 
 /* request the output of 'len' multiplexed bytes */
-int subchan_mux_out(struct subch_mux *mx, u_int8_t *data, int len);
+int subchan_mux_out(struct subch_mux *mx, uint8_t *data, int len);
 
 /* enqueue some data into one sub-channel of the muxer */
-int subchan_mux_enqueue(struct subch_mux *mx, int s_nr, const u_int8_t *data,
+int subchan_mux_enqueue(struct subch_mux *mx, int s_nr, const uint8_t *data,
 			int len);
 
 #endif /* _SUBCH_DEMUX_H */
diff --git a/include/openbsc/system_information.h b/include/openbsc/system_information.h
index da662e9..6a56848 100644
--- a/include/openbsc/system_information.h
+++ b/include/openbsc/system_information.h
@@ -1,45 +1,10 @@
 #ifndef _SYSTEM_INFO_H
 #define _SYSTEM_INFO_H
 
-#include <osmocore/utils.h>
-
-#define GSM_MACBLOCK_LEN 		23
+#include <osmocom/gsm/sysinfo.h>
 
 struct gsm_bts;
 
-
-enum osmo_sysinfo_type {
-	SYSINFO_TYPE_NONE,
-	SYSINFO_TYPE_1,
-	SYSINFO_TYPE_2,
-	SYSINFO_TYPE_3,
-	SYSINFO_TYPE_4,
-	SYSINFO_TYPE_5,
-	SYSINFO_TYPE_6,
-	SYSINFO_TYPE_7,
-	SYSINFO_TYPE_8,
-	SYSINFO_TYPE_9,
-	SYSINFO_TYPE_10,
-	SYSINFO_TYPE_13,
-	SYSINFO_TYPE_16,
-	SYSINFO_TYPE_17,
-	SYSINFO_TYPE_18,
-	SYSINFO_TYPE_19,
-	SYSINFO_TYPE_20,
-	SYSINFO_TYPE_2bis,
-	SYSINFO_TYPE_2ter,
-	SYSINFO_TYPE_2quater,
-	SYSINFO_TYPE_5bis,
-	SYSINFO_TYPE_5ter,
-	/* FIXME all the various bis and ter */
-	_MAX_SYSINFO_TYPE
-};
-
-typedef u_int8_t sysinfo_buf_t[GSM_MACBLOCK_LEN];
-
-extern const struct value_string osmo_sitype_strs[_MAX_SYSINFO_TYPE];
-uint8_t gsm_sitype2rsl(enum osmo_sysinfo_type si_type);
-const char *gsm_sitype_name(enum osmo_sysinfo_type si_type);
 int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type type);
 
 #endif
diff --git a/include/openbsc/transaction.h b/include/openbsc/transaction.h
index e41d8ef..acb2e6c 100644
--- a/include/openbsc/transaction.h
+++ b/include/openbsc/transaction.h
@@ -3,8 +3,9 @@
 
 #include <openbsc/gsm_data.h>
 #include <openbsc/gsm_subscriber.h>
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
 #include <openbsc/gsm_04_11.h>
+#include <openbsc/mncc.h>
 
 /* One transaction */
 struct gsm_trans {
@@ -12,10 +13,10 @@
 	struct llist_head entry;
 
 	/* The protocol within which we live */
-	u_int8_t protocol;
+	uint8_t protocol;
 
 	/* The current transaction ID */
-	u_int8_t transaction_id;
+	uint8_t transaction_id;
 	
 	/* To whom we belong, unique identifier of remote MM entity */
 	struct gsm_subscriber *subscr;
@@ -24,7 +25,7 @@
 	struct gsm_subscriber_connection *conn;
 
 	/* reference from MNCC or other application */
-	u_int32_t callref;
+	uint32_t callref;
 
 	/* if traffic channel receive was requested */
 	int tch_recv;
@@ -41,14 +42,14 @@
 			/* current timer and message queue */
 			int Tcurrent;		/* current CC timer */
 			int T308_second;	/* used to send release again */
-			struct timer_list timer;
+			struct osmo_timer_list timer;
 			struct gsm_mncc msg;	/* stores setup/disconnect/release message */
 		} cc;
 		struct {
-			u_int8_t link_id;	/* RSL Link ID to be used for this trans */
+			uint8_t link_id;	/* RSL Link ID to be used for this trans */
 			int is_mt;	/* is this a MO (0) or MT (1) transfer */
 			enum gsm411_cp_state cp_state;
-			struct timer_list cp_timer;
+			struct osmo_timer_list cp_timer;
 
 			enum gsm411_rp_state rp_state;
 
@@ -60,16 +61,16 @@
 
 
 struct gsm_trans *trans_find_by_id(struct gsm_subscriber *subscr,
-				   u_int8_t proto, u_int8_t trans_id);
+				   uint8_t proto, uint8_t trans_id);
 struct gsm_trans *trans_find_by_callref(struct gsm_network *net,
-					u_int32_t callref);
+					uint32_t callref);
 
 struct gsm_trans *trans_alloc(struct gsm_subscriber *subscr,
-			      u_int8_t protocol, u_int8_t trans_id,
-			      u_int32_t callref);
+			      uint8_t protocol, uint8_t trans_id,
+			      uint32_t callref);
 void trans_free(struct gsm_trans *trans);
 
 int trans_assign_trans_id(struct gsm_subscriber *subscr,
-			  u_int8_t protocol, u_int8_t ti_flag);
+			  uint8_t protocol, uint8_t ti_flag);
 
 #endif
diff --git a/include/openbsc/trau_frame.h b/include/openbsc/trau_frame.h
index c594c38..c15e24b 100644
--- a/include/openbsc/trau_frame.h
+++ b/include/openbsc/trau_frame.h
@@ -20,7 +20,7 @@
  *
  */
 
-#include <sys/types.h>
+#include <stdint.h>
 
 /* 21 for FR/EFR, 25 for AMR, 15 for OM, 15 for data, 13 for E-data, 21 idle */
 #define MAX_C_BITS	25
@@ -34,11 +34,11 @@
 #define MAX_M_BITS	2
 
 struct decoded_trau_frame {
-	u_int8_t c_bits[MAX_C_BITS];
-	u_int8_t d_bits[MAX_D_BITS];
-	u_int8_t t_bits[MAX_T_BITS];
-	u_int8_t s_bits[MAX_S_BITS];
-	u_int8_t m_bits[MAX_M_BITS];
+	uint8_t c_bits[MAX_C_BITS];
+	uint8_t d_bits[MAX_D_BITS];
+	uint8_t t_bits[MAX_T_BITS];
+	uint8_t s_bits[MAX_S_BITS];
+	uint8_t m_bits[MAX_M_BITS];
 };
 
 #define TRAU_FT_FR_UP		0x02	/* 0 0 0 1 0 - 3.5.1.1.1 */
@@ -55,10 +55,10 @@
 #define TRAU_FT_IDLE_DOWN	0x0e	/* 0 1 1 1 0 - 3.5.5 */
 
 
-int decode_trau_frame(struct decoded_trau_frame *fr, const u_int8_t *trau_bits);
-int encode_trau_frame(u_int8_t *trau_bits, const struct decoded_trau_frame *fr);
+int decode_trau_frame(struct decoded_trau_frame *fr, const uint8_t *trau_bits);
+int encode_trau_frame(uint8_t *trau_bits, const struct decoded_trau_frame *fr);
 int trau_frame_up2down(struct decoded_trau_frame *fr);
-u_int8_t *trau_idle_frame(void);
+uint8_t *trau_idle_frame(void);
 
 
 #endif /* _TRAU_FRAME_H */
diff --git a/include/openbsc/trau_mux.h b/include/openbsc/trau_mux.h
index dcf33ee..9936ba1 100644
--- a/include/openbsc/trau_mux.h
+++ b/include/openbsc/trau_mux.h
@@ -28,6 +28,10 @@
  * optimization to routing them externally.
  */
 
+#include <stdint.h>
+#include <openbsc/gsm_data.h>
+#include <openbsc/mncc.h>
+
 /* map a TRAU mux map entry */
 int trau_mux_map(const struct gsm_e1_subslot *src,
 		 const struct gsm_e1_subslot *dst);
@@ -35,14 +39,14 @@
 			const struct gsm_lchan *dst);
 
 /* unmap a TRAU mux map entry */
-int trau_mux_unmap(const struct gsm_e1_subslot *ss, u_int32_t callref);
+int trau_mux_unmap(const struct gsm_e1_subslot *ss, uint32_t callref);
 
 /* we get called by subchan_demux */
 int trau_mux_input(struct gsm_e1_subslot *src_e1_ss,
-		   const u_int8_t *trau_bits, int num_bits);
+		   const uint8_t *trau_bits, int num_bits);
 
 /* add a trau receiver */
-int trau_recv_lchan(struct gsm_lchan *lchan, u_int32_t callref);
+int trau_recv_lchan(struct gsm_lchan *lchan, uint32_t callref);
 
 /* send trau from application */
 int trau_send_frame(struct gsm_lchan *lchan, struct gsm_data_frame *frame);
diff --git a/include/openbsc/ussd.h b/include/openbsc/ussd.h
index 6f80d23..2665468 100644
--- a/include/openbsc/ussd.h
+++ b/include/openbsc/ussd.h
@@ -3,7 +3,7 @@
 
 /* Handler function for mobile-originated USSD messages */
 
-#include <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
 
 int handle_rcv_ussd(struct gsm_subscriber_connection *conn, struct msgb *msg);
 
diff --git a/include/openbsc/vty.h b/include/openbsc/vty.h
index 516c8c2..6635896 100644
--- a/include/openbsc/vty.h
+++ b/include/openbsc/vty.h
@@ -35,12 +35,14 @@
 	MSC_NODE,
 	OM2K_NODE,
 	TRUNK_NODE,
+	PGROUP_NODE,
 };
 
 extern int bsc_vty_is_config_node(struct vty *vty, int node);
 extern void bsc_replace_string(void *ctx, char **dst, const char *newstr);
 
-int bsc_vty_init(void);
+struct log_info;
+int bsc_vty_init(const struct log_info *cat);
 int bsc_vty_init_extra(void);
 
 #endif