diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/FieldComparator.java b/common/source/java/ch/systemsx/cisd/common/utilities/FieldComparator.java
index 1288ed4cc7189ef2dbdc73a891d5f3a720ad2a05..e6a0a4eade479e75892d98236953160be59d911d 100644
--- a/common/source/java/ch/systemsx/cisd/common/utilities/FieldComparator.java
+++ b/common/source/java/ch/systemsx/cisd/common/utilities/FieldComparator.java
@@ -16,27 +16,96 @@
 
 package ch.systemsx.cisd.common.utilities;
 
+import java.lang.reflect.Field;
 import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+
+import ch.systemsx.cisd.common.exceptions.CheckedExceptionTunnel;
 
 /**
+ * A {@link Comparator} implementation based on an internal field specified in the constructor.
+ * <p>
+ * No that this field MUST implement the {@link Comparable} interface.
+ * </p>
+ * 
  * @author Christian Ribeaud
  */
-public class FieldComparator implements Comparator<Object>
+// TODO: With fieldName.fieldName
+public final class FieldComparator<T> implements Comparator<T>
 {
     private final String fieldName;
 
+    private final Map<MapEntry, Field> cache = new HashMap<MapEntry, Field>();
+
     public FieldComparator(final String fieldName)
     {
+        assert fieldName != null : "Unspecified field name.";
         this.fieldName = fieldName;
     }
 
+    private final Comparable<Object> getComparable(final T t)
+    {
+        final Class<?> clazz = t.getClass();
+        final MapEntry mapEntry = new MapEntry(clazz, fieldName);
+        Field field = cache.get(mapEntry);
+        if (field == null)
+        {
+            field = ClassUtils.tryGetDeclaredField(clazz, fieldName);
+            if (field == null)
+            {
+                throw new IllegalArgumentException(String.format(
+                        "Field name '%s' could not be found in class '%s'.", fieldName, clazz
+                                .getName()));
+            }
+            cache.put(mapEntry, field);
+        }
+        try
+        {
+            final Object object = field.get(t);
+            if (object instanceof Comparable == false)
+            {
+                throw new IllegalArgumentException(String.format(
+                        "Object '%s' does not implement the Comparable interface.", object));
+            }
+            return cast(object);
+        } catch (final Exception ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private final static Comparable<Object> cast(final Object object)
+    {
+        return (Comparable<Object>) object;
+    }
+
     //
     // Comparator
     //
 
-    public final int compare(final Object o1, final Object o2)
+    public final int compare(final T o1, final T o2)
     {
-        // TODO Auto-generated method stub
-        return 0;
+        final Comparable<Object> comparable1 = getComparable(o1);
+        final Comparable<Object> comparable2 = getComparable(o2);
+        return comparable1.compareTo(comparable2);
+    }
+
+    //
+    // Helper classes
+    //
+
+    private final static class MapEntry extends AbstractHashable
+    {
+        final Class<?> clazz;
+
+        final String fieldName;
+
+        MapEntry(final Class<?> clazz, final String fieldName)
+        {
+            this.clazz = clazz;
+            this.fieldName = fieldName;
+        }
     }
 }
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FieldComparatorTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FieldComparatorTest.java
index 8c15ad3bb3c1a300d7b348351c8b7b296358ba5f..f1e0e3f09b0a16a176a46e1ae8c34a7b91da02cd 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FieldComparatorTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/utilities/FieldComparatorTest.java
@@ -16,6 +16,14 @@
 
 package ch.systemsx.cisd.common.utilities;
 
+import static org.testng.AssertJUnit.assertEquals;
+import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.fail;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
 import org.testng.annotations.Test;
 
 /**
@@ -26,8 +34,78 @@ import org.testng.annotations.Test;
 public final class FieldComparatorTest
 {
 
+    private final List<Bean> createBeanList()
+    {
+        final List<Bean> list = new ArrayList<Bean>();
+        list.add(new Bean(new Object(), "c"));
+        list.add(new Bean(new Object(), "b"));
+        list.add(new Bean(new Object(), "a"));
+        return list;
+    }
+
     @Test
     public final void testConstructor()
     {
+        boolean fail = true;
+        try
+        {
+            new FieldComparator<Bean>(null);
+        } catch (final AssertionError error)
+        {
+            fail = false;
+        }
+        assertFalse(fail);
+    }
+
+    @Test
+    public final void testCompare()
+    {
+        final FieldComparator<Bean> fieldComparator = new FieldComparator<Bean>("value");
+        final List<Bean> beans = createBeanList();
+        assertEquals("c", beans.get(0).value);
+        Collections.sort(beans, fieldComparator);
+        assertEquals("a", beans.get(0).value);
+    }
+
+    @Test
+    public final void testCompareFailed()
+    {
+        FieldComparator<Bean> fieldComparator = new FieldComparator<Bean>("doesNotExist");
+        final List<Bean> beans = createBeanList();
+        try
+        {
+            Collections.sort(beans, fieldComparator);
+            fail("'" + IllegalArgumentException.class + "' expected.");
+        } catch (final IllegalArgumentException ex)
+        {
+            // Nothing to do here.
+        }
+        fieldComparator = new FieldComparator<Bean>("object");
+        try
+        {
+            Collections.sort(beans, fieldComparator);
+            fail("'" + IllegalArgumentException.class + "' expected.");
+        } catch (final IllegalArgumentException ex)
+        {
+            // Nothing to do here.
+        }
+    }
+
+    //
+    // Helper classes
+    //
+
+    private static final class Bean
+    {
+        private final String value;
+
+        @SuppressWarnings("unused")
+        private final Object object;
+
+        Bean(final Object object, final String value)
+        {
+            this.object = object;
+            this.value = value;
+        }
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/AbstractResultSetConfig.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/AbstractResultSetConfig.java
index 31f97e7d6bfbf48c95180ce6a17bc4494268534e..d04857ccbe50f80d7f432d455a5ba52ee3bfa070 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/AbstractResultSetConfig.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/AbstractResultSetConfig.java
@@ -25,10 +25,16 @@ public abstract class AbstractResultSetConfig<K> implements IResultSetConfig<K>
 {
     private int limit = -1;
 
-    private int offset;
+    private int offset = 0;
 
-    private SortInfo sortInfo;
+    private SortInfo sortInfo = new SortInfo();
 
+    /**
+     * The result set key.
+     * <p>
+     * Could be <code>null</code> if unknown.
+     * </p>
+     */
     private K resultSetKey;
 
     public final void setLimit(final int limit)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ResultSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ResultSet.java
index 76d9b975bc4d93a9e1a4a88666f712143f715e6d..dee8064332432c62557e73facd264e8b3cc05dbc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ResultSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ResultSet.java
@@ -32,15 +32,15 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSet;
  */
 public final class ResultSet<T> implements IsSerializable
 {
-    private List<T> result;
+    private List<T> list;
 
     private int totalLength;
 
     private String resultSetKey;
 
-    public final void setResult(final List<T> result)
+    public final void setList(final List<T> result)
     {
-        this.result = result;
+        this.list = result;
     }
 
     public final void setTotalLength(final int totalLength)
@@ -66,7 +66,7 @@ public final class ResultSet<T> implements IsSerializable
      */
     public List<T> getList()
     {
-        return result;
+        return list;
     }
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java
index 406b4db04c3175e2482172671c7c24722c3fc549..0bfe7662bd7ba1e2e1afed96e050db54b0a6b8a7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/CachedResultSetManager.java
@@ -62,11 +62,8 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
     @SuppressWarnings("unchecked")
     private final <T> void sortData(final List<T> data, final SortInfo sortInfo)
     {
-        // TODO: Remove null check.
-        if (sortInfo == null)
-        {
-            return;
-        }
+        assert data != null : "Unspecified data.";
+        assert sortInfo != null : "Unspecified sort information.";
         final SortDir sortDir = sortInfo.getSortDir();
         if (sortDir == SortDir.NONE)
         {
@@ -99,6 +96,16 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         return Math.min(size - 1, Math.max(offset, 0));
     }
 
+    /**
+     * Encapsulates list returned by {@link List#subList(int, int)} in a new <code>List</code> as
+     * <i>GWT</i> complains because of a serialization concern.
+     */
+    private final static <T> List<T> subList(final List<T> data, final int offset, final int limit)
+    {
+        final int toIndex = offset + limit;
+        return new ArrayList<T>(data.subList(offset, toIndex));
+    }
+
     //
     // IDataManager
     //
@@ -129,17 +136,6 @@ public final class CachedResultSetManager<K> implements IResultSetManager<K>, Se
         return new DefaultResultSet<K, T>(dataKey, list, size);
     }
 
-    // TODO: Put doc here.
-    private final static <T> List<T> subList(final List<T> data, final int offset, final int limit)
-    {
-        final List<T> list = new ArrayList<T>();
-        for (int i = offset; i < offset + limit; i++)
-        {
-            list.add(data.get(i));
-        }
-        return list;
-    }
-
     public final synchronized void removeData(final IResultSetKeyHolder<K> dataKeyHolder)
     {
         assert dataKeyHolder != null : "Unspecified data key holder.";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java
index 007de2287b070309a7e2006e4def043ddf6a4268..befeb9d113a5e258c6a2d135efd27dada61b77b1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/DefaultResultSet.java
@@ -33,6 +33,9 @@ final class DefaultResultSet<K, T> implements IResultSet<K, T>
 
     DefaultResultSet(final K resultSetKey, final List<T> list, final int totalLength)
     {
+        assert resultSetKey != null : "Unspecified result set key";
+        assert list != null : "Unspecified list.";
+        assert totalLength > -1 : "Total length must be >= 0.";
         this.resultSetKey = resultSetKey;
         this.list = list;
         this.totalLength = totalLength;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/DatabaseInstanceTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/DatabaseInstanceTranslator.java
index b3fbfe30529e22fa16daa2ccea3c594e66d730a7..8ae8661b7ef760bb5a4e5747dd166f087367c16a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/DatabaseInstanceTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/DatabaseInstanceTranslator.java
@@ -21,31 +21,38 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
 
 /**
+ * A {@link DatabaseInstance} &lt;---&gt; {@link DatabaseInstancePE} translator.
+ * 
  * @author Izabela Adamczyk
  */
-public class DatabaseInstanceTranslator
+public final class DatabaseInstanceTranslator
 {
 
-    public static DatabaseInstance translate(DatabaseInstancePE databaseInstance)
+    private DatabaseInstanceTranslator()
+    {
+        // Can not be instantiated.
+    }
+
+    public final static DatabaseInstance translate(final DatabaseInstancePE databaseInstance)
     {
         if (databaseInstance == null)
         {
             return null;
         }
-        DatabaseInstance result = new DatabaseInstance();
+        final DatabaseInstance result = new DatabaseInstance();
         result.setCode(databaseInstance.getCode());
         result.setUuid(databaseInstance.getUuid());
         result.setIdentifier(IdentifierHelper.createIdentifier(databaseInstance).toString());
         return result;
     }
 
-    public static DatabaseInstancePE translate(DatabaseInstance databaseInstance)
+    public final static DatabaseInstancePE translate(final DatabaseInstance databaseInstance)
     {
         if (databaseInstance == null)
         {
             return null;
         }
-        DatabaseInstancePE result = new DatabaseInstancePE();
+        final DatabaseInstancePE result = new DatabaseInstancePE();
         result.setCode(databaseInstance.getCode());
         result.setUuid(databaseInstance.getUuid());
         return result;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ExperimentTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ExperimentTranslator.java
index 37d0a74e6c88c3f3440c148f814ab736fe18e154..7d4d91c79acc6f81920efbdc0656bac004fa3d35 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ExperimentTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ExperimentTranslator.java
@@ -22,27 +22,34 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentTypePE;
 
 /**
+ * A {@link Experiment} &lt;---&gt; {@link ExperimentPE} translator.
+ * 
  * @author Tomasz Pylak
  */
-public class ExperimentTranslator
+public final class ExperimentTranslator
 {
 
-    public static Experiment translate(ExperimentPE experiment)
+    private ExperimentTranslator()
+    {
+        // Can not be instantiated.
+    }
+
+    public final static Experiment translate(final ExperimentPE experiment)
     {
         if (experiment == null)
         {
             return null;
         }
-        Experiment result = new Experiment();
+        final Experiment result = new Experiment();
         result.setCode(experiment.getCode());
         result.setExperimentType(translate(experiment.getExperimentType()));
         result.setProject(ProjectTranslator.translate(experiment.getProject()));
         return result;
     }
 
-    private static ExperimentType translate(ExperimentTypePE experimentType)
+    private final static ExperimentType translate(final ExperimentTypePE experimentType)
     {
-        ExperimentType result = new ExperimentType();
+        final ExperimentType result = new ExperimentType();
         result.setCode(experimentType.getCode());
         result.setDescription(experimentType.getDescription());
         result.setDatabaseInstance(DatabaseInstanceTranslator.translate(experimentType
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/GroupTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/GroupTranslator.java
index d6a7687e5a2b64a1e439d2e54aff73074d95606c..539846eebe3cb1849a108623712dbd510620bdf0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/GroupTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/GroupTranslator.java
@@ -21,21 +21,24 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.GroupPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
 
 /**
+ * A {@link Group} &lt;---&gt; {@link GroupPE} translator.
+ * 
  * @author Franz-Josef Elmer
  */
-public class GroupTranslator
+public final class GroupTranslator
 {
     private GroupTranslator()
     {
+        // Can not be instantiated.
     }
 
-    public static Group translate(GroupPE group)
+    public static Group translate(final GroupPE group)
     {
         if (group == null)
         {
             return null;
         }
-        Group result = new Group();
+        final Group result = new Group();
         result.setCode(group.getCode());
         result.setDescription(group.getDescription());
         result.setInstance(DatabaseInstanceTranslator.translate(group.getDatabaseInstance()));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ListSampleCriteriaTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ListSampleCriteriaTranslator.java
index 9918ec59f610733ebcc004e6b8f15874a4f018f7..1dccd5bcf1af46ca68d7f61af9982ca33abc2a3d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ListSampleCriteriaTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ListSampleCriteriaTranslator.java
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFa
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleOwnerIdentifier;
 
 /**
- * A {@link ListSampleCriteria} &lt;--&gt; {@link ListSampleCriteriaDTO} translator.
+ * A {@link ListSampleCriteria} &lt;---&gt; {@link ListSampleCriteriaDTO} translator.
  * 
  * @author Christian Ribeaud
  */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/PersonTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/PersonTranslator.java
index c1dd009ab6687980ea352a154e96d8cb5a0d7cd1..f495a1b48f81af55fc0bb72eac67c5ac30d4aaa2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/PersonTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/PersonTranslator.java
@@ -20,26 +20,29 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 
 /**
+ * A {@link Person} &lt;---&gt; {@link PersonPE} translator.
+ * 
  * @author Franz-Josef Elmer
  */
 public class PersonTranslator
 {
     private PersonTranslator()
     {
+        // Can not be instantiated.
     }
 
-    public static Person translate(PersonPE person)
+    public final static Person translate(final PersonPE person)
     {
         return translate(person, true);
     }
 
-    private static Person translate(PersonPE person, boolean recursively)
+    private final static Person translate(final PersonPE person, final boolean recursively)
     {
         if (person == null)
         {
             return null;
         }
-        Person result = new Person();
+        final Person result = new Person();
         result.setFirstName(person.getFirstName());
         result.setLastName(person.getLastName());
         result.setEmail(person.getEmail());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ProcedureTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ProcedureTranslator.java
index 534c3e17e5913ec2a2f245611756888cf3359db5..960a1c9c443c44f1c1b2feba1a6ab21147b9f630 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ProcedureTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ProcedureTranslator.java
@@ -16,33 +16,42 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.server.util;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Person;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Procedure;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ProcedureType;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProcedurePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProcedureTypePE;
 
 /**
+ * A {@link Person} &lt;---&gt; {@link PersonPE} translator.
+ * 
  * @author Tomasz Pylak
  */
-public class ProcedureTranslator
+public final class ProcedureTranslator
 {
 
-    public static Procedure translate(ProcedurePE procedure)
+    private ProcedureTranslator()
+    {
+        // Can not be instantiated.
+    }
+
+    public final static Procedure translate(final ProcedurePE procedure)
     {
         if (procedure == null)
         {
             return null;
         }
-        Procedure result = new Procedure();
+        final Procedure result = new Procedure();
         result.setExperiment(ExperimentTranslator.translate(procedure.getExperiment()));
         result.setProcedureType(translate(procedure.getProcedureType()));
         result.setRegistrationDate(procedure.getRegistrationDate());
         return result;
     }
 
-    private static ProcedureType translate(ProcedureTypePE procedureType)
+    private final static ProcedureType translate(final ProcedureTypePE procedureType)
     {
-        ProcedureType result = new ProcedureType();
+        final ProcedureType result = new ProcedureType();
         result.setCode(procedureType.getCode());
         result.setDataAcquisition(procedureType.isDataAcquisition());
         result.setDatabaseInstance(DatabaseInstanceTranslator.translate(procedureType
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ProjectTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ProjectTranslator.java
index 5a86983a83bc2c3bc2d44bc456064cd839f19693..45f17f3cba4464704b5eae70aaf258f25519e74d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ProjectTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ProjectTranslator.java
@@ -16,22 +16,31 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.server.util;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Person;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Project;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
 
 /**
+ * A {@link Person} &lt;---&gt; {@link PersonPE} translator.
+ * 
  * @author Tomasz Pylak
  */
-public class ProjectTranslator
+public final class ProjectTranslator
 {
 
-    public static Project translate(ProjectPE project)
+    private ProjectTranslator()
+    {
+        // Can not be instantiated.
+    }
+
+    public final static Project translate(final ProjectPE project)
     {
         if (project == null)
         {
             return null;
         }
-        Project result = new Project();
+        final Project result = new Project();
         result.setCode(project.getCode());
         result.setDescription(project.getDescription());
         result.setGroup(GroupTranslator.translate(project.getGroup()));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/PropertyTypeTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/PropertyTypeTranslator.java
index 5ef3215020fed6591fe451952fec78fdbac5523b..26faa64985895ed4468dd79ee013276c5026e545 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/PropertyTypeTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/PropertyTypeTranslator.java
@@ -23,12 +23,19 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PropertyTypePE;
 
 /**
+ * A {@link PropertyType} &lt;---&gt; {@link PropertyTypePE} translator.
+ * 
  * @author Izabela Adamczyk
  */
-public class PropertyTypeTranslator
+public final class PropertyTypeTranslator
 {
 
-    public static PropertyType translate(PropertyTypePE propertyType)
+    private PropertyTypeTranslator()
+    {
+        // Can not be instantiated.
+    }
+
+    public final static PropertyType translate(final PropertyTypePE propertyType)
     {
         final PropertyType result = new PropertyType();
         result.setSimpleCode(propertyType.getSimpleCode());
@@ -37,7 +44,7 @@ public class PropertyTypeTranslator
         return result;
     }
 
-    public static PropertyTypePE translate(final PropertyType propertyType)
+    public final static PropertyTypePE translate(final PropertyType propertyType)
     {
         final PropertyTypePE result = new PropertyTypePE();
         result.setSimpleCode(propertyType.getSimpleCode());
@@ -46,10 +53,10 @@ public class PropertyTypeTranslator
         return result;
     }
 
-    public static List<PropertyTypePE> translate(List<PropertyType> propertyCodes)
+    public final static List<PropertyTypePE> translate(final List<PropertyType> propertyCodes)
     {
-        List<PropertyTypePE> result = new ArrayList<PropertyTypePE>();
-        for (PropertyType s : propertyCodes)
+        final List<PropertyTypePE> result = new ArrayList<PropertyTypePE>();
+        for (final PropertyType s : propertyCodes)
         {
             result.add(translate(s));
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ResultSetTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ResultSetTranslator.java
new file mode 100644
index 0000000000000000000000000000000000000000..4496a5016631b0891ab798807445dfbda0a13448
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/ResultSetTranslator.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2008 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.openbis.generic.client.web.server.util;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
+import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IResultSet;
+
+/**
+ * A {@link ResultSet} &lt;---&gt; {@link IResultSet} translator.
+ * 
+ * @author Christian Ribeaud
+ */
+public final class ResultSetTranslator
+{
+    private ResultSetTranslator()
+    {
+        // Can not be instantiated.
+    }
+
+    public final static <K, T> ResultSet<T> translate(final IResultSet<String, T> result)
+    {
+        final ResultSet<T> resultSet = new ResultSet<T>();
+        resultSet.setList(result.getList());
+        resultSet.setTotalLength(result.getTotalLength());
+        resultSet.setResultSetKey(result.getResultSetKey());
+        return resultSet;
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/RoleAssignmentTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/RoleAssignmentTranslator.java
index 5b4da84a4d0b7660bf1c43ab2c0059d82f93f0dd..54aff97229d72cc76b534f3b1a71719544c02098 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/RoleAssignmentTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/RoleAssignmentTranslator.java
@@ -19,19 +19,25 @@ package ch.systemsx.cisd.openbis.generic.client.web.server.util;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.RoleAssignment;
 import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
 
-public class RoleAssignmentTranslator
+/**
+ * A {@link RoleAssignment} &lt;---&gt; {@link RoleAssignmentPE} translator.
+ * 
+ * @author Christian Ribeaud
+ */
+public final class RoleAssignmentTranslator
 {
     private RoleAssignmentTranslator()
     {
+        // Can not be instantiated.
     }
 
-    public static RoleAssignment translate(RoleAssignmentPE role)
+    public final static RoleAssignment translate(final RoleAssignmentPE role)
     {
         if (role == null)
         {
             return null;
         }
-        RoleAssignment result = new RoleAssignment();
+        final RoleAssignment result = new RoleAssignment();
         result.setGroup(GroupTranslator.translate(role.getGroup()));
         result.setInstance(DatabaseInstanceTranslator.translate(role.getDatabaseInstance()));
         result.setPerson(PersonTranslator.translate(role.getPerson()));
@@ -39,7 +45,7 @@ public class RoleAssignmentTranslator
         return result;
     }
 
-    private static String getRoleCode(RoleAssignmentPE role)
+    private final static String getRoleCode(final RoleAssignmentPE role)
     {
         String code;
         switch (role.getRole())
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SamplePropertyTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SamplePropertyTranslator.java
index 126ad5da0e6616834ec138d9128cf9c3d7114397..1e7ece9f7cb06b2edd0edeebe5d1ae999f6b65ec 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SamplePropertyTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SamplePropertyTranslator.java
@@ -24,15 +24,18 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePropertyTypePE;
 
 /**
+ * A {@link SampleProperty} &lt;---&gt; {@link SamplePropertyPE} translator.
+ * 
  * @author Franz-Josef Elmer
  */
-public class SamplePropertyTranslator
+public final class SamplePropertyTranslator
 {
     private SamplePropertyTranslator()
     {
+        // Can not be instantiated.
     }
 
-    public static SampleProperty translate(final SamplePropertyPE samplePropertyPE)
+    public final static SampleProperty translate(final SamplePropertyPE samplePropertyPE)
     {
         final SampleProperty result = new SampleProperty();
         result.setValue(samplePropertyPE.getValue() == null ? samplePropertyPE.getVocabularyTerm()
@@ -45,7 +48,7 @@ public class SamplePropertyTranslator
 
     }
 
-    public static List<SampleProperty> translate(final List<SamplePropertyPE> list)
+    public final static List<SampleProperty> translate(final List<SamplePropertyPE> list)
     {
         if (list == null)
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTranslator.java
index c343e86fda2835f929a0dd90270bf03675b992ac..d69ebb0a1b3549fa8a153d14e9f04e24141a1901 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTranslator.java
@@ -20,16 +20,19 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 
 /**
+ * A {@link Sample} &lt;---&gt; {@link SamplePE} translator.
+ * 
  * @author Franz-Josef Elmer
  */
-public class SampleTranslator
+public final class SampleTranslator
 {
     private SampleTranslator()
     {
+        // Can not be instantiated.
     }
 
     /** NOTE: ignores sample properties */
-    public static Sample translate(final SamplePE samplePE)
+    public final static Sample translate(final SamplePE samplePE)
     {
         if (samplePE == null)
         {
@@ -41,8 +44,8 @@ public class SampleTranslator
 
     }
 
-    private static Sample translate(final SamplePE samplePE, final int containerDep, final int generatedFromDep,
-            final boolean withDetails)
+    private final static Sample translate(final SamplePE samplePE, final int containerDep,
+            final int generatedFromDep, final boolean withDetails)
     {
         final Sample result = new Sample();
         result.setCode(samplePE.getCode());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTypePropertyTypeTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTypePropertyTypeTranslator.java
index 52213a7b12a8f978c317981a17e0662de07ff75c..b1d6ea0ecde8eaf421d7d1dc2c731872b8a3206a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTypePropertyTypeTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTypePropertyTypeTranslator.java
@@ -25,12 +25,15 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
 
 /**
+ * A {@link SampleTypePropertyType} &lt;---&gt; {@link SampleTypePropertyTypePE} translator.
+ * 
  * @author Franz-Josef Elmer
  */
-public class SampleTypePropertyTypeTranslator
+public final class SampleTypePropertyTypeTranslator
 {
     private SampleTypePropertyTypeTranslator()
     {
+        // Can not be instantiated.
     }
 
     public static SampleTypePropertyType translate(final SampleTypePropertyTypePE s)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTypeTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTypeTranslator.java
index eb90e0224aba5b8c4a840d9aa62278855a69da6f..857707affe9bd8cce3a0c821767c0e7cf682eff5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTypeTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/util/SampleTypeTranslator.java
@@ -20,12 +20,15 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleTypePE;
 
 /**
+ * A {@link SampleType} &lt;---&gt; {@link SampleTypePE} translator.
+ * 
  * @author Franz-Josef Elmer
  */
 public class SampleTypeTranslator
 {
     private SampleTypeTranslator()
     {
+        // Can not be instantiated.
     }
 
     public static SampleType translate(final SampleTypePE sampleTypePE)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
index 25e650e61b556bbf1ff813ec721e1e0ad2f654f9..2c6ec53ac9c1b27567f6ecf6b578f856403f09c1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
@@ -51,6 +51,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.util.GroupTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.ListSampleCriteriaTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.PersonTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.PropertyTypeTranslator;
+import ch.systemsx.cisd.openbis.generic.client.web.server.util.ResultSetTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.RoleAssignmentTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.SamplePropertyTranslator;
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.SampleTranslator;
@@ -365,12 +366,7 @@ public final class GenericClientService extends AbstractClientService implements
                                 return list;
                             }
                         });
-            // TODO: Use BeanUtils
-            final ResultSet<Sample> resultSet = new ResultSet<Sample>();
-            resultSet.setResult(result.getList());
-            resultSet.setResultSetKey(result.getResultSetKey());
-            resultSet.setTotalLength(result.getTotalLength());
-            return resultSet;
+            return ResultSetTranslator.translate(result);
         } catch (final UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
@@ -463,4 +459,6 @@ public final class GenericClientService extends AbstractClientService implements
             throw UserFailureExceptionTranslator.translate(e);
         }
     }
+
+    // TODO: Add tab removing...
 }
diff --git a/openbis/source/java/service.properties b/openbis/source/java/service.properties
index 2abf872f71c2ac244c4cf4079cf0deaffdb0b477..63f55ae1b1904256f9d406ebf0184f9ddf02ab93 100644
--- a/openbis/source/java/service.properties
+++ b/openbis/source/java/service.properties
@@ -15,7 +15,7 @@ database.create-from-scratch = false
 # For debugging set this value to true.
 database.script-single-step-mode = false
 database.url-host-part =
-database.kind = test
+database.kind = dev
 # database.kind = system_test_strict
 # database.kind = system_test_plates_on_demand
 # database.kind = system_test_multi_groups