diff --git a/common/resource/test-data/HDF5ContainerBasedHierarchicalContentNodeTest/thumbnails.h5 b/common/resource/test-data/HDF5ContainerBasedHierarchicalContentNodeTest/thumbnails.h5
new file mode 100644
index 0000000000000000000000000000000000000000..26b6d1d2b811814c1db75f7dd008cede7d4b01fb
Binary files /dev/null and b/common/resource/test-data/HDF5ContainerBasedHierarchicalContentNodeTest/thumbnails.h5 differ
diff --git a/common/resource/test-data/HDF5ContainerBasedHierarchicalContentNodeTest/thumbnails.h5ar b/common/resource/test-data/HDF5ContainerBasedHierarchicalContentNodeTest/thumbnails.h5ar
new file mode 100644
index 0000000000000000000000000000000000000000..194bcd2d1cf5157fda61ec28344ed1992ca761ed
Binary files /dev/null and b/common/resource/test-data/HDF5ContainerBasedHierarchicalContentNodeTest/thumbnails.h5ar differ
diff --git a/common/source/java/ch/systemsx/cisd/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNode.java b/common/source/java/ch/systemsx/cisd/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNode.java
index e1d55337195838f2af58c9d266c429beb3e4fcb9..668d6b2c53aafeaecf08d28de0c2c57d501934b0 100644
--- a/common/source/java/ch/systemsx/cisd/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNode.java
+++ b/common/source/java/ch/systemsx/cisd/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNode.java
@@ -321,7 +321,7 @@ public class HDF5ContainerBasedHierarchicalContentNode extends
                 int entryChecksum = entry.getCrc32();
                 if (entryChecksum != 0)
                 {
-                    checksum = (long) entryChecksum;
+                    checksum = entryChecksum & 0xffffffffL;
                 } else
                 {
                     checksum = IOUtilities.getChecksumCRC32(doGetInputStream());
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/io/IOUtilitiesTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/io/IOUtilitiesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a1c83781a9a489a9c3bfe28caa49fdf56eab286
--- /dev/null
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/io/IOUtilitiesTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.common.io;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.Random;
+import java.util.zip.CRC32;
+
+import org.testng.AssertJUnit;
+import org.testng.annotations.Test;
+
+/**
+ * @author Franz-Josef Elmer
+ */
+public class IOUtilitiesTest extends AssertJUnit
+{
+    private static final class CloseDetectingByteArrayInputStream extends ByteArrayInputStream
+    {
+        private boolean closeInvoked;
+
+        public CloseDetectingByteArrayInputStream(byte[] bytes)
+        {
+            super(bytes);
+        }
+
+        @Override
+        public void close() throws IOException
+        {
+            closeInvoked = true;
+            super.close();
+        }
+    }
+
+    @Test
+    public void test()
+    {
+        Random random = new Random(37);
+        byte[] exampleData = new byte[1000];
+        for (int i = 0; i < exampleData.length; i++)
+        {
+            exampleData[i] = (byte) random.nextInt();
+        }
+        CRC32 crc32 = new CRC32();
+        crc32.update(exampleData);
+        long expectedChecksum = crc32.getValue();
+        CloseDetectingByteArrayInputStream inputStream =
+                new CloseDetectingByteArrayInputStream(exampleData);
+
+        long checksum = IOUtilities.getChecksumCRC32(inputStream);
+
+        assertEquals(expectedChecksum, checksum);
+        assertEquals(true, inputStream.closeInvoked);
+    }
+
+}
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/AbstractHierarchicalContentNodeTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/AbstractHierarchicalContentNodeTest.java
index 09cd68e2c485fa3f14e7abe3e6b415963c2e4b82..4bde6c2cf01726f75d8911092244d70318f1bdd2 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/AbstractHierarchicalContentNodeTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/AbstractHierarchicalContentNodeTest.java
@@ -42,6 +42,7 @@ public class AbstractHierarchicalContentNodeTest extends AssertJUnit
 
         // check only that no exception is thrown
         fileNode.getFileLength();
+        fileNode.getChecksumCRC32();
         fileNode.getFileContent();
         fileNode.getInputStream();
     }
@@ -81,6 +82,13 @@ public class AbstractHierarchicalContentNodeTest extends AssertJUnit
                     dirNode.getFileLength();
                 }
             });
+        assertUnsupportedFileOperationOnAction(new IDelegatedAction()
+            {
+                public void execute()
+                {
+                    dirNode.getChecksumCRC32();
+                }
+            });
         assertUnsupportedFileOperationOnAction(new IDelegatedAction()
             {
                 public void execute()
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/DefaultFileBasedHierarchicalContentTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/DefaultFileBasedHierarchicalContentTest.java
index bf4f46190e74c6632b484640de6e7515e0ff81e4..c9b11ba1c35af6ab87e26f3883e7bd7f7d03ce7a 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/DefaultFileBasedHierarchicalContentTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/DefaultFileBasedHierarchicalContentTest.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.common.io.hierarchical_content;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
@@ -37,6 +38,7 @@ import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.hdf5.HDF5Container;
 import ch.systemsx.cisd.common.hdf5.HierarchicalStructureDuplicatorFileToHDF5;
 import ch.systemsx.cisd.common.hdf5.HierarchicalStructureDuplicatorFileToHDF5.DuplicatorWriterClient;
+import ch.systemsx.cisd.common.io.IOUtilities;
 import ch.systemsx.cisd.common.io.hierarchical_content.api.IHierarchicalContentNode;
 import ch.systemsx.cisd.common.utilities.HierarchicalContentUtils;
 import ch.systemsx.cisd.common.utilities.IDelegatedAction;
@@ -544,6 +546,8 @@ public class DefaultFileBasedHierarchicalContentTest extends AbstractFileSystemT
         // file info access
         assertEquals("File: " + expectedFile, expectedFile.getName(), fileNode.getName());
         assertEquals("File: " + expectedFile, expectedFile.length(), fileNode.getFileLength());
+        long expectedChecksum = IOUtilities.getChecksumCRC32(new FileInputStream(expectedFile));
+        assertEquals("File: " + expectedFile, expectedChecksum, fileNode.getChecksumCRC32());
         assertTrue("File: " + expectedFile,
                 fileNode.getLastModified() >= expectedFile.lastModified());
         assertTrue("File: " + expectedFile,
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNodeTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNodeTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..5f0dbbf77a5bcf83363d14748a6b6a29d570aa31
--- /dev/null
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/io/hierarchical_content/HDF5ContainerBasedHierarchicalContentNodeTest.java
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.common.io.hierarchical_content;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.testng.AssertJUnit;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.common.io.hierarchical_content.api.IHierarchicalContent;
+import ch.systemsx.cisd.common.io.hierarchical_content.api.IHierarchicalContentNode;
+
+/**
+ * @author Franz-Josef Elmer
+ */
+public class HDF5ContainerBasedHierarchicalContentNodeTest extends AssertJUnit
+{
+    private static final File TEST_DATA_FOLDER = new File(
+            "resource/test-data/HDF5ContainerBasedHierarchicalContentNodeTest");
+
+    @Test
+    public void testH5File()
+    {
+        IHierarchicalContent content =
+                new DefaultFileBasedHierarchicalContentFactory().asHierarchicalContent(
+                        TEST_DATA_FOLDER, null);
+        IHierarchicalContentNode node = content.getNode("thumbnails.h5");
+        List<IHierarchicalContentNode> nodes = getSortedChildren(node);
+        
+        assertEquals("3361fd20 24242 PLATE1_A01_01_Cy3.png\n" + 
+        		"609f3183 29353 PLATE1_A01_01_DAPI.png\n" + 
+        		"b68f97cf 27211 PLATE1_A01_01_GFP.png\n" + 
+        		"b312b087 31570 PLATE1_A01_02_Cy3.png\n" + 
+        		"e7082b23 28267 PLATE1_A01_02_DAPI.png\n" + 
+        		"fb7f320e 26972 PLATE1_A01_02_GFP.png\n" + 
+        		"a97cff4e 28916 PLATE1_A01_03_Cy3.png\n" + 
+        		"6f0abf6f 30079 PLATE1_A01_03_DAPI.png\n" + 
+        		"5ba6ae39 28072 PLATE1_A01_03_GFP.png\n" + 
+        		"e2c7c34f 28279 PLATE1_A01_04_Cy3.png\n" + 
+        		"1bf73b61 22246 PLATE1_A01_04_DAPI.png\n" + 
+        		"58e14da9 22227 PLATE1_A01_04_GFP.png\n" + 
+        		"d367dd9d 34420 PLATE1_A01_05_Cy3.png\n" + 
+        		"15e1f3b0 28070 PLATE1_A01_05_DAPI.png\n" + 
+        		"34bcde32 27185 PLATE1_A01_05_GFP.png\n" + 
+        		"f8d4cfc7 26367 PLATE1_A01_06_Cy3.png\n" + 
+        		"aeb12b1a 25086 PLATE1_A01_06_DAPI.png\n" + 
+        		"ced4332a 22199 PLATE1_A01_06_GFP.png", getNamesChecksumsAndSizes(nodes));
+    }
+    
+    @Test
+    public void testH5arFile()
+    {
+        IHierarchicalContent content =
+                new DefaultFileBasedHierarchicalContentFactory().asHierarchicalContent(
+                        TEST_DATA_FOLDER, null);
+        IHierarchicalContentNode node = content.getNode("thumbnails.h5ar");
+        List<IHierarchicalContentNode> nodes = getSortedChildren(node);
+        
+        assertEquals("3361fd20 24242 wA1_d1-1_cCy3.png\n" + 
+        		"609f3183 29353 wA1_d1-1_cDAPI.png\n" + 
+        		"b68f97cf 27211 wA1_d1-1_cGFP.png\n" + 
+        		"e2c7c34f 28279 wA1_d1-2_cCy3.png\n" + 
+        		"1bf73b61 22246 wA1_d1-2_cDAPI.png\n" + 
+        		"58e14da9 22227 wA1_d1-2_cGFP.png\n" + 
+        		"b312b087 31570 wA1_d2-1_cCy3.png\n" + 
+        		"e7082b23 28267 wA1_d2-1_cDAPI.png\n" + 
+        		"fb7f320e 26972 wA1_d2-1_cGFP.png\n" + 
+        		"d367dd9d 34420 wA1_d2-2_cCy3.png\n" + 
+        		"15e1f3b0 28070 wA1_d2-2_cDAPI.png\n" + 
+        		"34bcde32 27185 wA1_d2-2_cGFP.png\n" + 
+        		"a97cff4e 28916 wA1_d3-1_cCy3.png\n" + 
+        		"6f0abf6f 30079 wA1_d3-1_cDAPI.png\n" + 
+        		"5ba6ae39 28072 wA1_d3-1_cGFP.png\n" + 
+        		"f8d4cfc7 26367 wA1_d3-2_cCy3.png\n" + 
+        		"aeb12b1a 25086 wA1_d3-2_cDAPI.png\n" + 
+        		"ced4332a 22199 wA1_d3-2_cGFP.png", getNamesChecksumsAndSizes(nodes));
+    }
+    
+    private String getNamesChecksumsAndSizes(List<IHierarchicalContentNode> nodes)
+    {
+        StringBuilder builder = new StringBuilder();
+        for (IHierarchicalContentNode node : nodes)
+        {
+            if (builder.length() > 0)
+            {
+                builder.append("\n");
+            }
+            builder.append(Long.toHexString(node.getChecksumCRC32()));
+            builder.append(" ").append(node.getFileLength());
+            builder.append(" ").append(node.getName());
+        }
+        return builder.toString();
+    }
+
+    private List<IHierarchicalContentNode> getSortedChildren(IHierarchicalContentNode node)
+    {
+        List<IHierarchicalContentNode> nodes = node.getChildNodes();
+        Collections.sort(nodes, new Comparator<IHierarchicalContentNode>()
+            {
+                public int compare(IHierarchicalContentNode n1, IHierarchicalContentNode n2)
+                {
+                    return n1.getName().compareTo(n2.getName());
+                }
+            });
+        return nodes;
+    }
+
+}