diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java
index db67b2573b149333196d2a79c88dbc8ada92cad2..10c0603e458647a243e96a2ecd6864102423dfb8 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java
@@ -40,7 +40,9 @@ import ch.systemsx.cisd.common.api.server.RpcServiceNameServer;
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.io.ConcatenatedContentInputStream;
+import ch.systemsx.cisd.common.io.ContentProviderBasedContent;
 import ch.systemsx.cisd.common.io.IContent;
+import ch.systemsx.cisd.common.io.IContentProvider;
 import ch.systemsx.cisd.common.spring.IInvocationLoggerContext;
 import ch.systemsx.cisd.openbis.dss.etl.AbsoluteImageReference;
 import ch.systemsx.cisd.openbis.dss.etl.HCSImageDatasetLoaderFactory;
@@ -352,20 +354,24 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
     }
 
     public InputStream loadImages(String sessionToken, List<PlateImageReference> imageReferences,
-            Size sizeOrNull, boolean convertToPng)
+            final Size sizeOrNull, final boolean convertToPng)
     {
         checkDatasetsAuthorizationForIDatasetIdentifier(sessionToken, imageReferences);
         final Map<String, IHCSImageDatasetLoader> imageLoadersMap =
                 getImageDatasetsMap(sessionToken, imageReferences);
         final List<IContent> imageContents = new ArrayList<IContent>();
-        for (PlateImageReference imageReference : imageReferences)
+        for (final PlateImageReference imageReference : imageReferences)
         {
             final IHCSImageDatasetLoader imageAccessor =
                     imageLoadersMap.get(imageReference.getDatasetCode());
             assert imageAccessor != null : "imageAccessor not found for: " + imageReference;
-            IContent content =
-                    tryGetImageContent(imageAccessor, imageReference, sizeOrNull, convertToPng);
-            imageContents.add(content);
+            imageContents.add(new ContentProviderBasedContent(new IContentProvider()
+                {
+                    public IContent getContent()
+                    {
+                        return tryGetImageContent(imageAccessor, imageReference, sizeOrNull, convertToPng);
+                    }
+                }));
         }
         return new ConcatenatedContentInputStream(true, imageContents);
     }
@@ -381,19 +387,25 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
     {
         String datasetCode = dataSetIdentifier.getDatasetCode();
         File rootDir = getRootDirectoryForDataSet(datasetCode);
-        IHCSImageDatasetLoader imageAccessor = createImageLoader(datasetCode, rootDir);
+        final IHCSImageDatasetLoader imageAccessor = createImageLoader(datasetCode, rootDir);
         List<PlateImageReference> imageReferences =
                 createPlateImageReferences(imageAccessor, dataSetIdentifier, wellPositions, channel);
-        Size size = convertToSize(thumbnailSizeOrNull);
+        final Size size = convertToSize(thumbnailSizeOrNull);
         List<IContent> imageContents = new ArrayList<IContent>();
-        for (PlateImageReference imageReference : imageReferences)
+
+        for (final PlateImageReference imageReference : imageReferences)
         {
-            IContent content = tryGetImageContent(imageAccessor, imageReference, size, true);
-            imageContents.add(content);
+            imageContents.add(new ContentProviderBasedContent(new IContentProvider()
+                {
+                    public IContent getContent()
+                    {
+                        return tryGetImageContent(imageAccessor, imageReference, size, true);
+                    }
+                }));
         }
         return new ConcatenatedContentInputStream(true, imageContents);
     }
-
+    
     public List<PlateImageReference> listPlateImageReferences(String sessionToken,
             IDatasetIdentifier dataSetIdentifier, List<WellPosition> wellPositions, String channel)
     {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/IScreeningOpenbisServiceFacade.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/IScreeningOpenbisServiceFacade.java
index 0bbd38133778805b272c8a09cd2b74f30dc45972..1195eca66e64d612bf06569e916d7bc6cfc21f15 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/IScreeningOpenbisServiceFacade.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/IScreeningOpenbisServiceFacade.java
@@ -283,7 +283,7 @@ public interface IScreeningOpenbisServiceFacade
      * which the specified data sets belong.
      */
     public void saveImageTransformerFactory(List<IDatasetIdentifier> dataSetIdentifiers, String channel,
-            IImageTransformerFactory transformerFactory);
+            IImageTransformerFactory transformerFactoryOrNull);
 
     /**
      * Returns the transformer factory for the specified channel and the experiment to which
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacade.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacade.java
index b9923dc93558dc7338e6374f8fa861c521f1d560..943dc7e6ec052f38e1c8af33ac963f8648768afa 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacade.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacade.java
@@ -596,7 +596,7 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
     }
 
     public void saveImageTransformerFactory(List<IDatasetIdentifier> dataSetIdentifiers, String channel,
-            IImageTransformerFactory transformerFactory)
+            IImageTransformerFactory transformerFactoryOrNull)
     {
         Map<String, List<IDatasetIdentifier>> map = getReferencesPerDss(dataSetIdentifiers);
         Set<Entry<String, List<IDatasetIdentifier>>> entrySet = map.entrySet();
@@ -604,7 +604,7 @@ public class ScreeningOpenbisServiceFacade implements IScreeningOpenbisServiceFa
         {
             String serverUrl = entry.getKey();
             IDssServiceRpcScreening service = dssServiceCache.createDssService(serverUrl).getService();
-            service.saveImageTransformerFactory(sessionToken, entry.getValue(), channel, transformerFactory);
+            service.saveImageTransformerFactory(sessionToken, entry.getValue(), channel, transformerFactoryOrNull);
         }
     }