diff --git a/common/source/java/ch/systemsx/cisd/common/collections/CollectionUtils.java b/common/source/java/ch/systemsx/cisd/common/collections/CollectionUtils.java
index 9380b25494106783dde10982fcc62bc3861590c1..3a73b50409bd2d8475503bfe1e8f5812f4e9497a 100644
--- a/common/source/java/ch/systemsx/cisd/common/collections/CollectionUtils.java
+++ b/common/source/java/ch/systemsx/cisd/common/collections/CollectionUtils.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
@@ -343,4 +344,23 @@ public final class CollectionUtils
     {
         return (list != null) ? list : Collections.<E> emptyList();
     }
+    
+    /**
+     * Sorts a collection of objects with a key extractor providing sort criteria.
+     * <p>
+     * The method is useful when we would like to sort a list of non-Comparable objects.
+     */
+    public static <E, C extends Comparable<C>> void sort(List<E> list,
+            final IKeyExtractor<C, E> sortCriteriaKeyExtractor)
+    {
+        Collections.sort(list, new Comparator<E>()
+            {
+                public int compare(E o1, E o2)
+                {
+                    C key1 = sortCriteriaKeyExtractor.getKey(o1);
+                    C key2 = sortCriteriaKeyExtractor.getKey(o2);
+                    return key1.compareTo(key2);
+                }
+            });
+    }
 }
\ No newline at end of file
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/collections/CollectionUtilsTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/collections/CollectionUtilsTest.java
index e17fc31255a34ed2963ff8b24cb60eeced3668ac..3c16dda1aea40866b25a56c472ae67f86442b9ca 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/collections/CollectionUtilsTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/collections/CollectionUtilsTest.java
@@ -19,7 +19,9 @@ package ch.systemsx.cisd.common.collections;
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertTrue;
 
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
 import org.testng.annotations.Test;
@@ -116,4 +118,23 @@ public final class CollectionUtilsTest
         }
         assertTrue("IToStringConverter can not be null.", exceptionThrown);
     }
+
+    @Test
+    public void testSort()
+    {
+        IKeyExtractor<Integer, String> lengthExtractor = new IKeyExtractor<Integer, String>()
+            {
+
+                public Integer getKey(String e)
+                {
+                    return e.length();
+                }
+            };
+
+        List<String> strings = Arrays.asList("bbbb", "z", "ccc", "aa");
+        List<String> sortedByLength = Arrays.asList("z", "aa", "ccc", "bbbb");
+
+        CollectionUtils.sort(strings, lengthExtractor);
+        assertEquals(sortedByLength, strings);
+    }
 }