diff --git a/src/sbbs3/js_file.c b/src/sbbs3/js_file.c
index 1085b9890fe552f4e73ebef183a2c391ba939d81..2d8d07fd7355cc88f3a23a20c12497b0443996c2 100644
--- a/src/sbbs3/js_file.c
+++ b/src/sbbs3/js_file.c
@@ -652,7 +652,11 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist)
 					JS_SET_RVAL(cx, arglist, UINT_TO_JSVAL(*l));
 					break;
 				case sizeof(uint64_t):
-					JS_SET_RVAL(cx, arglist, DOUBLE_TO_JSVAL(*q));
+					if (p->network_byte_order)
+						*q = BE_INT64(*q);
+					else
+						*q = LE_INT64(*q);
+					JS_SET_RVAL(cx, arglist, DOUBLE_TO_JSVAL((double)*q));
 					break;
 			}
 		}
@@ -681,7 +685,11 @@ js_readbin(JSContext *cx, uintN argc, jsval *arglist)
 					v=UINT_TO_JSVAL(*(l++));
 					break;
 				case sizeof(uint64_t):
-					v = DOUBLE_TO_JSVAL(*(q++));
+					if (p->network_byte_order)
+						*q = BE_INT64(*q);
+					else
+						*q = LE_INT64(*q);
+					v = DOUBLE_TO_JSVAL((double)*(q++));
 					break;
 			}
         	if(!JS_SetElement(cx, array, i, &v)) {
@@ -1936,6 +1944,10 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist)
 					*o.sq = (int64_t)val;
 				else
 					*o.q = (uint64_t)val;
+				if (p->network_byte_order)
+					*o.q = BE_INT64(*o.q);
+				else
+					*o.q = LE_INT64(*o.q);
 				break;
 		}
 	}
@@ -1980,6 +1992,10 @@ js_writebin(JSContext *cx, uintN argc, jsval *arglist)
 						*o.sq = (int64_t)val;
 					else
 						*o.q = (uint64_t)val;
+					if (p->network_byte_order)
+						*o.q = BE_INT64(*o.q);
+					else
+						*o.q = LE_INT64(*o.q);
 					o.q++;
 					break;
 			}
diff --git a/src/xpdev/xpendian.h b/src/xpdev/xpendian.h
index 4c1b6514b83ab245ee5052663761b003f37828cd..d11f19c8fd919132ec29989b9c36efba877dcd31 100644
--- a/src/xpdev/xpendian.h
+++ b/src/xpdev/xpendian.h
@@ -29,9 +29,17 @@
 /************************/
 #define BYTE_SWAP_16(x)	((((WORD)(x)&0xff00)>>8) | (((WORD)(x)&0x00ff)<<8))
 #define BYTE_SWAP_32(x)	((((DWORD)(x)&0xff000000)>>24) | (((DWORD)(x)&0x00ff0000)>>8) | (((DWORD)(x)&0x0000ff00)<<8) | (((DWORD)(x)&0x000000ff)<<24))
+#define BYTE_SWAP_64(x)	((((uint64_t)(x) & 0xff00000000000000ULL) >> 56) | \
+						( ((uint64_t)(x) & 0x00ff000000000000ULL) >> 40) | \
+						( ((uint64_t)(x) & 0x0000ff0000000000ULL) >> 24) | \
+						( ((uint64_t)(x) & 0x000000ff00000000ULL) >> 8)  | \
+						( ((uint64_t)(x) & 0x00000000ff000000ULL) << 8)  | \
+						( ((uint64_t)(x) & 0x0000000000ff0000ULL) << 24) | \
+						( ((uint64_t)(x) & 0x000000000000ff00ULL) << 40) | \
+						( ((uint64_t)(x) & 0x00000000000000ffULL) << 56))
 
 /* auto-detect integer size */
-#define BYTE_SWAP_INT(x)	(sizeof(x)==2 ? BYTE_SWAP_16(x) : sizeof(x)==4 ? BYTE_SWAP_32(x) : (x))
+#define BYTE_SWAP_INT(x)	(sizeof(x)==2 ? BYTE_SWAP_16(x) : sizeof(x)==4 ? BYTE_SWAP_32(x) : sizeof(x)==8 ? BYTE_SWAP_64(x) : (x))
 
 /********************************/
 /* Architecture-specific macros */
@@ -42,11 +50,13 @@
 	#define BE_LONG(x)		(x)
 	#define BE_INT16(x)		(x)
 	#define BE_INT32(x)		(x)
+	#define BE_INT64(x)		(x)
 	#define BE_INT(x)		(x)
 	#define LE_SHORT(x)		BYTE_SWAP_16(x)
 	#define LE_LONG(x)		BYTE_SWAP_32(x)
 	#define LE_INT16(x)		BYTE_SWAP_16(x)
 	#define LE_INT32(x)		BYTE_SWAP_32(x)
+	#define LE_INT64(x)		BYTE_SWAP_64(x)
 	#define LE_INT(x)		BYTE_SWAP_INT(x)
 
 #else	/* Little Endian (e.g. Intel) */
@@ -55,11 +65,13 @@
 	#define LE_LONG(x)		(x)
 	#define LE_INT16(x)		(x)
 	#define LE_INT32(x)		(x)
+	#define LE_INT64(x)		(x)
 	#define LE_INT(x)		(x)
 	#define BE_SHORT(x)		BYTE_SWAP_16(x)
 	#define BE_LONG(x)		BYTE_SWAP_32(x)
 	#define BE_INT16(x)		BYTE_SWAP_16(x)
 	#define BE_INT32(x)		BYTE_SWAP_32(x)
+	#define BE_INT64(x)		BYTE_SWAP_64(x)
 	#define BE_INT(x)		BYTE_SWAP_INT(x)
 
 #endif