diff --git a/screening/build/build.xml b/screening/build/build.xml
index d99f44c6b45abd98c1de4a11c2cb5209f79313bc..d61b7ccc0a05cf7991484577458608861ab3246f 100644
--- a/screening/build/build.xml
+++ b/screening/build/build.xml
@@ -8,12 +8,13 @@
   <property name="variant" value="-screening" />
 
   <property name="dist.screening-api" value="${dist}/screening_api" />
-  <property name="dist.screening-api.lib" value="${dist.screening-api}/lib" />
+  <property name="dist.screening-api.lib" value="${dist.screening-api}" />
   <property name="dist.screening-api.jar" value="${dist.screening-api.lib}/openbis_screening_api.jar" />
 	<property name="dist.screening-api.javadoc" value="${dist.screening-api}/doc" />
 
 	<property name="classes.screening" value="../screening/targets/www/WEB-INF/classes" />
 	<property name="classes.common-server" value="../server-common/targets/ant/classes" />
+  <property name="classes.common" value="../common/targets/ant/classes" />
 		
   <target name="compile" depends="build-common.compile, clean" />
 
@@ -122,6 +123,7 @@
       </fileset>
     	<manifest>
       	<attribute name="Main-Class" value="ch.systemsx.cisd.openbis.plugin.screening.client.api.v1.ScreeningClientApiTest" />
+        <attribute name="Class-Path" value="spring-ext.jar" />
         <attribute name="Version" value="${version.number}" />
         <attribute name="Build-Number"
                    value="${version.number} (r${revision.number},${clean.flag})" />
@@ -129,15 +131,20 @@
     </recursive-jar>
   	<jar update="true" destfile="${dist.screening-api.jar}">
   		<fileset dir="${classes.common-server}">
-  		     	<include name="ch/systemsx/cisd/common/spring/*.class" />
+  		     	<include name="ch/systemsx/cisd/common/spring/HttpInvokerUtils.class" />
   		</fileset> 
+      <fileset dir="${classes.common}">
+            <include name="ch/systemsx/cisd/common/exceptions/**/*.class" />
+      </fileset> 
+    </jar>
+    <recursive-jar destfile="${dist.screening-api.lib}/spring-ext.jar">
       <zipfileset src="${lib}/spring/spring.jar" />
       <zipfileset src="${lib}/spring/third-party/stream-supporting-httpinvoker.jar" />
       <zipfileset src="${lib}/commons-logging/commons-logging.jar" />
       <zipfileset src="${lib}/commons-httpclient/commons-httpclient.jar" />
       <zipfileset src="${lib}/commons-codec/commons-codec.jar" />
       <zipfileset src="${lib}/log4j/log4j.jar" />     
-  	</jar>
+  	</recursive-jar>
   </target>
 	
 	<target name="screening-api" depends="screening-api-doc, screening-api-libs" />
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTest.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTest.java
index 281a9da24fa91d604ca36a553035156f6a2476b5..86d16dbaae4b98e62ff74d1c62efdf826d35be8e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTest.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningClientApiTest.java
@@ -27,8 +27,10 @@ import java.util.List;
 
 import org.apache.log4j.lf5.util.StreamUtils;
 
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDataset;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.IDatasetIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ImageDatasetMetadata;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ImageDatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.Plate;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.PlateImageReference;
@@ -68,11 +70,20 @@ public class ScreeningClientApiTest
         System.out.println("Feature vector datasets: " + featureVectorDatasets);
 
         // test for feature vector dataset
-        // String datasetCode = "20091214153212961-474922"; // feature vector
-        String datasetCode = "20091216162628729-475111"; // image
-        IDatasetIdentifier datasetIdentifier = getDatasetIdentifier(facade, datasetCode);
+        // String featureVectorDatasetCode = "20100423170945059-29"; // feature vector
+        String imageDatasetCode = "20100423163638457-16"; // image
+        IDatasetIdentifier datasetIdentifier = getDatasetIdentifier(facade, imageDatasetCode);
         loadImages(facade, datasetIdentifier);
 
+        List<String> featureNames = facade.listAvailableFeatureNames(featureVectorDatasets);
+        System.out.println("Feature names: " + featureNames);
+        List<FeatureVectorDataset> features =
+                facade.loadFeatures(featureVectorDatasets, featureNames);
+        System.out.println("Features: " + features);
+
+        List<ImageDatasetMetadata> imageMetadata = facade.listImageMetadata(imageDatasets);
+        System.out.println("Image metadata: " + imageMetadata);
+        
         facade.logout();
     }
 
@@ -87,17 +98,20 @@ public class ScreeningClientApiTest
     private static void loadImages(ScreeningOpenbisServiceFacade facade,
             IDatasetIdentifier datasetIdentifier) throws FileNotFoundException, IOException
     {
-        for (int channel = 1; channel <= 2; channel++)
+        for (int well = 1; well <= 5; well++)
         {
-            for (int tile = 4; tile <= 6; tile++)
+            for (int channel = 1; channel <= 2; channel++)
             {
-                List<PlateImageReference> imageRefs = new ArrayList<PlateImageReference>();
-                imageRefs.add(new PlateImageReference(1, 3, tile, channel, datasetIdentifier));
-                List<PlateSingleImage> images = facade.loadImages(imageRefs);
-                saveImages(images);
+                for (int tile = 1; tile <= 1; tile++)
+                {
+                    List<PlateImageReference> imageRefs = new ArrayList<PlateImageReference>();
+                    imageRefs.add(new PlateImageReference(well, well, tile, channel,
+                            datasetIdentifier));
+                    List<PlateSingleImage> images = facade.loadImages(imageRefs);
+                    saveImages(images);
+                }
             }
         }
-
     }
 
     private static void saveImages(List<PlateSingleImage> images) throws FileNotFoundException,
@@ -116,7 +130,7 @@ public class ScreeningClientApiTest
     private static String createImageFileName(PlateSingleImage image)
     {
         WellPosition well = image.getWellPosition();
-        return "img_r" + well.getWellRow() + "_c" + well.getWellColumn() + "_ch"
-                + image.getChannel() + "_t" + image.getTile() + ".png";
+        return "img_row" + well.getWellRow() + "_col" + well.getWellColumn() + "_channel"
+                + image.getChannel() + "_tile" + image.getTile() + ".png";
     }
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
index 61464bbbc2b194a60a14dda2880ffbdf2b6595d0..3773bbe592a2206f0514c0dd1208937e28dc0bfe 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
@@ -190,83 +190,40 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     public List<FeatureVectorDatasetReference> listFeatureVectorDatasets(String sessionToken,
             List<? extends PlateIdentifier> plates)
     {
-        try
-        {
-            return createScreeningApiImpl(sessionToken).listFeatureVectorDatasets(plates);
-        } catch (UserFailureException e)
-        {
-            throw translateException(e);
-        }
+        return createScreeningApiImpl(sessionToken).listFeatureVectorDatasets(plates);
     }
 
     public List<ImageDatasetReference> listImageDatasets(String sessionToken,
             List<? extends PlateIdentifier> plates)
     {
-        try
-        {
-            return createScreeningApiImpl(sessionToken).listImageDatasets(plates);
-        } catch (UserFailureException e)
-        {
-            throw translateException(e);
-        }
+        return createScreeningApiImpl(sessionToken).listImageDatasets(plates);
     }
 
     public List<Plate> listPlates(String sessionToken)
     {
-        try
-        {
-            return createScreeningApiImpl(sessionToken).listPlates();
-        } catch (UserFailureException e)
-        {
-            throw translateException(e);
-        }
+        return createScreeningApiImpl(sessionToken).listPlates();
     }
 
     public List<IDatasetIdentifier> getDatasetIdentifiers(String sessionToken,
             List<String> datasetCodes)
     {
-        try
-        {
-            return createScreeningApiImpl(sessionToken).getDatasetIdentifiers(datasetCodes);
-        } catch (UserFailureException e)
-        {
-            throw translateException(e);
-        }
+        return createScreeningApiImpl(sessionToken).getDatasetIdentifiers(datasetCodes);
     }
 
     private ScreeningApiImpl createScreeningApiImpl(String sessionToken)
     {
-        try
-        {
-            final Session session = getSession(sessionToken);
-            return new ScreeningApiImpl(session, businessObjectFactory, getDAOFactory());
-        } catch (UserFailureException e)
-        {
-            throw translateException(e);
-        }
+        final Session session = getSession(sessionToken);
+        return new ScreeningApiImpl(session, businessObjectFactory, getDAOFactory());
     }
 
     public void logoutScreening(String sessionToken)
     {
-        try
-        {
-            logout(sessionToken);
-        } catch (UserFailureException e)
-        {
-            throw translateException(e);
-        }
+        logout(sessionToken);
     }
 
     public String tryLoginScreening(String userId, String userPassword)
     {
-        SessionContextDTO sessionContext;
-        try
-        {
-            sessionContext = tryToAuthenticate(userId, userPassword);
-        } catch (UserFailureException e)
-        {
-            throw translateException(e);
-        }
+        SessionContextDTO sessionContext = tryToAuthenticate(userId, userPassword);
         if (sessionContext != null)
         {
             return sessionContext.getSessionToken();
@@ -275,10 +232,4 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
             return null;
         }
     }
-
-    private static RuntimeException translateException(UserFailureException e)
-    {
-        return new IllegalArgumentException(e.getMessage());
-    }
-
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/IScreeningApiServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/IScreeningApiServer.java
index 9635f8cbe00ad7e4158d9bdffc18d359f931bc3a..087878928be0d9a222de3d67ff6a729ed4b2473f 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/IScreeningApiServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/IScreeningApiServer.java
@@ -46,7 +46,8 @@ public interface IScreeningApiServer
      * 
      *@return sessionToken if authentication suceeded, null otherwise
      */
-    @Transactional(readOnly = true)
+    @Transactional
+    // this is not a readOnly transaction - it can create new users
     String tryLoginScreening(String userId, String userPassword) throws IllegalArgumentException;
 
     /**