diff --git a/include/osmocom/core/bitXXgen.h.tpl b/include/osmocom/core/bitXXgen.h.tpl
new file mode 100644
index 0000000..35f26db
--- /dev/null
+++ b/include/osmocom/core/bitXXgen.h.tpl
@@ -0,0 +1,103 @@
+/*
+ * bitXXgen.h
+ *
+ * Copyright (C) 2014  Max <max.suraev@fairwaves.co>
+ *
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#pragma once
+
+/*! \brief load unaligned n-byte integer (little-endian encoding) into uintXX_t
+ *  \param[in] p Buffer where integer is stored
+ *  \param[in] n Number of bytes stored in p
+ *  \returns XX bit unsigned integer
+ */
+static inline uintXX_t osmo_loadXXle_ext(const void *p, uint8_t n)
+{
+	uint8_t i;
+	uintXX_t r = 0;
+	const uint8_t *q = (uint8_t *)p;
+	for(i = 0; i < n; r |= ((uintXX_t)q[i] << (8 * i)), i++);
+	return r;
+}
+
+/*! \brief load unaligned n-byte integer (big-endian encoding) into uintXX_t
+ *  \param[in] p Buffer where integer is stored
+ *  \param[in] n Number of bytes stored in p
+ *  \returns XX bit unsigned integer
+ */
+static inline uintXX_t osmo_loadXXbe_ext(const void *p, uint8_t n)
+{
+	uint8_t i;
+	uintXX_t r = 0;
+	const uint8_t *q = (uint8_t *)p;
+	for(i = 0; i < n; r |= ((uintXX_t)q[i] << (XX - 8* (1 + i))), i++);
+	return r;
+}
+
+
+/*! \brief store unaligned n-byte integer (little-endian encoding) into uintXX_t
+ *  \param[in] x unsigned XX bit integer
+ *  \param[out] p Buffer to store integer
+ *  \param[in] n Number of bytes to store
+ */
+static inline void osmo_storeXXle_ext(uintXX_t x, uint8_t *p, uint8_t n)
+{
+	uint8_t i;
+	for(i = 0; i < n; p[i] = (x >> i * 8) & 0xFF, i++);
+}
+
+/*! \brief store unaligned n-byte integer (big-endian encoding) into uintXX_t
+ *  \param[in] x unsigned XX bit integer
+ *  \param[out] p Buffer to store integer
+ *  \param[in] n Number of bytes to store
+ */
+static inline void osmo_storeXXbe_ext(uintXX_t x, uint8_t *p, uint8_t n)
+{
+	uint8_t i;
+	for(i = 0; i < n; p[i] = (x >> ((n - 1 - i) * 8)) & 0xFF, i++);
+}
+
+
+/* Convenience function for most-used cases */
+
+
+/*! \brief load unaligned XX-bit integer (little-endian encoding) */
+static inline uintXX_t osmo_loadXXle(const void *p)
+{
+	return osmo_loadXXle_ext(p, XX / 8);
+}
+
+/*! \brief load unaligned XX-bit integer (big-endian encoding) */
+static inline uintXX_t osmo_loadXXbe(const void *p)
+{
+	return osmo_loadXXbe_ext(p, XX / 8);
+}
+
+
+/*! \brief store unaligned XX-bit integer (little-endian encoding) */
+static inline void osmo_storeXXle(uintXX_t x, void *p)
+{
+	return osmo_storeXXle_ext(x, p, XX / 8);
+}
+
+/*! \brief store unaligned XX-bit integer (big-endian encoding) */
+static inline void osmo_storeXXbe(uintXX_t x, void *p)
+{
+	return osmo_storeXXbe_ext(x, p, XX / 8);
+}
diff --git a/include/osmocom/core/bits.h b/include/osmocom/core/bits.h
index d4ab505..f3045e4 100644
--- a/include/osmocom/core/bits.h
+++ b/include/osmocom/core/bits.h
@@ -1,6 +1,11 @@
 #pragma once
 
 #include <stdint.h>
+#include <stddef.h>
+
+#include <osmocom/core/bit16gen.h>
+#include <osmocom/core/bit32gen.h>
+#include <osmocom/core/bit64gen.h>
 
 /*! \defgroup bits soft, unpacked and packed bits
  *  @{
diff --git a/include/osmocom/core/msgb.h b/include/osmocom/core/msgb.h
index bf83d67..19e4a3d 100644
--- a/include/osmocom/core/msgb.h
+++ b/include/osmocom/core/msgb.h
@@ -22,6 +22,7 @@
 #include <stdint.h>
 #include <osmocom/core/linuxlist.h>
 #include <osmocom/core/utils.h>
+#include <osmocom/core/bits.h>
 
 /*! \defgroup msgb Message buffers
  *  @{
@@ -204,8 +205,7 @@
 static inline void msgb_put_u16(struct msgb *msgb, uint16_t word)
 {
 	uint8_t *space = msgb_put(msgb, 2);
-	space[0] = word >> 8 & 0xFF;
-	space[1] = word & 0xFF;
+	osmo_store16be(word, space);
 }
 
 /*! \brief append a uint32 value to the end of the message
@@ -215,10 +215,7 @@
 static inline void msgb_put_u32(struct msgb *msgb, uint32_t word)
 {
 	uint8_t *space = msgb_put(msgb, 4);
-	space[0] = word >> 24 & 0xFF;
-	space[1] = word >> 16 & 0xFF;
-	space[2] = word >> 8 & 0xFF;
-	space[3] = word & 0xFF;
+	osmo_store32be(word, space);
 }
 
 /*! \brief remove data from end of message
@@ -235,6 +232,7 @@
 	msgb->len -= len;
 	return tmp;
 }
+
 /*! \brief remove uint8 from end of message
  *  \param[in] msgb message buffer
  *  \returns 8bit value taken from end of msgb
@@ -244,6 +242,7 @@
 	uint8_t *space = msgb_get(msgb, 1);
 	return space[0];
 }
+
 /*! \brief remove uint16 from end of message
  *  \param[in] msgb message buffer
  *  \returns 16bit value taken from end of msgb
@@ -251,8 +250,9 @@
 static inline uint16_t msgb_get_u16(struct msgb *msgb)
 {
 	uint8_t *space = msgb_get(msgb, 2);
-	return space[0] << 8 | space[1];
+	return osmo_load16be(space);
 }
+
 /*! \brief remove uint32 from end of message
  *  \param[in] msgb message buffer
  *  \returns 32bit value taken from end of msgb
@@ -260,7 +260,7 @@
 static inline uint32_t msgb_get_u32(struct msgb *msgb)
 {
 	uint8_t *space = msgb_get(msgb, 4);
-	return space[0] << 24 | space[1] << 16 | space[2] << 8 | space[3];
+	return osmo_load32be(space);
 }
 
 /*! \brief prepend (push) some data to start of message
@@ -284,6 +284,7 @@
 	msgb->len += len;
 	return msgb->data;
 }
+
 /*! \brief remove (pull) a header from the front of the message buffer
  *  \param[in] msgb message buffer
  *  \param[in] len number of octets to be pulled
@@ -323,6 +324,7 @@
 	uint8_t *space = msgb_pull(msgb, 1) - 1;
 	return space[0];
 }
+
 /*! \brief remove uint16 from front of message
  *  \param[in] msgb message buffer
  *  \returns 16bit value taken from end of msgb
@@ -330,8 +332,9 @@
 static inline uint16_t msgb_pull_u16(struct msgb *msgb)
 {
 	uint8_t *space = msgb_pull(msgb, 2) - 2;
-	return space[0] << 8 | space[1];
+	return osmo_load16be(space);
 }
+
 /*! \brief remove uint32 from front of message
  *  \param[in] msgb message buffer
  *  \returns 32bit value taken from end of msgb
@@ -339,7 +342,7 @@
 static inline uint32_t msgb_pull_u32(struct msgb *msgb)
 {
 	uint8_t *space = msgb_pull(msgb, 4) - 4;
-	return space[0] << 24 | space[1] << 16 | space[2] << 8 | space[3];
+	return osmo_load32be(space);
 }
 
 /*! \brief Increase headroom of empty msgb, reducing the tailroom
