diff --git a/base/source/java/ch/systemsx/cisd/base/convert/NativeData.java b/base/source/java/ch/systemsx/cisd/base/convert/NativeData.java
index 423b911b7f94015f4ce9a6a907bc591ac8e3d539..2831c263f3d1a7b7b51120c6e5cf58f930abf7db 100644
--- a/base/source/java/ch/systemsx/cisd/base/convert/NativeData.java
+++ b/base/source/java/ch/systemsx/cisd/base/convert/NativeData.java
@@ -1,6 +1,6 @@
 /****************************************************************************
  * NCSA HDF                                                                 *
- * National Comptational Science Alliance                                   *
+ * National Computational Science Alliance                                   *
  * University of Illinois at Urbana-Champaign                               *
  * 605 E. Springfield, Champaign IL 61820                                   *
  *                                                                          *
@@ -13,6 +13,8 @@
 
 package ch.systemsx.cisd.base.convert;
 
+import java.nio.ByteBuffer;
+
 import ch.systemsx.cisd.base.utilities.NativeLibraryUtilities;
 
 /**
@@ -29,13 +31,16 @@ import ch.systemsx.cisd.base.utilities.NativeLibraryUtilities;
  */
 public class NativeData
 {
+    private static final boolean useNativeLib;
 
     static
     {
-        if (NativeLibraryUtilities.loadNativeLibrary("nativedata") == false)
+        if (Boolean.getBoolean("nativedata.javamode"))
+        {
+            useNativeLib = false;
+        } else
         {
-            System.err.println("No suitable 'nativedata' library found for this platform.");
-            System.exit(1);
+            useNativeLib = NativeLibraryUtilities.loadNativeLibrary("nativedata");
         }
     }
 
@@ -59,11 +64,29 @@ public class NativeData
     public enum ByteOrder
     {
         /** <code>byte[]</code> is in native byte order (that is: don't change byte order) */
-        NATIVE,
+        NATIVE(java.nio.ByteOrder.nativeOrder()),
         /** <code>byte[]</code> is in little endian byte order */
-        LITTLE_ENDIAN,
+        LITTLE_ENDIAN(java.nio.ByteOrder.LITTLE_ENDIAN),
         /** <code>byte[]</code> is in big endian byte order */
-        BIG_ENDIAN,
+        BIG_ENDIAN(java.nio.ByteOrder.BIG_ENDIAN);
+
+        private final java.nio.ByteOrder nioByteOrder;
+
+        ByteOrder(java.nio.ByteOrder nioByteOrder)
+        {
+            this.nioByteOrder = nioByteOrder;
+        }
+
+        java.nio.ByteOrder getNioByteOrder()
+        {
+            return nioByteOrder;
+        }
+
+        static ByteOrder getNativeByteOder()
+        {
+            return NATIVE.nioByteOrder.equals(LITTLE_ENDIAN.nioByteOrder) ? LITTLE_ENDIAN
+                    : BIG_ENDIAN;
+        }
     }
 
     /**
@@ -85,8 +108,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyIntToByte(int[] inData, int inStart, byte[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyIntToByte(int[] inData, int inStart, byte[] outData,
+            int outStart, int len, int byteOrder);
 
     /**
      * Copies a range from an array of <code>byte</code> into an array of <code>int</code>.
@@ -101,8 +124,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyByteToInt(byte[] inData, int inStart, int[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyByteToInt(byte[] inData, int inStart, int[] outData,
+            int outStart, int len, int byteOrder);
 
     /**
      * Copies a range from an array of <code>long</code> into an array of <code>byte</code>.
@@ -117,8 +140,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyLongToByte(long[] inData, int inStart, byte[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyLongToByte(long[] inData, int inStart, byte[] outData,
+            int outStart, int len, int byteOrder);
 
     /**
      * Copies a range from an array of <code>byte</code> into an array of <code>long</code>.
@@ -133,8 +156,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyByteToLong(byte[] inData, int inStart, long[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyByteToLong(byte[] inData, int inStart, long[] outData,
+            int outStart, int len, int byteOrder);
 
     /**
      * Copies a range from an array of <code>short</code> into an array of <code>byte</code>.
@@ -149,8 +172,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyShortToByte(short[] inData, int inStart, byte[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyShortToByte(short[] inData, int inStart, byte[] outData,
+            int outStart, int len, int byteOrder);
 
     /**
      * Copies a range from an array of <code>byte</code> into an array of <code>short</code>.
@@ -165,8 +188,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyByteToShort(byte[] inData, int inStart, short[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyByteToShort(byte[] inData, int inStart, short[] outData,
+            int outStart, int len, int byteOrder);
 
     /**
      * Copies a range from an array of <code>float</code> into an array of <code>byte</code>.
@@ -181,8 +204,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyFloatToByte(float[] inData, int inStart, byte[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyFloatToByte(float[] inData, int inStart, byte[] outData,
+            int outStart, int len, int byteOrder);
 
     /**
      * Copies a range from an array of <code>byte</code> into an array of <code>float</code>.
@@ -197,8 +220,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyByteToFloat(byte[] inData, int inStart, float[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyByteToFloat(byte[] inData, int inStart, float[] outData,
+            int outStart, int len, int byteOrder);
 
     /**
      * Copies a range from an array of <code>double</code> into an array of <code>byte</code>.
@@ -213,8 +236,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyDoubleToByte(double[] inData, int inStart, byte[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyDoubleToByte(double[] inData, int inStart, byte[] outData,
+            int outStart, int len, int byteOrder);
 
     /**
      * Copies a range from an array of <code>byte</code> into an array of <code>double</code>.
@@ -229,8 +252,8 @@ public class NativeData
      * @param byteOrder The ordinal of {@link ByteOrder}, encoding what byte order the
      *            <var>outData</var> should be in.
      */
-    private static native void copyByteToDouble(byte[] inData, int inStart, double[] outData, int outStart,
-            int len, int byteOrder);
+    private static native void copyByteToDouble(byte[] inData, int inStart, double[] outData,
+            int outStart, int len, int byteOrder);
 
     //
     // Public
@@ -246,7 +269,55 @@ public class NativeData
      */
     public static ByteOrder getNativeByteOrder()
     {
-        return isLittleEndian() ? ByteOrder.LITTLE_ENDIAN : ByteOrder.BIG_ENDIAN;
+        return ByteOrder.getNativeByteOder();
+    }
+
+    /**
+     * Changes the byte order of the bytes constituting <var>s</var>.
+     */
+    public static short changeByteOrder(short s)
+    {
+        return (short) ((s << 8) | ((s >> 8) & 0xff));
+    }
+
+    /**
+     * Changes the byte order of the bytes constituting <var>c</var>.
+     */
+    public static char changeByteOrder(char c)
+    {
+        return (char) ((c << 8) | ((c >> 8) & 0xff));
+    }
+
+    /**
+     * Changes the byte order of the bytes constituting <var>i</var>.
+     */
+    public static int changeByteOrder(int i)
+    {
+        return ((changeByteOrder((short) i) << 16) | (changeByteOrder((short) (i >> 16)) & 0xffff));
+    }
+
+    /**
+     * Changes the byte order of the bytes constituting <var>f</var>.
+     */
+    public static float changeByteOrder(float f)
+    {
+        return Float.intBitsToFloat(changeByteOrder(Float.floatToRawIntBits(f)));
+    }
+
+    /**
+     * Changes the byte order of the bytes constituting <var>l</var>.
+     */
+    public static long changeByteOrder(long l)
+    {
+        return (((long) changeByteOrder((int) (l)) << 32) | (changeByteOrder((int) (l >> 32)) & 0xffffffffL));
+    }
+
+    /**
+     * Changes the byte order of the bytes constituting <var>d</var>.
+     */
+    public static double changeByteOrder(double d)
+    {
+        return Double.longBitsToDouble(changeByteOrder(Double.doubleToRawLongBits(d)));
     }
 
     /**
@@ -265,7 +336,15 @@ public class NativeData
     public static void copyIntToByte(int[] inData, int inStart, byte[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-        copyIntToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        if (useNativeLib)
+        {
+            copyIntToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(outData, outStart, len * INT_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asIntBuffer().put(inData, inStart, len);
+        }
     }
 
     /**
@@ -284,7 +363,15 @@ public class NativeData
     public static void copyByteToInt(byte[] inData, int inStart, int[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-        copyByteToInt(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        if (useNativeLib)
+        {
+            copyByteToInt(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(inData, inStart, len * INT_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asIntBuffer().get(outData, outStart, len);
+        }
     }
 
     /**
@@ -303,7 +390,15 @@ public class NativeData
     public static void copyLongToByte(long[] inData, int inStart, byte[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-        copyLongToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        if (useNativeLib)
+        {
+            copyLongToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(outData, outStart, len * LONG_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asLongBuffer().put(inData, inStart, len);
+        }
     }
 
     /**
@@ -322,7 +417,15 @@ public class NativeData
     public static void copyByteToLong(byte[] inData, int inStart, long[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-        copyByteToLong(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        if (useNativeLib)
+        {
+            copyByteToLong(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(inData, inStart, len * LONG_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asLongBuffer().get(outData, outStart, len);
+        }
     }
 
     /**
@@ -341,7 +444,15 @@ public class NativeData
     public static void copyShortToByte(short[] inData, int inStart, byte[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-        copyShortToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        if (useNativeLib)
+        {
+            copyShortToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(outData, outStart, len * SHORT_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asShortBuffer().put(inData, inStart, len);
+        }
     }
 
     /**
@@ -360,7 +471,15 @@ public class NativeData
     public static void copyByteToShort(byte[] inData, int inStart, short[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-        copyByteToShort(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        if (useNativeLib)
+        {
+            copyByteToShort(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(inData, inStart, len * SHORT_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asShortBuffer().get(outData, outStart, len);
+        }
     }
 
     /**
@@ -379,7 +498,15 @@ public class NativeData
     public static void copyFloatToByte(float[] inData, int inStart, byte[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-        copyFloatToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        if (useNativeLib)
+        {
+            copyFloatToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(outData, outStart, len * FLOAT_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asFloatBuffer().put(inData, inStart, len);
+        }
     }
 
     /**
@@ -398,7 +525,15 @@ public class NativeData
     public static void copyByteToFloat(byte[] inData, int inStart, float[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-        copyByteToFloat(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        if (useNativeLib)
+        {
+            copyByteToFloat(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(inData, inStart, len * FLOAT_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asFloatBuffer().get(outData, outStart, len);
+        }
     }
 
     /**
@@ -417,7 +552,15 @@ public class NativeData
     public static void copyDoubleToByte(double[] inData, int inStart, byte[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-       copyDoubleToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal()); 
+        if (useNativeLib)
+        {
+            copyDoubleToByte(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(outData, outStart, len * DOUBLE_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asDoubleBuffer().put(inData, inStart, len);
+        }
     }
 
     /**
@@ -436,7 +579,15 @@ public class NativeData
     public static void copyByteToDouble(byte[] inData, int inStart, double[] outData, int outStart,
             int len, ByteOrder byteOrder)
     {
-        copyByteToDouble(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        if (useNativeLib)
+        {
+            copyByteToDouble(inData, inStart, outData, outStart, len, byteOrder.ordinal());
+        } else
+        {
+            final ByteBuffer bb = ByteBuffer.wrap(inData, inStart, len * DOUBLE_SIZE);
+            bb.order(byteOrder.getNioByteOrder());
+            bb.asDoubleBuffer().get(outData, outStart, len);
+        }
     }
 
     /**
@@ -451,7 +602,7 @@ public class NativeData
     public static short[] byteToShort(byte[] byteArr, ByteOrder byteOrder, int start, int len)
     {
         final short[] array = new short[len];
-        copyByteToShort(byteArr, start, array, 0, len, byteOrder.ordinal());
+        copyByteToShort(byteArr, start, array, 0, len, byteOrder);
         return array;
     }
 
@@ -470,7 +621,7 @@ public class NativeData
         }
         final int len = byteArr.length / SHORT_SIZE;
         final short[] array = new short[len];
-        copyByteToShort(byteArr, 0, array, 0, len, byteOrder.ordinal());
+        copyByteToShort(byteArr, 0, array, 0, len, byteOrder);
         return array;
     }
 
@@ -486,7 +637,7 @@ public class NativeData
     public static byte[] shortToByte(short[] data, ByteOrder byteOrder, int start, int len)
     {
         final byte[] byteArr = new byte[SHORT_SIZE * len];
-        copyShortToByte(data, start, byteArr, 0, len, byteOrder.ordinal());
+        copyShortToByte(data, start, byteArr, 0, len, byteOrder);
         return byteArr;
     }
 
@@ -500,7 +651,7 @@ public class NativeData
     public static byte[] shortToByte(short[] data, ByteOrder byteOrder)
     {
         final byte[] byteArr = new byte[SHORT_SIZE * data.length];
-        copyShortToByte(data, 0, byteArr, 0, data.length, byteOrder.ordinal());
+        copyShortToByte(data, 0, byteArr, 0, data.length, byteOrder);
         return byteArr;
     }
 
@@ -516,7 +667,7 @@ public class NativeData
     public static int[] byteToInt(byte[] byteArr, ByteOrder byteOrder, int start, int len)
     {
         final int[] array = new int[len];
-        copyByteToInt(byteArr, start, array, 0, len, byteOrder.ordinal());
+        copyByteToInt(byteArr, start, array, 0, len, byteOrder);
         return array;
     }
 
@@ -535,7 +686,7 @@ public class NativeData
         }
         final int len = byteArr.length / INT_SIZE;
         final int[] array = new int[len];
-        copyByteToInt(byteArr, 0, array, 0, len, byteOrder.ordinal());
+        copyByteToInt(byteArr, 0, array, 0, len, byteOrder);
         return array;
     }
 
@@ -551,7 +702,7 @@ public class NativeData
     public static byte[] intToByte(int[] data, ByteOrder byteOrder, int start, int len)
     {
         final byte[] byteArr = new byte[INT_SIZE * len];
-        copyIntToByte(data, start, byteArr, 0, len, byteOrder.ordinal());
+        copyIntToByte(data, start, byteArr, 0, len, byteOrder);
         return byteArr;
     }
 
@@ -565,7 +716,7 @@ public class NativeData
     public static byte[] intToByte(int[] data, ByteOrder byteOrder)
     {
         final byte[] byteArr = new byte[INT_SIZE * data.length];
-        copyIntToByte(data, 0, byteArr, 0, data.length, byteOrder.ordinal());
+        copyIntToByte(data, 0, byteArr, 0, data.length, byteOrder);
         return byteArr;
     }
 
@@ -581,7 +732,7 @@ public class NativeData
     public static long[] byteToLong(byte[] byteArr, ByteOrder byteOrder, int start, int len)
     {
         final long[] array = new long[len];
-        copyByteToLong(byteArr, start, array, 0, len, byteOrder.ordinal());
+        copyByteToLong(byteArr, start, array, 0, len, byteOrder);
         return array;
     }
 
@@ -600,7 +751,7 @@ public class NativeData
         }
         final int len = byteArr.length / LONG_SIZE;
         final long[] array = new long[len];
-        copyByteToLong(byteArr, 0, array, 0, len, byteOrder.ordinal());
+        copyByteToLong(byteArr, 0, array, 0, len, byteOrder);
         return array;
     }
 
@@ -616,7 +767,7 @@ public class NativeData
     public static byte[] longToByte(long[] data, ByteOrder byteOrder, int start, int len)
     {
         final byte[] byteArr = new byte[LONG_SIZE * len];
-        copyLongToByte(data, start, byteArr, 0, len, byteOrder.ordinal());
+        copyLongToByte(data, start, byteArr, 0, len, byteOrder);
         return byteArr;
     }
 
@@ -630,7 +781,7 @@ public class NativeData
     public static byte[] longToByte(long[] data, ByteOrder byteOrder)
     {
         final byte[] byteArr = new byte[LONG_SIZE * data.length];
-        copyLongToByte(data, 0, byteArr, 0, data.length, byteOrder.ordinal());
+        copyLongToByte(data, 0, byteArr, 0, data.length, byteOrder);
         return byteArr;
     }
 
@@ -646,7 +797,7 @@ public class NativeData
     public static float[] byteToFloat(byte[] byteArr, ByteOrder byteOrder, int start, int len)
     {
         final float[] array = new float[len];
-        copyByteToFloat(byteArr, start, array, 0, len, byteOrder.ordinal());
+        copyByteToFloat(byteArr, start, array, 0, len, byteOrder);
         return array;
     }
 
@@ -665,7 +816,7 @@ public class NativeData
         }
         final int len = byteArr.length / FLOAT_SIZE;
         final float[] array = new float[len];
-        copyByteToFloat(byteArr, 0, array, 0, len, byteOrder.ordinal());
+        copyByteToFloat(byteArr, 0, array, 0, len, byteOrder);
         return array;
     }
 
@@ -681,7 +832,7 @@ public class NativeData
     public static byte[] floatToByte(float[] data, ByteOrder byteOrder, int start, int len)
     {
         final byte[] byteArr = new byte[FLOAT_SIZE * len];
-        copyFloatToByte(data, start, byteArr, 0, len, byteOrder.ordinal());
+        copyFloatToByte(data, start, byteArr, 0, len, byteOrder);
         return byteArr;
     }
 
@@ -695,7 +846,7 @@ public class NativeData
     public static byte[] floatToByte(float[] data, ByteOrder byteOrder)
     {
         final byte[] byteArr = new byte[FLOAT_SIZE * data.length];
-        copyFloatToByte(data, 0, byteArr, 0, data.length, byteOrder.ordinal());
+        copyFloatToByte(data, 0, byteArr, 0, data.length, byteOrder);
         return byteArr;
     }
 
@@ -711,7 +862,7 @@ public class NativeData
     public static double[] byteToDouble(byte[] byteArr, ByteOrder byteOrder, int start, int len)
     {
         final double[] array = new double[len];
-        copyByteToDouble(byteArr, start, array, 0, len, byteOrder.ordinal());
+        copyByteToDouble(byteArr, start, array, 0, len, byteOrder);
         return array;
     }
 
@@ -730,7 +881,7 @@ public class NativeData
         }
         final int len = byteArr.length / DOUBLE_SIZE;
         final double[] array = new double[len];
-        copyByteToDouble(byteArr, 0, array, 0, len, byteOrder.ordinal());
+        copyByteToDouble(byteArr, 0, array, 0, len, byteOrder);
         return array;
     }
 
@@ -746,7 +897,7 @@ public class NativeData
     public static byte[] doubleToByte(double[] data, ByteOrder byteOrder, int start, int len)
     {
         final byte[] byteArr = new byte[DOUBLE_SIZE * len];
-        copyDoubleToByte(data, start, byteArr, 0, len, byteOrder.ordinal());
+        copyDoubleToByte(data, start, byteArr, 0, len, byteOrder);
         return byteArr;
     }
 
@@ -760,7 +911,7 @@ public class NativeData
     public static byte[] doubleToByte(double[] data, ByteOrder byteOrder)
     {
         final byte[] byteArr = new byte[DOUBLE_SIZE * data.length];
-        copyDoubleToByte(data, 0, byteArr, 0, data.length, byteOrder.ordinal());
+        copyDoubleToByte(data, 0, byteArr, 0, data.length, byteOrder);
         return byteArr;
     }
 
diff --git a/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java b/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java
index ef8d4219cb7b0dd1a35220adc8ecfb0d13984c64..2203d2e79bda0448d8f3bd6677f3980ac0d681bf 100644
--- a/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java
+++ b/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java
@@ -80,6 +80,86 @@ public class NativeDataTests
         assertTrue(Arrays.equals(iarr, iarr2));
     }
 
+    @Test
+    public void testIntChangeByteOrderAndBack()
+    {
+        assertEquals(0, NativeData.changeByteOrder(NativeData.changeByteOrder(0)));
+        assertEquals(1, NativeData.changeByteOrder(NativeData.changeByteOrder(1)));
+        assertEquals(-1, NativeData.changeByteOrder(NativeData.changeByteOrder(-1)));
+        assertEquals(Integer.MAX_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Integer.MAX_VALUE)));
+        assertEquals(Integer.MIN_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Integer.MIN_VALUE)));
+    }
+
+    @Test
+    public void testShortChangeByteOrderAndBack()
+    {
+        assertEquals((short) 0, NativeData.changeByteOrder(NativeData.changeByteOrder((short) 0)));
+        assertEquals((short) 1, NativeData.changeByteOrder(NativeData.changeByteOrder((short) 1)));
+        assertEquals((short) -1, NativeData.changeByteOrder(NativeData.changeByteOrder((short) -1)));
+        assertEquals(Short.MAX_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Short.MAX_VALUE)));
+        assertEquals(Short.MIN_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Short.MIN_VALUE)));
+    }
+
+    @Test
+    public void testCharChangeByteOrderAndBack()
+    {
+        assertEquals((char) 0, NativeData.changeByteOrder(NativeData.changeByteOrder((char) 0)));
+        assertEquals((char) 1, NativeData.changeByteOrder(NativeData.changeByteOrder((char) 1)));
+        assertEquals((char) -1, NativeData.changeByteOrder(NativeData.changeByteOrder((char) -1)));
+        assertEquals((char) Short.MAX_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder((char) Short.MAX_VALUE)));
+        assertEquals((char) Short.MIN_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder((char) Short.MIN_VALUE)));
+    }
+
+    @Test
+    public void testLongChangeByteOrderAndBack()
+    {
+        assertEquals(0, NativeData.changeByteOrder(NativeData.changeByteOrder(0L)));
+        assertEquals(1, NativeData.changeByteOrder(NativeData.changeByteOrder(1L)));
+        assertEquals(-1, NativeData.changeByteOrder(NativeData.changeByteOrder(-1L)));
+        assertEquals(Long.MAX_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Long.MAX_VALUE)));
+        assertEquals(Long.MIN_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Long.MIN_VALUE)));
+    }
+
+    @Test
+    public void testFloatChangeByteOrderAndBack()
+    {
+        assertEquals(0f, NativeData.changeByteOrder(NativeData.changeByteOrder(0f)));
+        assertEquals(1f, NativeData.changeByteOrder(NativeData.changeByteOrder(1f)));
+        assertEquals(-1f, NativeData.changeByteOrder(NativeData.changeByteOrder(-1f)));
+        assertEquals(Float.MAX_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Float.MAX_VALUE)));
+        assertEquals(Float.MIN_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Float.MIN_VALUE)));
+        assertEquals(-Float.MAX_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(-Float.MAX_VALUE)));
+        assertEquals(-Float.MIN_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(-Float.MIN_VALUE)));
+    }
+
+    @Test
+    public void testDoubleChangeByteOrderAndBack()
+    {
+        assertEquals(0., NativeData.changeByteOrder(NativeData.changeByteOrder(0.)));
+        assertEquals(1., NativeData.changeByteOrder(NativeData.changeByteOrder(1.)));
+        assertEquals(-1., NativeData.changeByteOrder(NativeData.changeByteOrder(-1.)));
+        assertEquals(Double.MAX_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Double.MAX_VALUE)));
+        assertEquals(Double.MIN_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(Double.MIN_VALUE)));
+        assertEquals(-Double.MAX_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(-Double.MAX_VALUE)));
+        assertEquals(-Double.MIN_VALUE,
+                NativeData.changeByteOrder(NativeData.changeByteOrder(-Double.MIN_VALUE)));
+    }
+
     @Test(dataProvider = "getOfs")
     public void testLongToByteToLong(int sourceOfs, int targetOfs)
     {
@@ -244,7 +324,7 @@ public class NativeDataTests
         NativeData.copyByteToLong(null, 0, null, 0, 0, ByteOrder.NATIVE);
     }
 
-    @Test(expectedExceptions = IllegalArgumentException.class)
+    @Test(expectedExceptions = {IllegalArgumentException.class, IndexOutOfBoundsException.class})
     public void testIAE()
     {
         NativeData.copyByteToLong(new byte[] {}, -1, new long[] {}, 0, 0, ByteOrder.NATIVE);
@@ -287,7 +367,7 @@ public class NativeDataTests
         final byte[] trailerArray = new byte[]
             { 5, 6, 7, 8 };
         final byte[] barr =
-            new byte[iarr.length * sizeOfTarget + headerArray.length + trailerArray.length];
+                new byte[iarr.length * sizeOfTarget + headerArray.length + trailerArray.length];
         System.arraycopy(headerArray, 0, barr, 0, headerArray.length);
         System.arraycopy(trailerArray, 0, barr, headerArray.length + iarr.length * sizeOfTarget,
                 trailerArray.length);