diff --git a/src/endian.h b/src/endian.h
new file mode 100644
index 0000000000000000000000000000000000000000..268c0802335e8c13ac28f5488eea45e578298a18
--- /dev/null
+++ b/src/endian.h
@@ -0,0 +1,45 @@
+// SONIC ROBO BLAST 2
+//-----------------------------------------------------------------------------
+// Copyright (C) 2014 by Sonic Team Junior.
+//
+// This program is free software distributed under the
+// terms of the GNU General Public License, version 2.
+// See the 'LICENSE' file for more details.
+//-----------------------------------------------------------------------------
+/// \file  endian.h
+/// \brief Endian detection
+
+#ifndef __ENDIAN__
+#define __ENDIAN__
+
+#if defined(SRB2_BIG_ENDIAN) || defined(SRB2_LITTLE_ENDIAN)
+  // defined externally
+#else
+  #if defined(__FreeBSD__)
+    // on FreeBSD, _BIG_ENDIAN is a constant to compare
+	// _BYTE_ORDER to, not a big-endianess flag
+    #include <sys/endian.h>
+    #if _BYTE_ORDER == _BIG_ENDIAN
+      #define SRB2_BIG_ENDIAN
+    #else
+      #define SRB2_LITTLE_ENDIAN
+    #endif
+  #elif defined(__BYTE_ORDER__)
+    // defined by at least gcc and clang
+    #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
+      #define SRB2_BIG_ENDIAN
+    #else
+      #define SRB2_LITTLE_ENDIAN
+    #endif
+  #else
+    // check used in vanilla SRB2 (may work incorrectly if
+	// _BIG_ENDIAN is used as on FreeBSD)
+    #if defined(_BIG_ENDIAN)
+      #define SRB2_BIG_ENDIAN
+    #else
+      #define SRB2_LITTLE_ENDIAN
+    #endif
+  #endif
+#endif
+
+#endif //__ENDIAN__
diff --git a/src/m_swap.h b/src/m_swap.h
index ed723dff8c3249884d002ed9a8c653d5444737fb..74e6d119e719e558472df82b3a0e4a22bbda2224 100644
--- a/src/m_swap.h
+++ b/src/m_swap.h
@@ -14,9 +14,11 @@
 #ifndef __M_SWAP__
 #define __M_SWAP__
 
+#include "endian.h"
+
 // Endianess handling.
 // WAD files are stored little endian.
-#ifdef _BIG_ENDIAN
+#ifdef SRB2_BIG_ENDIAN
 
 #define SHORT(x) ((INT16)(\
 (((UINT16)(x) & (UINT16)0x00ffU) << 8) \
diff --git a/src/md5.c b/src/md5.c
index 73b767d65577aac0fe15ef3b6afc9b576d6af1d9..aeaac2cdee6d5421e0c8c391b0da3246351f6e31 100644
--- a/src/md5.c
+++ b/src/md5.c
@@ -44,14 +44,9 @@
 
 #include "md5.h"
 
-#ifdef _LIBC
- #include <endian.h>
- #if __BYTE_ORDER == __BIG_ENDIAN
-  #define WORDS_BIGENDIAN 1
- #endif
-#endif
+#include "endian.h"
 
-#if defined (WORDS_BIGENDIAN) || defined (_BIG_ENDIAN)
+#if defined (SRB2_BIG_ENDIAN)
  #define SWAP(n)							\
     (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
 #else