diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DatasetModificationReportingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DatasetModificationReportingPlugin.java
index 475d943cfef5aa50e88941c2d47cc79c137f465f..58511569cefad800287c9f8a2371bcb8cf5aa6b4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DatasetModificationReportingPlugin.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DatasetModificationReportingPlugin.java
@@ -25,6 +25,8 @@ import java.util.Properties;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel.TableModelColumnType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
@@ -54,7 +56,9 @@ public class DatasetModificationReportingPlugin extends AbstractDatastorePlugin
         {
             File file = getDataSubDir(dataset);
             String datasetCode = dataset.getDatasetCode();
-            List<String> row = Arrays.asList(datasetCode, new Date(file.lastModified()).toString());
+            List<ISerializableComparable> row =
+                    Arrays.<ISerializableComparable> asList(new StringTableCell(datasetCode),
+                            new StringTableCell(new Date(file.lastModified()).toString()));
             builder.addRow(row);
         }
         return builder.getTableModel();
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DemoReportingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DemoReportingPlugin.java
index 8410784a21b95eaa16a8d8839f8c5effdec302bd..b9d3575fc590971188bec46ddf933ca3db437477 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DemoReportingPlugin.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/demo/DemoReportingPlugin.java
@@ -27,6 +27,10 @@ import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.standard.AbstractDatastorePlugin;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder;
+import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtil;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ImageTableCell;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel.TableModelColumnType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
@@ -48,7 +52,8 @@ public class DemoReportingPlugin extends AbstractDatastorePlugin implements IRep
     public TableModel createReport(List<DatasetDescription> datasets)
     {
         SimpleTableModelBuilder builder = new SimpleTableModelBuilder();
-        builder.addHeader("Dataset code", TableModelColumnType.TEXT);
+        builder.addHeader("Dataset Code", TableModelColumnType.TEXT);
+        builder.addHeader("Thumbnail", TableModelColumnType.THUMBNAIL);
         builder.addHeader("Name", TableModelColumnType.TEXT);
         builder.addHeader("Size", TableModelColumnType.INTEGER);
         for (DatasetDescription dataset : datasets)
@@ -83,15 +88,33 @@ public class DemoReportingPlugin extends AbstractDatastorePlugin implements IRep
     private void describeUnknown(SimpleTableModelBuilder builder, DatasetDescription dataset, File file)
     {
         String datasetCode = dataset.getDatasetCode();
-        List<String> row = Arrays.asList(datasetCode, file.getName(), "[does not exist]");
+        ISerializableComparable image = createImageCell(dataset, file);
+        List<ISerializableComparable> row =
+                Arrays.<ISerializableComparable> asList(new StringTableCell(datasetCode), image,
+                        new StringTableCell(file.getName()),
+                        new StringTableCell("[does not exist]"));
         builder.addRow(row);
     }
 
+    private static ISerializableComparable createImageCell(DatasetDescription dataset, File file)
+    {
+        if (ImageUtil.isImageFile(file))
+        {
+            String code = dataset.getDatasetCode();
+            String location = dataset.getDataSetLocation();
+            return new ImageTableCell(code, location, file.getPath(), 100, 60);
+        }
+        return new StringTableCell(file.getName());
+    }
+
     private static void describeFile(SimpleTableModelBuilder builder, DatasetDescription dataset,
             File file)
     {
-        List<String> row =
-                Arrays.asList(dataset.getDatasetCode(), file.getName(), "" + getSize(file));
+        ISerializableComparable image = createImageCell(dataset, file);
+        List<ISerializableComparable> row =
+                Arrays.<ISerializableComparable> asList(new StringTableCell(dataset
+                        .getDatasetCode()), image, new StringTableCell(file.getName()),
+                        new StringTableCell("" + getSize(file)));
         builder.addRow(row);
     }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractDataMergingReportingPlugin.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractDataMergingReportingPlugin.java
index 5df498fa179fcc1b0b1046570bb1ee2c53cab55c..55592249391cc8cfcae5a3f176564b36ab344ead 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractDataMergingReportingPlugin.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/AbstractDataMergingReportingPlugin.java
@@ -21,7 +21,6 @@ import java.io.FileReader;
 import java.io.IOException;
 import java.io.Reader;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 import java.util.Properties;
 
@@ -35,6 +34,8 @@ import ch.systemsx.cisd.common.parser.ParsingException;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.DatasetFileLines;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IReportingPluginTask;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.SimpleTableModelBuilder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
 /**
@@ -90,9 +91,12 @@ public abstract class AbstractDataMergingReportingPlugin extends AbstractDatasto
     protected static void addDataRow(SimpleTableModelBuilder builder, String datasetCode,
             String[] dataTokens)
     {
-        List<String> row = new ArrayList<String>();
-        row.add(datasetCode);
-        row.addAll(Arrays.asList(dataTokens));
+        List<ISerializableComparable> row = new ArrayList<ISerializableComparable>();
+        row.add(new StringTableCell(datasetCode));
+        for (String token : dataTokens)
+        {
+            row.add(new StringTableCell(token));
+        }
         builder.addRow(row);
     }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IterativeTableModelBuilder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IterativeTableModelBuilder.java
index 5a51ecfef44e1d0592556b82cf2517030509d909..c0b61b3396f707723d87daeefa98d62ee5f098cd 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IterativeTableModelBuilder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IterativeTableModelBuilder.java
@@ -30,6 +30,8 @@ import org.apache.log4j.Logger;
 
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel.TableModelColumnHeader;
@@ -180,11 +182,11 @@ public class IterativeTableModelBuilder
         }
         for (String rowId : rowIdentifiers)
         {
-            final List<String> rowValues = new ArrayList<String>(headers.size());
+            final List<ISerializableComparable> rowValues = new ArrayList<ISerializableComparable>(headers.size());
             for (TableModelColumnHeader header : headers)
             {
                 final String valueOrNull = columnMap.get(header.getTitle()).get(rowId);
-                rowValues.add((valueOrNull == null) ? "" : valueOrNull);
+                rowValues.add(new StringTableCell((valueOrNull == null) ? "" : valueOrNull));
             }
             rows.add(new TableModelRow(rowValues));
         }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java
index 31b6cd462c008e410a523e6012fe1cfb04d73ee3..5b18725bb4a05ad3fb0a67186a17f30f4d351bea 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/SimpleTableModelBuilder.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks;
 import java.util.ArrayList;
 import java.util.List;
 
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel.TableModelColumnHeader;
@@ -46,7 +47,7 @@ public class SimpleTableModelBuilder
         header.add(new TableModelColumnHeader(title, type, header.size()));
     }
 
-    public void addRow(List<String> values)
+    public void addRow(List<ISerializableComparable> values)
     {
         assert values.size() == header.size() : "header has different number of columns than a row";
         rows.add(new TableModelRow(values));
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ImageUtil.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ImageUtil.java
index 4fa7efc77d2ececaf3ce24d14e9d6b5a69a3f784..e0f1fcd38857ed94bd0539a6917ef4f9e8bd331e 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ImageUtil.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ImageUtil.java
@@ -20,6 +20,10 @@ import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
 
 import javax.media.jai.JAI;
 import javax.media.jai.PlanarImage;
@@ -31,6 +35,28 @@ import javax.media.jai.PlanarImage;
  */
 public class ImageUtil
 {
+    private static final Set<String> FILE_TYPES =
+            Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("gif", "jpg", "jpeg",
+                    "tif", "tiff")));
+
+    /**
+     * Returns <code>true</code> if the specified file is a supported image file. Supported formats
+     * are GIF, JPG, PNG, TIFF. Only file type is taken into account for figuring out the image
+     * format. Following file types are recognized:
+     * <code>.gif, .jpg, .jpeg, .png, .tif, .tiff</code>
+     */
+    public static boolean isImageFile(File file)
+    {
+        String name = file.getName();
+        int lastIndexOfDot = name.lastIndexOf('.');
+        if (lastIndexOfDot < 0)
+        {
+            return false;
+        }
+        String fileType = name.substring(lastIndexOfDot + 1).toLowerCase();
+        return FILE_TYPES.contains(fileType);
+    }
+    
     /**
      * Loads an image from specified file. Supported file formats are GIF, JPG, PNG, and TIFF.
      * 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IterativeTableModelBuilderTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IterativeTableModelBuilderTest.java
index f3a5d2fff299ca2a14c2a8dc246b56b25839178d..5100c4ff9a06935d469f4575fea3afac93ec3a80 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IterativeTableModelBuilderTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/IterativeTableModelBuilderTest.java
@@ -26,6 +26,7 @@ import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.logging.LogInitializer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRow;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel.TableModelColumnHeader;
@@ -62,18 +63,18 @@ public class IterativeTableModelBuilderTest
         assertEquals(1, headers.get(1).getIndex());
         final List<TableModelRow> rows = model.getRows();
         assertEquals(3, rows.size());
-        final List<String> row0 = rows.get(0).getValues();
+        final List<ISerializableComparable> row0 = rows.get(0).getValues();
         assertEquals(2, row0.size());
-        assertEquals("a", row0.get(0));
-        assertEquals("A", row0.get(1));
-        final List<String> row1 = rows.get(1).getValues();
+        assertEquals("a", row0.get(0).toString());
+        assertEquals("A", row0.get(1).toString());
+        final List<ISerializableComparable> row1 = rows.get(1).getValues();
         assertEquals(2, row1.size());
-        assertEquals("b", row1.get(0));
-        assertEquals("B", row1.get(1));
-        final List<String> row2 = rows.get(2).getValues();
+        assertEquals("b", row1.get(0).toString());
+        assertEquals("B", row1.get(1).toString());
+        final List<ISerializableComparable> row2 = rows.get(2).getValues();
         assertEquals(2, row2.size());
-        assertEquals("c", row2.get(0));
-        assertEquals("C", row2.get(1));
+        assertEquals("c", row2.get(0).toString());
+        assertEquals("C", row2.get(1).toString());
     }
 
     private DatasetDescription createDatasetDescription()
@@ -107,21 +108,21 @@ public class IterativeTableModelBuilderTest
         assertEquals(2, headers.get(2).getIndex());
         final List<TableModelRow> rows = model.getRows();
         assertEquals(3, rows.size());
-        final List<String> row0 = rows.get(0).getValues();
+        final List<ISerializableComparable> row0 = rows.get(0).getValues();
         assertEquals(3, row0.size());
-        assertEquals("a", row0.get(0));
-        assertEquals("A", row0.get(1));
-        assertEquals("D", row0.get(2));
-        final List<String> row1 = rows.get(1).getValues();
+        assertEquals("a", row0.get(0).toString());
+        assertEquals("A", row0.get(1).toString());
+        assertEquals("D", row0.get(2).toString());
+        final List<ISerializableComparable> row1 = rows.get(1).getValues();
         assertEquals(3, row1.size());
-        assertEquals("b", row1.get(0));
-        assertEquals("B", row1.get(1));
-        assertEquals("E", row1.get(2));
-        final List<String> row2 = rows.get(2).getValues();
+        assertEquals("b", row1.get(0).toString());
+        assertEquals("B", row1.get(1).toString());
+        assertEquals("E", row1.get(2).toString());
+        final List<ISerializableComparable> row2 = rows.get(2).getValues();
         assertEquals(3, row2.size());
-        assertEquals("c", row2.get(0));
-        assertEquals("C", row2.get(1));
-        assertEquals("F", row2.get(2));
+        assertEquals("c", row2.get(0).toString());
+        assertEquals("C", row2.get(1).toString());
+        assertEquals("F", row2.get(2).toString());
     }
 
     @Test
@@ -149,31 +150,31 @@ public class IterativeTableModelBuilderTest
         assertEquals(2, headers.get(2).getIndex());
         final List<TableModelRow> rows = model.getRows();
         assertEquals(5, rows.size());
-        final List<String> row0 = rows.get(0).getValues();
+        final List<ISerializableComparable> row0 = rows.get(0).getValues();
         assertEquals(3, row0.size());
-        assertEquals("a", row0.get(0));
-        assertEquals("A", row0.get(1));
-        assertEquals("", row0.get(2));
-        final List<String> row1 = rows.get(1).getValues();
+        assertEquals("a", row0.get(0).toString());
+        assertEquals("A", row0.get(1).toString());
+        assertEquals("", row0.get(2).toString());
+        final List<ISerializableComparable> row1 = rows.get(1).getValues();
         assertEquals(3, row1.size());
-        assertEquals("b", row1.get(0));
-        assertEquals("B", row1.get(1));
-        assertEquals("E", row1.get(2));
-        final List<String> row2 = rows.get(2).getValues();
+        assertEquals("b", row1.get(0).toString());
+        assertEquals("B", row1.get(1).toString());
+        assertEquals("E", row1.get(2).toString());
+        final List<ISerializableComparable> row2 = rows.get(2).getValues();
         assertEquals(3, row2.size());
-        assertEquals("c", row2.get(0));
-        assertEquals("C", row2.get(1));
-        assertEquals("", row2.get(2));
-        final List<String> row3 = rows.get(3).getValues();
+        assertEquals("c", row2.get(0).toString());
+        assertEquals("C", row2.get(1).toString());
+        assertEquals("", row2.get(2).toString());
+        final List<ISerializableComparable> row3 = rows.get(3).getValues();
         assertEquals(3, row3.size());
-        assertEquals("d", row3.get(0));
-        assertEquals("", row3.get(1));
-        assertEquals("D", row3.get(2));
-        final List<String> row4 = rows.get(4).getValues();
+        assertEquals("d", row3.get(0).toString());
+        assertEquals("", row3.get(1).toString());
+        assertEquals("D", row3.get(2).toString());
+        final List<ISerializableComparable> row4 = rows.get(4).getValues();
         assertEquals(3, row4.size());
-        assertEquals("f", row4.get(0));
-        assertEquals("", row4.get(1));
-        assertEquals("F", row4.get(2));
+        assertEquals("f", row4.get(0).toString());
+        assertEquals("", row4.get(1).toString());
+        assertEquals("F", row4.get(2).toString());
     }
 
     @Test
@@ -198,21 +199,21 @@ public class IterativeTableModelBuilderTest
         assertEquals(2, headers.get(2).getIndex());
         final List<TableModelRow> rows = model.getRows();
         assertEquals(3, rows.size());
-        final List<String> row0 = rows.get(0).getValues();
+        final List<ISerializableComparable> row0 = rows.get(0).getValues();
         assertEquals(3, row0.size());
-        assertEquals("a", row0.get(0));
-        assertEquals("A", row0.get(1));
-        assertEquals("A", row0.get(2));
-        final List<String> row1 = rows.get(1).getValues();
+        assertEquals("a", row0.get(0).toString());
+        assertEquals("A", row0.get(1).toString());
+        assertEquals("A", row0.get(2).toString());
+        final List<ISerializableComparable> row1 = rows.get(1).getValues();
         assertEquals(3, row1.size());
-        assertEquals("b", row1.get(0));
-        assertEquals("B", row1.get(1));
-        assertEquals("B", row1.get(2));
-        final List<String> row2 = rows.get(2).getValues();
+        assertEquals("b", row1.get(0).toString());
+        assertEquals("B", row1.get(1).toString());
+        assertEquals("B", row1.get(2).toString());
+        final List<ISerializableComparable> row2 = rows.get(2).getValues();
         assertEquals(3, row2.size());
-        assertEquals("c", row2.get(0));
-        assertEquals("C", row2.get(1));
-        assertEquals("C", row2.get(2));
+        assertEquals("c", row2.get(0).toString());
+        assertEquals("C", row2.get(1).toString());
+        assertEquals("C", row2.get(2).toString());
     }
 
     @Test
@@ -253,17 +254,17 @@ public class IterativeTableModelBuilderTest
         assertEquals(1, headers.get(1).getIndex());
         final List<TableModelRow> rows = model.getRows();
         assertEquals(3, rows.size());
-        final List<String> row0 = rows.get(0).getValues();
+        final List<ISerializableComparable> row0 = rows.get(0).getValues();
         assertEquals(2, row0.size());
-        assertEquals("a", row0.get(0));
-        assertEquals("A", row0.get(1));
-        final List<String> row1 = rows.get(1).getValues();
+        assertEquals("a", row0.get(0).toString());
+        assertEquals("A", row0.get(1).toString());
+        final List<ISerializableComparable> row1 = rows.get(1).getValues();
         assertEquals(2, row1.size());
-        assertEquals("b", row1.get(0));
-        assertEquals("B", row1.get(1));
-        final List<String> row2 = rows.get(2).getValues();
+        assertEquals("b", row1.get(0).toString());
+        assertEquals("B", row1.get(1).toString());
+        final List<ISerializableComparable> row2 = rows.get(2).getValues();
         assertEquals(2, row2.size());
-        assertEquals("c", row2.get(0));
-        assertEquals("C", row2.get(1));
+        assertEquals("c", row2.get(0).toString());
+        assertEquals("C", row2.get(1).toString());
     }
 }