diff --git a/datastore_server/build/build.xml b/datastore_server/build/build.xml
index 91a4beee0ad60b245caf3d9b346536b1e1068517..b46645777998e7a3e799f86178ffa0840b4a6365 100644
--- a/datastore_server/build/build.xml
+++ b/datastore_server/build/build.xml
@@ -103,6 +103,11 @@
   		  <include name="server/*.jar" />
   		</fileset>
   	</copy>
+  	<copy todir="${dist.datastore_server.lib}">
+  		<fileset dir="${lib}/cisd-image_readers">
+  		  <include name="*.jar" />
+  		</fileset>
+  	</copy>
   	<copy file="${lib}/cisd-base/cisd-base.jar" todir="${dist.datastore_server.lib}" />
     <copy file="${lib}/cisd-args4j/cisd-args4j.jar" todir="${dist.datastore_server.lib}" />
     <copy file="${lib}/cifex/cifex.jar" todir="${dist.datastore_server.lib}" />
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 d9a180432d511adef451381a11b974e0f898b577..12ad535539b1d9c44144f2538cda001166bafab9 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
@@ -16,16 +16,15 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.shared.utils;
 
-import ij.io.Opener;
+import static ch.systemsx.cisd.common.utilities.DataTypeUtil.GIF_FILE;
+import static ch.systemsx.cisd.common.utilities.DataTypeUtil.JPEG_FILE;
+import static ch.systemsx.cisd.common.utilities.DataTypeUtil.PNG_FILE;
+import static ch.systemsx.cisd.common.utilities.DataTypeUtil.TIFF_FILE;
 
 import java.awt.Graphics2D;
 import java.awt.RenderingHints;
 import java.awt.image.BufferedImage;
-import java.awt.image.Raster;
-import java.io.BufferedInputStream;
 import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -33,18 +32,17 @@ import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
-import javax.imageio.ImageIO;
+import org.apache.commons.io.FilenameUtils;
 
-import org.apache.commons.io.IOUtils;
-
-import com.sun.media.jai.codec.ImageCodec;
-import com.sun.media.jai.codec.ImageDecoder;
-
-import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.base.io.IRandomAccessFile;
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.io.FileBasedContent;
 import ch.systemsx.cisd.common.io.IContent;
 import ch.systemsx.cisd.common.utilities.DataTypeUtil;
+import ch.systemsx.cisd.imagereaders.IImageReader;
+import ch.systemsx.cisd.imagereaders.ImageReaderConstants;
+import ch.systemsx.cisd.imagereaders.ImageReaderFactory;
+import ch.systemsx.cisd.imagereaders.TiffReadParams;
 
 /**
  * Utility function on images.
@@ -58,42 +56,35 @@ public class ImageUtil
 
     private static interface ImageLoader
     {
-        public BufferedImage load(InputStream inputStream);
+        public BufferedImage load(IRandomAccessFile raf);
 
-        public BufferedImage load(InputStream inputStream, int page);
+        public BufferedImage load(IRandomAccessFile raf, int page);
     }
 
     private static final class TiffImageLoader implements ImageLoader
     {
-        static final ImageLoader INSTANCE = new TiffImageLoader();
-
-        public BufferedImage load(InputStream inputStream)
+        public BufferedImage load(IRandomAccessFile handle)
         {
-            return load(inputStream, 0);
+            return load(handle, 0);
         }
 
-        private final static int MAX_READ_AHEAD = 30000000;
+        // TODO KE : ask if anyone remembers what is this ?!
+        // private final static int MAX_READ_AHEAD = 30000000;
 
-        public BufferedImage load(InputStream inputStream, int page)
+        public BufferedImage load(IRandomAccessFile handle, int page)
         {
-            inputStream.mark(MAX_READ_AHEAD);
+            // inputStream.mark(MAX_READ_AHEAD);
             try
             {
-                return loadJavaAdvancedImagingTiff(inputStream, page, false);
+                return loadJavaAdvancedImagingTiff(handle, page, false);
             } catch (RuntimeException ex)
             {
                 if (page == 0)
                 {
-                    try
-                    {
-                        inputStream.reset();
-                    } catch (IOException ex1)
-                    {
-                        throw ex;
-                    }
-                    // There are some TIFF files which cannot be opened by JIA, try ImageJ
+                    handle.seek(0);
+                    // There are some TIFF files which cannot be opened by JAI, try ImageJ
                     // instead...
-                    return loadWithImageJ(inputStream);
+                    return loadWithImageJ(handle);
                 } else
                 {
                     throw ex;
@@ -101,9 +92,12 @@ public class ImageUtil
             }
         }
 
-        private BufferedImage loadWithImageJ(InputStream inputStream)
+        private BufferedImage loadWithImageJ(IRandomAccessFile handle)
         {
-            return new Opener().openTiff(inputStream, "").getBufferedImage();
+            IImageReader imageReader =
+                    ImageReaderFactory.tryGetReader(ImageReaderConstants.IMAGEJ_LIBRARY, "tiff");
+            return imageReader.readImage(handle, null);
+
         }
     }
 
@@ -114,55 +108,57 @@ public class ImageUtil
      *            appropriate buffered imaged type will be used, otherwise the image will be
      *            converted to 24 bits RGB. Useful if access to original pixel values is needed.
      */
-    public static BufferedImage loadJavaAdvancedImagingTiff(InputStream inputStream,
+    public static BufferedImage loadJavaAdvancedImagingTiff(IRandomAccessFile handle,
             Integer pageOrNull, boolean allow16BitGrayscaleModel)
             throws EnvironmentFailureException
     {
+        IImageReader imageReader =
+                ImageReaderFactory.tryGetReader(ImageReaderConstants.JAI_LIBRARY, "tiff");
+        if (imageReader == null)
+        {
+            throw EnvironmentFailureException
+                    .fromTemplate("Cannot find JAI image decoder for TIFF files.");
+        }
+
         int page = getPageNumber(pageOrNull);
-        final ImageDecoder dec = ImageCodec.createImageDecoder("tiff", inputStream, null);
-        Raster raster;
+        TiffReadParams readParams = new TiffReadParams(page);
+        readParams.setAllow16BitGrayscaleModel(allow16BitGrayscaleModel);
         try
         {
-            raster = dec.decodeAsRaster(page);
-        } catch (IOException ex)
+            return imageReader.readImage(handle, readParams);
+        } catch (Exception ex)
         {
             throw EnvironmentFailureException.fromTemplate("Cannot decode image.", ex);
         }
-        int bufferType = findBestImageBufferType(raster, allow16BitGrayscaleModel);
-        final BufferedImage image =
-                new BufferedImage(raster.getWidth(), raster.getHeight(), bufferType);
-        image.setData(raster);
-        return image;
-    }
-
-    private static int findBestImageBufferType(Raster raster, boolean allow16BitGrayscaleModel)
-    {
-        boolean is16BitGrayscale =
-                raster.getNumBands() == 1 && raster.getSampleModel().getSampleSize()[0] == 16;
-        return is16BitGrayscale && allow16BitGrayscaleModel ? BufferedImage.TYPE_USHORT_GRAY
-                : BufferedImage.TYPE_INT_RGB;
     }
 
     private static final class JavaImageLoader implements ImageLoader
     {
-        static final ImageLoader INSTANCE = new JavaImageLoader();
+        private final String fileType;
 
-        public BufferedImage load(InputStream inputStream)
+        JavaImageLoader(String fileType)
         {
-            try
-            {
-                return ImageIO.read(inputStream);
-            } catch (IOException ex)
-            {
-                throw CheckedExceptionTunnel.wrapIfNecessary(ex);
-            }
+            this.fileType = fileType;
         }
 
-        public BufferedImage load(InputStream inputStream, int page)
+        public BufferedImage load(IRandomAccessFile handle)
+        {
+            return load(handle, 0);
+        }
+
+        public BufferedImage load(IRandomAccessFile handle, int page)
         {
             if (page == 0)
             {
-                return load(inputStream);
+                IImageReader imageReader =
+                        ImageReaderFactory.tryGetReader(ImageReaderConstants.IMAGEIO_LIBRARY,
+                                fileType);
+                if (imageReader == null)
+                {
+                    throw EnvironmentFailureException.fromTemplate(
+                            "Cannot find ImageIO reader for file type '%s'", fileType);
+                }
+                return imageReader.readImage(handle, null);
             } else
             {
                 throw new UnsupportedOperationException();
@@ -175,10 +171,10 @@ public class ImageUtil
 
     static
     {
-        imageLoaders.put(DataTypeUtil.GIF_FILE, JavaImageLoader.INSTANCE);
-        imageLoaders.put(DataTypeUtil.JPEG_FILE, JavaImageLoader.INSTANCE);
-        imageLoaders.put(DataTypeUtil.PNG_FILE, JavaImageLoader.INSTANCE);
-        imageLoaders.put(DataTypeUtil.TIFF_FILE, TiffImageLoader.INSTANCE);
+        imageLoaders.put(GIF_FILE, new JavaImageLoader(GIF_FILE));
+        imageLoaders.put(JPEG_FILE, new JavaImageLoader(JPEG_FILE));
+        imageLoaders.put(PNG_FILE, new JavaImageLoader(PNG_FILE));
+        imageLoaders.put(TIFF_FILE, new TiffImageLoader());
     }
 
     /**
@@ -190,18 +186,8 @@ public class ImageUtil
     public static boolean isImageFile(File file)
     {
         String fileName = file.getName();
-        String fileType = tryGetFileExtension(fileName);
-        return fileType != null && FILE_TYPES.contains(fileType);
-    }
-
-    private static String tryGetFileExtension(String name)
-    {
-        int lastIndexOfDot = name.lastIndexOf('.');
-        if (lastIndexOfDot < 0)
-        {
-            return null;
-        }
-        return name.substring(lastIndexOfDot + 1).toLowerCase();
+        String fileType = FilenameUtils.getExtension(fileName);
+        return fileType != null && FILE_TYPES.contains(fileType.toLowerCase());
     }
 
     /**
@@ -228,13 +214,9 @@ public class ImageUtil
     public static BufferedImage loadImage(IContent content, Integer pageOrNull)
     {
         int page = getPageNumber(pageOrNull);
-        InputStream markSupportingInputStream = content.getInputStream();
-        if (markSupportingInputStream.markSupported() == false)
-        {
-            markSupportingInputStream = new BufferedInputStream(markSupportingInputStream);
-        }
-        String fileType = DataTypeUtil.tryToFigureOutFileTypeOf(markSupportingInputStream);
-        return loadImage(markSupportingInputStream, fileType, page);
+        IRandomAccessFile handle = content.getReadOnlyRandomAccessFile();
+        String fileType = DataTypeUtil.tryToFigureOutFileTypeOf(handle);
+        return loadImage(handle, fileType, page);
     }
 
     private static int getPageNumber(Integer pageOrNull)
@@ -243,14 +225,14 @@ public class ImageUtil
     }
 
     /**
-     * Loads the specified <var>page</var> from the image from the tiven </var>inputStream</var>.
+     * Loads the specified <var>page</var> from the image from the given </var>handle</var>.
      * Supported images formats are GIF, JPG, PNG, and TIFF. The input stream will be closed after
      * loading. Note that only for TIFF files a <var>page</var> other than 0 may be specified.
      * 
      * @throws IllegalArgumentException if the input stream doesn't start with a magic number
      *             identifying supported image format.
      */
-    private static BufferedImage loadImage(InputStream inputStream, String fileType, int page)
+    private static BufferedImage loadImage(IRandomAccessFile handle, String fileType, int page)
     {
         try
         {
@@ -268,10 +250,10 @@ public class ImageUtil
                 throw new IllegalArgumentException("Unable to load image of file type '" + fileType
                         + "'.");
             }
-            return imageLoader.load(inputStream, page);
+            return imageLoader.load(handle, page);
         } finally
         {
-            IOUtils.closeQuietly(inputStream);
+            closeQuietly(handle);
         }
     }
 
@@ -350,4 +332,16 @@ public class ImageUtil
         graphics2D.drawImage(image, 0, 0, thumbnailWidth, thumbnailHeight, null);
         return thumbnail;
     }
+
+    private static void closeQuietly(IRandomAccessFile handle)
+    {
+        try
+        {
+            handle.close();
+        } catch (Exception ex)
+        {
+            // keep quiet
+        }
+    }
+
 }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ImageUtilTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ImageUtilTest.java
index 05dda6c326bf2085a22a357536008ed9869be63a..ff2ebf020401b129fd1b3a6b4cca7fa13837acf6 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ImageUtilTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/ImageUtilTest.java
@@ -18,27 +18,27 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.utils;
 
 import java.awt.image.BufferedImage;
 import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 
 import org.testng.AssertJUnit;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
+import ch.systemsx.cisd.base.io.ByteBufferRandomAccessFile;
 import ch.systemsx.cisd.base.io.IRandomAccessFile;
 import ch.systemsx.cisd.common.io.FileBasedContent;
 import ch.systemsx.cisd.common.io.IContent;
+import ch.systemsx.cisd.imagereaders.ImageReaderConstants;
+import ch.systemsx.cisd.imagereaders.ImageReadersTestHelper;
 
 /**
- * 
- *
  * @author Franz-Josef Elmer
  */
 public class ImageUtilTest extends AssertJUnit
 {
     private static class MockIContent implements IContent
     {
-        final MockInputStream is = new MockInputStream();
+        final MockRandomAccessFile is = new MockRandomAccessFile();
         
         public String tryGetName()
         {
@@ -57,39 +57,41 @@ public class ImageUtilTest extends AssertJUnit
 
         public IRandomAccessFile getReadOnlyRandomAccessFile()
         {
-            throw new UnsupportedOperationException();
+            return is;
         }
 
         public InputStream getInputStream()
         {
-            return is;
+            throw new UnsupportedOperationException();
         }
         
     }
     
-    private static class MockInputStream extends InputStream
+    private static class MockRandomAccessFile extends ByteBufferRandomAccessFile
     {
-        boolean closeInvoked;
-        
-        @Override
-        public void close() throws IOException
+        public MockRandomAccessFile()
         {
-            closeInvoked = true;
+            super(1);
         }
+
+        boolean closeInvoked;
         
         @Override
-        public int read() throws IOException
+        public void close()
         {
-            return 0;
+            closeInvoked = true;
         }
     }
     
     private File dir;
 
     @BeforeMethod
-    public void setUp()
+    public void setUp() throws Exception
     {
         dir = new File("../datastore_server/resource/test-data/ImageUtilTest");
+        ImageReadersTestHelper.setUpLibraries(ImageReaderConstants.IMAGEIO_LIBRARY,
+                ImageReaderConstants.JAI_LIBRARY, ImageReaderConstants.IMAGEJ_LIBRARY);
+
     }
     
     @Test
@@ -119,7 +121,7 @@ public class ImageUtilTest extends AssertJUnit
         assertImageSize(805, 1023, loadImageByFile("tiff-example.tiff"));
         assertImageSize(805, 1023, loadImageByInputStream("tiff-example.tiff"));
     }
-    
+
     @Test
     public void testCreateThumbnail()
     {
diff --git a/screening/.classpath b/screening/.classpath
index 314d7bc3a608d1dfee5cf1486f3d9996ce55d894..4f2e3b0b2b03f3700ac90f06e62839ed566becec 100644
--- a/screening/.classpath
+++ b/screening/.classpath
@@ -2,7 +2,6 @@
 <classpath>
 	<classpathentry kind="src" path="source/java"/>
 	<classpathentry kind="src" path="sourceTest/java"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/datastore_server"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/common"/>
 	<classpathentry kind="lib" path="/libraries/cisd-base/cisd-base.jar" sourcepath="/libraries/cisd-base/cisd-base-src.zip"/>
@@ -48,5 +47,8 @@
 	<classpathentry kind="lib" path="/libraries/jython/jython.jar" sourcepath="/libraries/jython/src.zip"/>
 	<classpathentry kind="lib" path="/libraries/hibernate/hibernate3.jar" sourcepath="/libraries/hibernate/src.zip"/>
 	<classpathentry kind="lib" path="/libraries/bioformats/bioformats.jar" sourcepath="/libraries/bioformats/bioformats_src.zip"/>
+	<classpathentry kind="lib" path="/libraries/cisd-image_readers/cisd-image_readers-bioformats.jar"/>
+	<classpathentry kind="lib" path="/libraries/cisd-image_readers/cisd-image_readers.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
 	<classpathentry kind="output" path="targets/www/WEB-INF/classes"/>
 </classpath>
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/ImageMetadataExtractor.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/ImageMetadataExtractor.java
index 86171607e97f2174c21137bf661012243fc8cb3e..7ceca090b970beb9a65cdc0ea929628c3b61043e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/ImageMetadataExtractor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/ImageMetadataExtractor.java
@@ -19,22 +19,17 @@ package ch.systemsx.cisd.openbis.dss.etl.biozentrum;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeSet;
 
-import loci.formats.IFormatReader;
-import loci.formats.ImageReader;
-import loci.formats.gui.BufferedImageReader;
-import loci.formats.in.DefaultMetadataOptions;
-import loci.formats.in.MetadataLevel;
-import loci.formats.in.MetadataOptions;
-
-import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.imagereaders.IImageReader;
+import ch.systemsx.cisd.imagereaders.IMetaDataAwareImageReader;
+import ch.systemsx.cisd.imagereaders.ImageReaderConstants;
+import ch.systemsx.cisd.imagereaders.ImageReaderFactory;
 import ch.systemsx.cisd.openbis.dss.etl.dto.api.v1.Location;
 
 /**
@@ -49,26 +44,13 @@ public class ImageMetadataExtractor
 
     public static Map<String, Object> extractMetadata(File imageFile)
     {
-        HashMap<String, Object> result = new HashMap<String, Object>();
-        // initialize the reader
-        IFormatReader reader = new BufferedImageReader(new ImageReader());
-        MetadataOptions metaOptions = new DefaultMetadataOptions(MetadataLevel.ALL);
-        reader.setMetadataOptions(metaOptions);
+        IImageReader imageReader =
+                ImageReaderFactory.tryGetImageReaderForFile(
+                        ImageReaderConstants.BIOFORMATS_LIBRARY,
+                        imageFile.getAbsolutePath());
 
-        try
-        {
-            reader.setId(imageFile.getAbsolutePath());
-            nullSafeAddAll(result, reader.getGlobalMetadata());
-            nullSafeAddAll(result, reader.getSeriesMetadata());
-        } catch (Exception ex)
-        {
-            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
-        } finally
-        {
-            close(reader);
-        }
-
-        return result;
+        IMetaDataAwareImageReader metaDataReader = (IMetaDataAwareImageReader) imageReader;
+        return metaDataReader.readMetaData(imageFile, null);
     }
 
     /**
@@ -98,27 +80,6 @@ public class ImageMetadataExtractor
         return result;
     }
 
-    private static void nullSafeAddAll(HashMap<String, Object> accumulator,
-            Hashtable<String, Object> toAdd)
-    {
-        if (toAdd != null)
-        {
-            accumulator.putAll(toAdd);
-        }
-
-    }
-
-    private static void close(IFormatReader reader)
-    {
-        try
-        {
-            reader.close();
-        } catch (Exception ex)
-        {
-            // do not throw exception
-        }
-    }
-
     private static Location extractLocation(Map<String, Object> metadata, List<Number> xCoords,
             List<Number> yCoords)
     {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/DynamixWellBrightnessEqualizerProcessingPlugin.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/DynamixWellBrightnessEqualizerProcessingPlugin.java
index 297f35dc6dff8959fa4391536e34daf164cbb923..3c6240fe532e7bd96a4833c457c21a271795bfef 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/DynamixWellBrightnessEqualizerProcessingPlugin.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/DynamixWellBrightnessEqualizerProcessingPlugin.java
@@ -162,8 +162,8 @@ public class DynamixWellBrightnessEqualizerProcessingPlugin extends
             ImgImageEnrichedDTO image)
     {
         IContent content = contentRepository.getContent(image.getFilePath());
-        return ImageUtil.loadJavaAdvancedImagingTiff(content.getInputStream(), image.getPage(),
-                true);
+        return ImageUtil.loadJavaAdvancedImagingTiff(content.getReadOnlyRandomAccessFile(),
+                image.getPage(), true);
     }
 
     private static IImageTransformerFactoryProvider createImageTransformerFactoryProvider(
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/ImageMetadataExtractorTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/ImageMetadataExtractorTest.java
index cc52ffe1cc9227bdaaafb4b0ceb5138117e0491b..1c4d9824b5fb39b65c46dc2e21f001aecdd9c3bd 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/ImageMetadataExtractorTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/ImageMetadataExtractorTest.java
@@ -16,11 +16,7 @@
 
 package ch.systemsx.cisd.openbis.dss.etl.biozentrum;
 
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 
 import org.testng.AssertJUnit;
@@ -33,112 +29,6 @@ import ch.systemsx.cisd.openbis.dss.etl.dto.api.v1.Location;
  */
 public class ImageMetadataExtractorTest extends AssertJUnit
 {
-
-    public final String FILE_NAME =
-            "./sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/demo.tif";
-
-    @Test
-    public void testMetaDataExtraction() throws Exception
-    {
-        File imageFile = new File(FILE_NAME);
-        Map<String, Object> metaData = ImageMetadataExtractor.extractMetadata(imageFile);
-        List<String> sortedKeys = new ArrayList<String>(metaData.keySet());
-        Collections.sort(sortedKeys);
-
-        StringBuilder output = new StringBuilder();
-        for (String key : sortedKeys)
-        {
-            Object value = metaData.get(key);
-            output.append(key + ": " + value);
-            output.append("\n");
-        }
-
-        assertEquals(
-                "<prop id=\"Description\" type=\"string\" value=\"Experiment base name:ME20101116METADATA03&amp;#13;&amp;#10;Experiment set:ME20101116METADATA03&amp;#13;&amp;#10;Plate Screen&amp;#13;&amp;#10;Exposure: 10 ms&amp;#13;&amp;#10;Binning: 1 x 1&amp;#13;&amp;#10;Region: 1392 x 1040, offset at (0, 0)&amp;#13;&amp;#10;Acquired from Photometrics&amp;#13;&amp;#10;Subtract: Off&amp;#13;&amp;#10;Shading: Off&amp;#13;&amp;#10;Digitizer: 20 MHz&amp;#13;&amp;#10;Gain: Gain 1 (1x)&amp;#13;&amp;#10;Camera Shutter: Always Open&amp;#13;&amp;#10;Clear Count: 2&amp;#13;&amp;#10;Clear Mode: CLEAR PRE SEQUENCE&amp;#13;&amp;#10;Frames to Average: 1&amp;#13;&amp;#10;Trigger Mode: Normal (TIMED)&amp;#13;&amp;#10;Temperature: -29.95&amp;#13;&amp;#10;\">\n"
-                        + "<prop id=\"stage-label\" type=\"string\" value=\"F09: Site 1\">\n"
-                        + "ApplicationName: MetaMorph\n"
-                        + "ApplicationVersion: 3.1.0.79\n"
-                        + "Binning: 1 x 1\n"
-                        + "BitsPerSample: 16\n"
-                        + "Camera Bit Depth: 12\n"
-                        + "Camera Shutter: Always Open\n"
-                        + "Clear Count: 2\n"
-                        + "Clear Mode: CLEAR PRE SEQUENCE\n"
-                        + "Compression: Uncompressed\n"
-                        + "DateTime: 20101121 16:52:52.986\n"
-                        + "Digitizer: 20 MHz\n"
-                        + "Experiment base name: ME20101116METADATA03\n"
-                        + "Experiment set: ME20101116METADATA03\n"
-                        + "Exposure: 10 ms\n"
-                        + "Frames to Average: 1\n"
-                        + "Gain: Gain 1 (1x)\n"
-                        + "ImageLength: 1040\n"
-                        + "ImageWidth: 1392\n"
-                        + "ImageXpress Micro Filter Cube: Texas Red\n"
-                        + "ImageXpress Micro Objective: 10X S Fluor\n"
-                        + "ImageXpress Micro Shutter: Closed\n"
-                        + "Laser focus score: 36.4006\n"
-                        + "MetaDataPhotometricInterpretation: Monochrome\n"
-                        + "MetaDataVersion: 1\n"
-                        + "NewSubfileType: 2\n"
-                        + "NumberOfChannels: 1\n"
-                        + "PhotometricInterpretation: BlackIsZero\n"
-                        + "Region: 1392 x 1040, offset at (0, 0)\n"
-                        + "SamplesPerPixel: 1\n"
-                        + "Shading: Off\n"
-                        + "Software: MetaSeries\n"
-                        + "Subtract: Off\n"
-                        + "Temperature: -29.95\n"
-                        + "Trigger Mode: Normal (TIMED)\n"
-                        + "X position for position #1: 73296.5\n"
-                        + "Y position for position #1: 25554.2\n"
-                        + "_IllumSetting_: Cy3\n"
-                        + "_MagNA_: 0.5\n"
-                        + "_MagRI_: 1\n"
-                        + "_MagSetting_: 10X S Fluor\n"
-                        + "acquisition-time-local: 20101121 16:52:52.986\n"
-                        + "autoscale-max-percent: 0\n"
-                        + "autoscale-min-percent: 0\n"
-                        + "autoscale-state: off\n"
-                        + "bits-per-pixel: 16\n"
-                        + "camera-binning-x: 1\n"
-                        + "camera-binning-y: 1\n"
-                        + "camera-chip-offset-x: 0\n"
-                        + "camera-chip-offset-y: 0\n"
-                        + "gamma: 1\n"
-                        + "gray-calibration-curve-fit-algorithm: 4\n"
-                        + "gray-calibration-max: -1\n"
-                        + "gray-calibration-min: -1\n"
-                        + "gray-calibration-units: \n"
-                        + "gray-calibration-values: \n"
-                        + "image-name: Cy3\n"
-                        + "look-up-table-name: Set By Wavelength\n"
-                        + "look-up-table-type: by-wavelength\n"
-                        + "modification-time-local: 20101121 16:52:53.50\n"
-                        + "number-of-planes: 1\n"
-                        + "photonegative-mode: off\n"
-                        + "pixel-size-x: 1392\n"
-                        + "pixel-size-y: 1040\n"
-                        + "plane-guid: {70EAFB69-A568-464E-9EE2-4479767F96EF}\n"
-                        + "plane-type: plane\n"
-                        + "scale-max: 1058\n"
-                        + "scale-min: 96\n"
-                        + "spatial-calibration-state: on\n"
-                        + "spatial-calibration-units: um\n"
-                        + "spatial-calibration-x: 0.645\n"
-                        + "spatial-calibration-y: 0.645\n"
-                        + "stage-label: F09 : Site 1\n"
-                        + "stage-position-x: 73296.5\n"
-                        + "stage-position-y: 25554.2\n"
-                        + "threshold-color: 4080ff\n"
-                        + "threshold-high: 65535\n"
-                        + "threshold-low: 0\n"
-                        + "threshold-state: ThresholdOff\n"
-                        + "timestamp 0: 2010-11-21T16:52:52\n"
-                        + "wavelength: 624\n" + "z-position: 11145.7\n" + "zoom-percent: 50\n",
-                output.toString());
-    }
-
     @Test
     public void testTileMapping() throws Exception
     {
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/demo.tif b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/demo.tif
deleted file mode 100644
index b8290408d1d313b80c144fa74baab7eb31eacaab..0000000000000000000000000000000000000000
Binary files a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/etl/biozentrum/demo.tif and /dev/null differ
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java
index cbba754fbb7f453825a9443fbe4aca3712a0ac48..412db84bbd1252ea129d09ea16952721f7e5268f 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java
@@ -60,7 +60,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.RequestedImageSize
 import ch.systemsx.cisd.openbis.dss.generic.shared.Constants;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
-import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
+import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProviderTestWrapper;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.authorization.DssSessionAuthorizationHolder;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.Size;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtil;
@@ -152,7 +152,7 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
     {
         DssSessionAuthorizationHolder.setAuthorizer(new DatasetSessionAuthorizer());
         final StaticListableBeanFactory applicationContext = new StaticListableBeanFactory();
-        ServiceProvider.setBeanFactory(applicationContext);
+        ServiceProviderTestWrapper.setApplicationContext(applicationContext);
         context = new Mockery();
         service = context.mock(IEncapsulatedOpenBISService.class);
         applicationContext.addBean("openBIS-service", service);
@@ -209,9 +209,10 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
         return identifier;
     }
 
-    @AfterMethod
+    @AfterMethod(alwaysRun = true)
     public final void tearDown()
     {
+        ServiceProviderTestWrapper.restoreApplicationContext();
         // The following line of code should also be called at the end of each test method.
         // Otherwise one do not known which test failed.
         context.assertIsSatisfied();