diff --git a/openbsc/include/openbsc/Makefile.am b/openbsc/include/openbsc/Makefile.am
index 8a31fe5..893c7aa 100644
--- a/openbsc/include/openbsc/Makefile.am
+++ b/openbsc/include/openbsc/Makefile.am
@@ -14,7 +14,7 @@
 		osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h \
 		bss.h gsm_data_shared.h ipaccess.h mncc_int.h \
 		arfcn_range_encode.h nat_rewrite_trie.h bsc_nat_callstats.h \
-		osmux.h mgcp_transcode.h gprs_utils.h utils.h \
+		osmux.h mgcp_transcode.h gprs_utils.h \
 		 gprs_gb_parse.h smpp.h meas_feed.h osmo_gsup_messages.h \
 		 gprs_gsup_client.h bsc_msg_filter.h \
 		 oap.h oap_messages.h \
diff --git a/openbsc/include/openbsc/utils.h b/openbsc/include/openbsc/utils.h
deleted file mode 100644
index d605487..0000000
--- a/openbsc/include/openbsc/utils.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* OpenBSC kitchen sink */
-
-#pragma once
-
-#include <stdint.h>
-#include <stdlib.h>
-
-/* Compare count bytes of exp to rel. Return 0 if they are identical, 1
- * otherwise. Do not return a mismatch on the first mismatching byte,
- * but always compare all bytes, regardless. The idea is that the amount of
- * matching bytes cannot be inferred from the time the comparison took.*/
-int constant_time_cmp(const uint8_t *exp, const uint8_t *rel, const int count);
-
-/* This is like osmo_load64be_ext, except that if data_len is less than
- * sizeof(uint64_t), the data is interpreted as the least significant bytes
- * (osmo_load64be_ext loads them as the most significant bytes into the
- * returned uint64_t). In this way, any integer size up to 64 bits can be
- * decoded conveniently by using sizeof(), without the need to call specific
- * numbered functions (osmo_load16, 32, ...). */
-uint64_t decode_big_endian(const uint8_t *data, size_t data_len);
-
-/* This is like osmo_store64be_ext, except that this returns a static buffer of
- * the result (for convenience, but not threadsafe). If data_len is less than
- * sizeof(uint64_t), only the least significant bytes of value are encoded. */
-uint8_t *encode_big_endian(uint64_t value, size_t data_len);
-
diff --git a/openbsc/src/gprs/oap.c b/openbsc/src/gprs/oap.c
index 1426702..f5d7a95 100644
--- a/openbsc/src/gprs/oap.c
+++ b/openbsc/src/gprs/oap.c
@@ -20,10 +20,10 @@
  *
  */
 
+#include <osmocom/core/utils.h>
 #include <osmocom/crypt/auth.h>
 
 #include <openbsc/oap.h>
-#include <openbsc/utils.h>
 #include <openbsc/debug.h>
 #include <openbsc/oap_messages.h>
 
@@ -103,7 +103,7 @@
 		return -3;
 	}
 
-	if (constant_time_cmp(vec.autn, rx_autn, sizeof(vec.autn)) != 0) {
+	if (osmo_constant_time_cmp(vec.autn, rx_autn, sizeof(vec.autn)) != 0) {
 		LOGP(DGPRS, LOGL_ERROR, "OAP: AUTN mismatch!\n");
 		LOGP(DGPRS, LOGL_INFO, "OAP: AUTN from server: %s\n",
 		     osmo_hexdump_nospc(rx_autn, sizeof(vec.autn)));
diff --git a/openbsc/src/gprs/oap_messages.c b/openbsc/src/gprs/oap_messages.c
index 49b54e4..d5750a6 100644
--- a/openbsc/src/gprs/oap_messages.c
+++ b/openbsc/src/gprs/oap_messages.c
@@ -20,11 +20,11 @@
  *
  */
 
+#include <osmocom/core/utils.h>
 #include <openbsc/oap_messages.h>
 
 #include <openbsc/debug.h>
 #include <openbsc/gprs_utils.h>
-#include <openbsc/utils.h>
 
 #include <osmocom/gsm/tlv.h>
 #include <osmocom/core/msgb.h>
@@ -51,7 +51,7 @@
 	rc = osmo_shift_v_fixed(&data, &data_len, 1, &value);
 	if (rc < 0)
 		return -GMM_CAUSE_INV_MAND_INFO;
-	oap_msg->message_type = decode_big_endian(value, 1);
+	oap_msg->message_type = osmo_decode_big_endian(value, 1);
 
 	/* specific parts */
 	while (data_len > 0) {
@@ -72,7 +72,7 @@
 				return -GMM_CAUSE_PROTO_ERR_UNSPEC;
 			}
 
-			oap_msg->client_id = decode_big_endian(value, value_len);
+			oap_msg->client_id = osmo_decode_big_endian(value, value_len);
 
 			if (oap_msg->client_id == 0) {
 				LOGP(DGPRS, LOGL_NOTICE,
@@ -159,7 +159,8 @@
 
 	if (oap_msg->client_id > 0)
 		msgb_tlv_put(msg, OAP_CLIENT_ID_IE, sizeof(oap_msg->client_id),
-			     encode_big_endian(oap_msg->client_id, sizeof(oap_msg->client_id)));
+			     osmo_encode_big_endian(oap_msg->client_id,
+						    sizeof(oap_msg->client_id)));
 
 	if (oap_msg->rand_present)
 		msgb_tlv_put(msg, OAP_RAND_IE, sizeof(oap_msg->rand), oap_msg->rand);
diff --git a/openbsc/src/libcommon/Makefile.am b/openbsc/src/libcommon/Makefile.am
index 84c7544..75f40ee 100644
--- a/openbsc/src/libcommon/Makefile.am
+++ b/openbsc/src/libcommon/Makefile.am
@@ -6,4 +6,4 @@
 
 libcommon_a_SOURCES = bsc_version.c common_vty.c debug.c gsm_data.c \
 		      gsm_data_shared.c socket.c talloc_ctx.c \
-		      gsm_subscriber_base.c utils.c
+		      gsm_subscriber_base.c
diff --git a/openbsc/src/libcommon/utils.c b/openbsc/src/libcommon/utils.c
deleted file mode 100644
index c47dcae..0000000
--- a/openbsc/src/libcommon/utils.c
+++ /dev/null
@@ -1,58 +0,0 @@
-/* OpenBSC kitchen sink */
-
-/* (C) 2015 by sysmocom s.m.f.c GmbH <info@sysmocom.de>
- * All Rights Reserved
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <openbsc/utils.h>
-#include <osmocom/core/utils.h>
-#include <osmocom/core/bit64gen.h>
-
-/* Wishful thinking to generate a constant time compare */
-int constant_time_cmp(const uint8_t *exp, const uint8_t *rel, const int count)
-{
-	int x = 0, i;
-
-	for (i = 0; i < count; ++i)
-		x |= exp[i] ^ rel[i];
-
-	/* if x is zero, all data was identical */
-	return x? 1 : 0;
-}
-
-
-uint64_t decode_big_endian(const uint8_t *data, size_t data_len)
-{
-	uint64_t value = 0;
-
-	while (data_len > 0) {
-		value = (value << 8) + *data;
-		data += 1;
-		data_len -= 1;
-	}
-
-	return value;
-}
-
-uint8_t *encode_big_endian(uint64_t value, size_t data_len)
-{
-	static uint8_t buf[sizeof(uint64_t)];
-	OSMO_ASSERT(data_len <= ARRAY_SIZE(buf));
-	osmo_store64be_ext(value, buf, data_len);
-	return buf;
-}
-
diff --git a/openbsc/src/osmo-bsc_nat/bsc_nat.c b/openbsc/src/osmo-bsc_nat/bsc_nat.c
index efae54f..f20b248 100644
--- a/openbsc/src/osmo-bsc_nat/bsc_nat.c
+++ b/openbsc/src/osmo-bsc_nat/bsc_nat.c
@@ -48,7 +48,6 @@
 #include <openbsc/abis_nm.h>
 #include <openbsc/socket.h>
 #include <openbsc/vty.h>
-#include <openbsc/utils.h>
 
 #include <osmocom/ctrl/control_cmd.h>
 #include <osmocom/ctrl/control_if.h>
@@ -1023,7 +1022,7 @@
 		return 0;
 	}
 
-	return constant_time_cmp(vec.res, key, 8) == 0;
+	return osmo_constant_time_cmp(vec.res, key, 8) == 0;
 }
 
 static void ipaccess_auth_bsc(struct tlv_parsed *tvp, struct bsc_connection *bsc)
diff --git a/openbsc/tests/gprs/Makefile.am b/openbsc/tests/gprs/Makefile.am
index b57977b..633c362 100644
--- a/openbsc/tests/gprs/Makefile.am
+++ b/openbsc/tests/gprs/Makefile.am
@@ -6,7 +6,6 @@
 noinst_PROGRAMS = gprs_test
 
 gprs_test_SOURCES = gprs_test.c $(top_srcdir)/src/gprs/gprs_utils.c \
-		$(top_srcdir)/src/gprs/gprs_gsup_messages.c \
-		$(top_srcdir)/src/libcommon/utils.c
+		$(top_srcdir)/src/gprs/gprs_gsup_messages.c
 
 gprs_test_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS)
diff --git a/openbsc/tests/gprs/gprs_test.c b/openbsc/tests/gprs/gprs_test.c
index c78b98a..24e44cf 100644
--- a/openbsc/tests/gprs/gprs_test.c
+++ b/openbsc/tests/gprs/gprs_test.c
@@ -146,247 +146,7 @@
 	}
 }
 
-/* TODO: Move tlv testing to libosmocore */
-static void check_tlv_parse(uint8_t **data, size_t *data_len,
-			    uint8_t exp_tag, size_t exp_len, const uint8_t *exp_val)
-{
-	uint8_t *value;
-	size_t value_len;
-	uint8_t tag;
-	int rc;
-	uint8_t *saved_data = *data;
-	size_t saved_data_len = *data_len;
-
-	rc = gprs_match_tlv(data, data_len, exp_tag ^ 1, NULL, NULL);
-	OSMO_ASSERT(rc == 0);
-
-	rc = gprs_match_tlv(data, data_len, exp_tag, &value, &value_len);
-	OSMO_ASSERT(rc == (int)value_len + 2);
-	OSMO_ASSERT(value_len == exp_len);
-	OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
-
-	/* restore data/data_len */
-	*data = saved_data;
-	*data_len = saved_data_len;
-
-	rc = gprs_shift_tlv(data, data_len, &tag, &value, &value_len);
-	OSMO_ASSERT(rc == (int)value_len + 2);
-	OSMO_ASSERT(tag == exp_tag);
-	OSMO_ASSERT(value_len == exp_len);
-	OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
-}
-
-static void check_tv_fixed_match(uint8_t **data, size_t *data_len,
-				 uint8_t tag, size_t len, const uint8_t *exp_val)
-{
-	uint8_t *value;
-	int rc;
-
-	rc = gprs_match_tv_fixed(data, data_len, tag ^ 1, len, NULL);
-	OSMO_ASSERT(rc == 0);
-
-	rc = gprs_match_tv_fixed(data, data_len, tag, len, &value);
-	OSMO_ASSERT(rc == (int)len + 1);
-	OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
-}
-
-static void check_v_fixed_shift(uint8_t **data, size_t *data_len,
-				size_t len, const uint8_t *exp_val)
-{
-	uint8_t *value;
-	int rc;
-
-	rc = gprs_shift_v_fixed(data, data_len, len, &value);
-	OSMO_ASSERT(rc == (int)len);
-	OSMO_ASSERT(memcmp(value, exp_val, len) == 0);
-}
-
-static void check_lv_shift(uint8_t **data, size_t *data_len,
-			   size_t exp_len, const uint8_t *exp_val)
-{
-	uint8_t *value;
-	size_t value_len;
-	int rc;
-
-	rc = gprs_shift_lv(data, data_len, &value, &value_len);
-	OSMO_ASSERT(rc == (int)value_len + 1);
-	OSMO_ASSERT(value_len == exp_len);
-	OSMO_ASSERT(memcmp(value, exp_val, exp_len) == 0);
-}
-
-static void check_tlv_match_data_len(size_t data_len, uint8_t tag, size_t len,
-				     const uint8_t *test_data)
-{
-	uint8_t buf[300] = {0};
-
-	uint8_t *unchanged_ptr = buf - 1;
-	size_t unchanged_len = 0xdead;
-	size_t tmp_data_len = data_len;
-	uint8_t *value = unchanged_ptr;
-	size_t value_len = unchanged_len;
-	uint8_t *data = buf;
-
-	OSMO_ASSERT(data_len <= sizeof(buf));
-
-	tlv_put(data, tag, len, test_data);
-	if (data_len < len + 2) {
-		OSMO_ASSERT(-1 == gprs_match_tlv(&data, &tmp_data_len,
-					    tag, &value, &value_len));
-		OSMO_ASSERT(tmp_data_len == 0);
-		OSMO_ASSERT(data == buf + data_len);
-		OSMO_ASSERT(value == unchanged_ptr);
-		OSMO_ASSERT(value_len == unchanged_len);
-	} else {
-		OSMO_ASSERT(0 <= gprs_match_tlv(&data, &tmp_data_len,
-					   tag, &value, &value_len));
-		OSMO_ASSERT(value != unchanged_ptr);
-		OSMO_ASSERT(value_len != unchanged_len);
-	}
-}
-
-static void check_tv_fixed_match_data_len(size_t data_len,
-					  uint8_t tag, size_t len,
-					  const uint8_t *test_data)
-{
-	uint8_t buf[300] = {0};
-
-	uint8_t *unchanged_ptr = buf - 1;
-	size_t tmp_data_len = data_len;
-	uint8_t *value = unchanged_ptr;
-	uint8_t *data = buf;
-
-	OSMO_ASSERT(data_len <= sizeof(buf));
-
-	tv_fixed_put(data, tag, len, test_data);
-
-	if (data_len < len + 1) {
-		OSMO_ASSERT(-1 == gprs_match_tv_fixed(&data, &tmp_data_len,
-						 tag, len, &value));
-		OSMO_ASSERT(tmp_data_len == 0);
-		OSMO_ASSERT(data == buf + data_len);
-		OSMO_ASSERT(value == unchanged_ptr);
-	} else {
-		OSMO_ASSERT(0 <= gprs_match_tv_fixed(&data, &tmp_data_len,
-						tag, len, &value));
-		OSMO_ASSERT(value != unchanged_ptr);
-	}
-}
-
-static void check_v_fixed_shift_data_len(size_t data_len,
-					 size_t len, const uint8_t *test_data)
-{
-	uint8_t buf[300] = {0};
-
-	uint8_t *unchanged_ptr = buf - 1;
-	size_t tmp_data_len = data_len;
-	uint8_t *value = unchanged_ptr;
-	uint8_t *data = buf;
-
-	OSMO_ASSERT(data_len <= sizeof(buf));
-
-	memcpy(data, test_data, len);
-
-	if (data_len < len) {
-		OSMO_ASSERT(-1 == gprs_shift_v_fixed(&data, &tmp_data_len,
-						len, &value));
-		OSMO_ASSERT(tmp_data_len == 0);
-		OSMO_ASSERT(data == buf + data_len);
-		OSMO_ASSERT(value == unchanged_ptr);
-	} else {
-		OSMO_ASSERT(0 <= gprs_shift_v_fixed(&data, &tmp_data_len,
-					       len, &value));
-		OSMO_ASSERT(value != unchanged_ptr);
-	}
-}
-
-static void check_lv_shift_data_len(size_t data_len,
-				    size_t len, const uint8_t *test_data)
-{
-	uint8_t buf[300] = {0};
-
-	uint8_t *unchanged_ptr = buf - 1;
-	size_t unchanged_len = 0xdead;
-	size_t tmp_data_len = data_len;
-	uint8_t *value = unchanged_ptr;
-	size_t value_len = unchanged_len;
-	uint8_t *data = buf;
-
-	lv_put(data, len, test_data);
-	if (data_len < len + 1) {
-		OSMO_ASSERT(-1 == gprs_shift_lv(&data, &tmp_data_len,
-					   &value, &value_len));
-		OSMO_ASSERT(tmp_data_len == 0);
-		OSMO_ASSERT(data == buf + data_len);
-		OSMO_ASSERT(value == unchanged_ptr);
-		OSMO_ASSERT(value_len == unchanged_len);
-	} else {
-		OSMO_ASSERT(0 <= gprs_shift_lv(&data, &tmp_data_len,
-					  &value, &value_len));
-		OSMO_ASSERT(value != unchanged_ptr);
-		OSMO_ASSERT(value_len != unchanged_len);
-	}
-}
-
-static void test_tlv_shift_functions()
-{
-	uint8_t test_data[1024];
-	uint8_t buf[1024];
-	uint8_t *data_end;
-	unsigned i, len;
-	uint8_t *data;
-	size_t data_len;
-	const uint8_t tag = 0x1a;
-
-	printf("Test shift functions\n");
-
-	for (i = 0; i < ARRAY_SIZE(test_data); i++)
-		test_data[i] = (uint8_t)i;
-
-	for (len = 0; len < 256; len++) {
-		const unsigned iterations = sizeof(buf) / (len + 2) / 4;
-
-		memset(buf, 0xee, sizeof(buf));
-		data_end = data = buf;
-
-		for (i = 0; i < iterations; i++) {
-			data_end = tlv_put(data_end, tag, len, test_data);
-			data_end = tv_fixed_put(data_end, tag, len, test_data);
-			/* v_fixed_put */
-			memcpy(data_end, test_data, len);
-			data_end += len;
-			data_end = lv_put(data_end, len, test_data);
-		}
-
-		data_len = data_end - data;
-		OSMO_ASSERT(data_len <= sizeof(buf));
-
-		for (i = 0; i < iterations; i++) {
-			check_tlv_parse(&data, &data_len, tag, len, test_data);
-			check_tv_fixed_match(&data, &data_len, tag, len, test_data);
-			check_v_fixed_shift(&data, &data_len, len, test_data);
-			check_lv_shift(&data, &data_len, len, test_data);
-		}
-
-		OSMO_ASSERT(data == data_end);
-
-		/* Test at end of data */
-
-		OSMO_ASSERT(-1 == gprs_match_tlv(&data, &data_len, tag, NULL, NULL));
-		OSMO_ASSERT(-1 == gprs_match_tv_fixed(&data, &data_len, tag, len, NULL));
-		OSMO_ASSERT((len ? -1 : 0) == gprs_shift_v_fixed(&data, &data_len, len, NULL));
-		OSMO_ASSERT(-1 == gprs_shift_lv(&data, &data_len, NULL, NULL));
-
-		/* Test invalid data_len */
-		for (data_len = 0; data_len <= len + 2 + 1; data_len += 1) {
-			check_tlv_match_data_len(data_len, tag, len, test_data);
-			check_tv_fixed_match_data_len(data_len, tag, len, test_data);
-			check_v_fixed_shift_data_len(data_len, len, test_data);
-			check_lv_shift_data_len(data_len, len, test_data);
-		}
-	}
-}
-
-/* Tests for gprs_gsup_messages.c */
+/* Tests for osmo_gsup_messages.c */
 
 #define TEST_IMSI_IE 0x01, 0x08, 0x21, 0x43, 0x65, 0x87, 0x09, 0x21, 0x43, 0xf5
 #define TEST_IMSI_STR "123456789012345"
@@ -705,7 +465,6 @@
 
 	test_8_4_2();
 	test_gsm_03_03_apn();
-	test_tlv_shift_functions();
 	test_gsup_messages_dec_enc();
 	test_gprs_timer_enc_dec();
 
diff --git a/openbsc/tests/gprs/gprs_test.ok b/openbsc/tests/gprs/gprs_test.ok
index cf71076..688d44b 100644
--- a/openbsc/tests/gprs/gprs_test.ok
+++ b/openbsc/tests/gprs/gprs_test.ok
@@ -13,7 +13,6 @@
 N(U) = 510, V(UR) = 511 => retransmit
 N(U) = 481, V(UR) = 511 => retransmit
 N(U) = 479, V(UR) = 511 => new
-Test shift functions
 Test GSUP message decoding/encoding
   Testing Send Authentication Info Request
   Testing Send Authentication Info Error
