diff --git a/src/encode.c b/src/encode.c
index 4096c3333c11850c660b9ef765cf067a9714dcd0..db08e24cf6bc88691c3de68071e1fed37a276afb 100644
--- a/src/encode.c
+++ b/src/encode.c
@@ -30,6 +30,7 @@
 #include "opcodes.h"
 #include "peep.h"
 #include "pike_compiler.h"
+#include "bitvector.h"
 
 /* #define ENCODE_DEBUG */
 
@@ -2475,14 +2476,12 @@ static void low_decode_type(struct decode_data *data)
     case T_INT:
       {
 	INT32 min=0, max=0;
-	min = GETC();
-	min = (min<<8)|GETC();
-	min = (min<<8)|GETC();
-	min = (min<<8)|GETC();
-	max = GETC();
-	max = (max<<8)|GETC();
-	max = (max<<8)|GETC();
-	max = (max<<8)|GETC();
+	if(data->ptr + 8 > data->len)
+	  Pike_error("Decode error: Not enough data in string.\n");
+	min = get_unaligned_be32(data->data + data->ptr);
+	data->ptr += 4;
+	max = get_unaligned_be32(data->data + data->ptr);
+	data->ptr += 4;
 	push_int_type(min, max);
       }
       break;
diff --git a/src/pike_types.c b/src/pike_types.c
index c95aef5e85925df90896974ac5203aaeca4f0a44..44a3b499e51d5e8702b8e535789bab77b54d9bd8 100644
--- a/src/pike_types.c
+++ b/src/pike_types.c
@@ -28,6 +28,7 @@
 #include "gc.h"
 #include "pike_compiler.h"
 #include "block_allocator.h"
+#include "bitvector.h"
 
 #ifdef PIKE_DEBUG
 #define PIKE_TYPE_DEBUG
@@ -1380,11 +1381,7 @@ static void push_type_field(TYPE_FIELD field)
 
 INT32 extract_type_int(char *p)
 {
-  int e;
-  INT32 ret=0;
-  for(e=0;e<(int)sizeof(INT32);e++)
-    ret=(ret<<8) | EXTRACT_UCHAR(p+e);
-  return ret;
+  return get_unaligned_be32(p);
 }
 
 struct pike_type *debug_pop_unfinished_type(void)
diff --git a/src/post_modules/BSON/bson.cmod b/src/post_modules/BSON/bson.cmod
index af97880f9af0e446202f3ccea5a536725002dd09..b9ecba203aa40f30b05edfa13993e5df9ec3d60d 100644
--- a/src/post_modules/BSON/bson.cmod
+++ b/src/post_modules/BSON/bson.cmod
@@ -22,6 +22,7 @@
 #include "interpret.h"
 #include "mapping.h"
 #include "module_support.h"
+#include "bitvector.h"
 #include "object.h"
 #include "pike_macros.h"
 #include "pike_types.h"
@@ -128,25 +129,6 @@ struct svalue * lookup_svalue(const char * prog)
 
 DECLARATIONS
 
-/*
-** Little endian to host, Long
-*/
-static int32_t ltohl(const char *p)
-{
-    return ((int32_t)((const unsigned char *)p)[0]) |
-        (((int32_t)((const unsigned char *)p)[1])<<8) |
-        (((int32_t)((const unsigned char *)p)[2])<<16) |
-        (((int32_t)((const signed char *)p)[3])<<24);
-}
-
-/*
-** Little endian to host, "double" i.e. long long
-*/
-static int64_t ltohd(const char *p)
-{
-    return ((uint32_t)ltohl(p)) | (((int64_t)ltohl(p+4))<<32);
-}
-
 struct mapping * decode_document(struct pike_string * pike_slist)
 {
   char * slist;
@@ -167,7 +149,7 @@ struct mapping * decode_document(struct pike_string * pike_slist)
   if(left < 4)
     Pike_error("invalid BSON. not enough data.\n");
     
-  len = ltohl(n);
+  len = get_unaligned_le32(n);
     
   left = pike_slist->len - (n - slist);
     
@@ -246,7 +228,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi
       struct pike_string * val;
       int32_t bump;
       int32_t left;
-      bump = ltohl(n);
+      bump = get_unaligned_le32(n);
       left = pike_slist->len - (n - slist);
 
       if(!bump || bump > left)
@@ -264,7 +246,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi
     case TYPE_BSON_BINARY:
     {
       struct pike_string * val;
-      int32_t bump = ltohl(n);
+      int32_t bump = get_unaligned_le32(n);
       int32_t left;
       n+=4;
       left = pike_slist->len - (n - slist);
@@ -287,7 +269,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi
       {
         Pike_error("invalid BSON. not enough data 6.\n");
       }
-      t = ltohl(n);
+      t = get_unaligned_le32(n);
       push_int(t);
       n+=4;
       break;
@@ -301,7 +283,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi
       {
         Pike_error("invalid BSON. not enough data 7.\n");
       }
-      t = ltohd(n);
+      t = get_unaligned_le64(n);
       push_int64(t);
       n+=8;
       break;
@@ -385,7 +367,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi
       {
         Pike_error("invalid BSON. not enough data 9.\n");
       }
-      sec = (uint64_t)ltohd(n);
+      sec = get_unaligned_le64(n);
       n+=8;
       
      if(!Timestamp)
@@ -406,7 +388,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi
       {
         Pike_error("invalid BSON. not enough data 10.\n");
       }
-      sec = (uint64_t)ltohd(n);
+      sec = get_unaligned_le64(n);
       n+=8;
       
       if(!Second)
@@ -434,7 +416,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi
       {
         Pike_error("invalid BSON. not enough data 11.\n");      
       }
-      len = ltohl(n);
+      len = get_unaligned_le32(n);
       
       left = pike_slist->len - (n - slist);
       if(left < len)
@@ -480,7 +462,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi
       {
         Pike_error("invalid BSON. not enough data 11.\n");      
       }
-      len = ltohl(n);
+      len = get_unaligned_le32(n);
       
       left = pike_slist->len - (n - slist);
       if(left < len)
@@ -524,7 +506,7 @@ char * decode_next_value(struct pike_string * pike_slist, char * n, struct mappi
     case TYPE_BSON_JAVASCRIPT:
     {
       struct pike_string * val;
-      int32_t bump = ltohl(n);
+      int32_t bump = get_unaligned_le32(n);
       int32_t left;
       n+=4;
       left = pike_slist->len - (n - slist);
diff --git a/src/program.c b/src/program.c
index 143ad27571d978dcb19b25e50e8ccd8354862bb1..61603ae136556d131436239c491646e3ba8b416f 100644
--- a/src/program.c
+++ b/src/program.c
@@ -37,6 +37,7 @@
 #include "pikecode.h"
 #include "pike_compiler.h"
 #include "module_support.h"
+#include "bitvector.h"
 
 #include <errno.h>
 #include <fcntl.h>
@@ -7225,29 +7226,21 @@ INT_TYPE get_small_number(char **q)
   /* This is a workaround for buggy cc & Tru64 */
   unsigned char *addr = (unsigned char *)*q;
   INT_TYPE ret = *((signed char *)addr);
-  ret=*(signed char *)*q;
   addr++;
   switch(ret)
   {
   case -127:
-    ret = (((signed char *)addr)[0]<<8) | addr[1];
+    ret = (INT16)get_unaligned_be16(addr);
     addr += 2;
     if (!ret) {
       /* 64-bit signed number. */
-      ret = *((signed char *)addr++);
-      ret = (ret<<8) | *(addr++);
-      ret = (ret<<8) | *(addr++);
-      ret = (ret<<8) | *(addr++);
-      ret = (ret<<8) | *(addr++);
-      ret = (ret<<8) | *(addr++);
-      ret = (ret<<8) | *(addr++);
-      ret = (ret<<8) | *(addr++);
+      ret = get_unaligned_be64(addr);
+      addr += 8;
     }
     break;
 
   case -128:
-    ret = (((signed char *)addr)[0]<<24) | (addr[1]<<16) |
-      (addr[2]<<8) | addr[3];
+    ret = (INT32)get_unaligned_be32(addr);
     addr += 4;
     break;