diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/AbstractShareFinder.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/AbstractShareFinder.java
index 4e2609bf7331e1773473678f80aedc786a31c5e1..2605ab176106b7c4aa31facaa95c3ac872702144 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/AbstractShareFinder.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/AbstractShareFinder.java
@@ -35,7 +35,7 @@ public abstract class AbstractShareFinder implements IShareFinder
      *
      * @author Franz-Josef Elmer
      */
-    protected static interface ISpeedChecker
+    public static interface ISpeedChecker
     {
         boolean check(SimpleDataSetInformationDTO dataSet, Share share);
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/SimpleShufflingShareFinderTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/SimpleShufflingShareFinderTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..19212c2a0e6c752fb32b857255328524b0655998
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/SimpleShufflingShareFinderTest.java
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2011 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.etlserver.plugins;
+
+import static ch.systemsx.cisd.etlserver.plugins.SimpleShufflingShareFinder.MINIMUM_FREE_SPACE_KEY;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.commons.io.FileUtils;
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.testng.AssertJUnit;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.rinn.restrictions.Friend;
+import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.common.filesystem.HostAwareFile;
+import ch.systemsx.cisd.common.filesystem.IFreeSpaceProvider;
+import ch.systemsx.cisd.openbis.dss.generic.shared.AbstractShareFinder;
+import ch.systemsx.cisd.openbis.dss.generic.shared.utils.Share;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+@Friend(toClasses=SimpleShufflingShareFinder.class)
+public class SimpleShufflingShareFinderTest extends AssertJUnit
+{
+    private static final String DATA_SET_CODE = "ds-1";
+
+    private static final class MockSpeedChecker implements AbstractShareFinder.ISpeedChecker
+    {
+        private final boolean[] checkingResults;
+        
+        private final List<Share> recordedShares = new ArrayList<Share>();
+        private SimpleDataSetInformationDTO recordedDataSet;
+        private int index;
+        
+        MockSpeedChecker(boolean... checkingResults)
+        {
+            this.checkingResults = checkingResults;
+        }
+
+        public boolean check(SimpleDataSetInformationDTO dataSet, Share share)
+        {
+            recordedDataSet = dataSet;
+            recordedShares.add(share);
+            return checkingResults[index++];
+        }
+        
+        void verify(SimpleDataSetInformationDTO expectedDataSet, Share... expectedShares)
+        {
+            assertEquals(index, checkingResults.length);
+            assertSame(expectedDataSet, recordedDataSet);
+            for (int i = 0; i < expectedShares.length; i++)
+            {
+                assertSame(expectedShares[i], recordedShares.get(i));
+            }
+            assertEquals(expectedShares.length, recordedShares.size());
+        }
+    }
+    
+    private Mockery context;
+    private IFreeSpaceProvider freeSpaceProvider;
+    private SimpleDataSetInformationDTO dataSet;
+    
+    @BeforeMethod
+    public void setUp()
+    {
+        context = new Mockery();
+        freeSpaceProvider = context.mock(IFreeSpaceProvider.class);
+        dataSet = new SimpleDataSetInformationDTO();
+        dataSet.setDataSetCode(DATA_SET_CODE);
+        dataSet.setDataSetSize(FileUtils.ONE_MB);
+    }
+    
+    @Test
+    public void testNoSpeedCheckingShare()
+    {
+        SimpleShufflingShareFinder finder = new SimpleShufflingShareFinder(new Properties());
+        MockSpeedChecker speedChecker = new MockSpeedChecker(false);
+        Share share = share(0);
+        
+        Share foundShare = finder.tryToFindShare(dataSet, Arrays.asList(share), speedChecker);
+        
+        assertEquals(null, foundShare);
+        speedChecker.verify(dataSet, share);
+        context.assertIsSatisfied();
+    }
+    
+    @Test
+    public void testFoundNothing()
+    {
+        SimpleShufflingShareFinder finder = new SimpleShufflingShareFinder(new Properties());
+        MockSpeedChecker speedChecker = new MockSpeedChecker(true);
+        Share share = share(10 * FileUtils.ONE_MB);
+        
+        Share foundShare = finder.tryToFindShare(dataSet, Arrays.asList(share), speedChecker);
+        
+        assertSame(null, foundShare);
+        speedChecker.verify(dataSet, share);
+        context.assertIsSatisfied();
+    }
+    
+    @Test
+    public void testFoundMaximum()
+    {
+        Properties properties = new Properties();
+        properties.setProperty(MINIMUM_FREE_SPACE_KEY, Long.toString(2));
+        SimpleShufflingShareFinder finder = new SimpleShufflingShareFinder(properties);
+        MockSpeedChecker speedChecker = new MockSpeedChecker(true, false, true);
+        Share s1 = share(10 * FileUtils.ONE_MB);
+        Share s2 = share(0);
+        Share s3 = share(30 * FileUtils.ONE_MB);
+        
+        Share foundShare = finder.tryToFindShare(dataSet, Arrays.asList(s1, s2, s3), speedChecker);
+        
+        assertSame(s3, foundShare);
+        speedChecker.verify(dataSet, s1, s2, s3);
+        context.assertIsSatisfied();
+    }
+    
+    private Share share(final long freeSpace)
+    {
+        final File file = new File("1");
+        if (freeSpace > 0)
+        {
+            context.checking(new Expectations()
+                {
+                    {
+                        try
+                        {
+                            one(freeSpaceProvider).freeSpaceKb(new HostAwareFile(file));
+                            will(returnValue(freeSpace / FileUtils.ONE_KB));
+                        } catch (IOException ex)
+                        {
+                            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+                        }
+                    }
+                });
+        }
+        return new Share(file, 0, freeSpaceProvider);
+    }
+}
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/SimpleShareFinderTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/SimpleShareFinderTest.java
index 6c117bf6c988d321e9ac947d00162f08f3bb12a4..a6db43a8641bc898524b064fa042de606b169b90 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/SimpleShareFinderTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/SimpleShareFinderTest.java
@@ -18,7 +18,9 @@ package ch.systemsx.cisd.openbis.dss.generic.shared;
 
 import java.io.File;
 import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
 import java.util.Properties;
 
 import org.testng.AssertJUnit;
@@ -38,6 +40,37 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
  */
 public class SimpleShareFinderTest extends AssertJUnit
 {
+    private static final class MockSpeedChecker implements AbstractShareFinder.ISpeedChecker
+    {
+        private final boolean[] checkingResults;
+        
+        private final List<Share> recordedShares = new ArrayList<Share>();
+        private SimpleDataSetInformationDTO recordedDataSet;
+        private int index;
+        
+        MockSpeedChecker(boolean... checkingResults)
+        {
+            this.checkingResults = checkingResults;
+        }
+
+        public boolean check(SimpleDataSetInformationDTO dataSet, Share share)
+        {
+            recordedDataSet = dataSet;
+            recordedShares.add(share);
+            return checkingResults[index++];
+        }
+        
+        void verify(SimpleDataSetInformationDTO expectedDataSet, Share... expectedShares)
+        {
+            assertEquals(index, checkingResults.length);
+            assertSame(expectedDataSet, recordedDataSet);
+            for (int i = 0; i < expectedShares.length; i++)
+            {
+                assertSame(expectedShares[i], recordedShares.get(i));
+            }
+        }
+    }
+    
     private SimpleShareFinder shareFinder;
 
     @BeforeMethod
@@ -57,9 +90,11 @@ public class SimpleShareFinderTest extends AssertJUnit
         Share s3 = share("3", 30, false);
         Share s4 = share("4", 50, false);
         
-        Share share = shareFinder.tryToFindShare(dataSet, Arrays.asList(s1, s2, s3, s4));
+        MockSpeedChecker speedChecker = new MockSpeedChecker(true, true, true, true);
+        Share share = shareFinder.tryToFindShare(dataSet, Arrays.asList(s1, s2, s3, s4), speedChecker);
         
         assertSame(s4, share);
+        speedChecker.verify(dataSet, s1, s2, s3, s4);
     }
     
     @Test
@@ -71,10 +106,13 @@ public class SimpleShareFinderTest extends AssertJUnit
         Share s1 = share("1", 300, true);
         Share s2 = share("2", 400, true);
         Share s3 = share("3", 30, false);
+        Share s4 = share("4", 50, false);
         
-        Share share = shareFinder.tryToFindShare(dataSet, Arrays.asList(s1, s2, s3));
+        MockSpeedChecker speedChecker = new MockSpeedChecker(true, true, true, false);
+        Share share = shareFinder.tryToFindShare(dataSet, Arrays.asList(s1, s2, s3, s4), speedChecker);
         
         assertSame(s2, share);
+        speedChecker.verify(dataSet, s1, s2, s3, s4);
     }
 
     @Test