diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageDatasetLoaderFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageDatasetLoaderFactory.java
index 33e1a0d7624bfe9779ad0144fdaf6034cfd22ad3..ca719c975129b06163f8c384ccf1ae8470c400a0 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageDatasetLoaderFactory.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageDatasetLoaderFactory.java
@@ -39,6 +39,7 @@ public class HCSImageDatasetLoaderFactory
         return factories;
     }
 
+    /** the loader has to be closed when it is not used any more to free database resources! */
     public static final IHCSImageDatasetLoader create(File datasetRootDir, String datasetCode)
     {
         return createImageDBLoader(datasetRootDir, datasetCode);
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java
index 41330166b7f07a28f3882895467332ca01b1e303..9cff9157c5c85e6ed6297a5665de6b33c69197c4 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java
@@ -162,6 +162,12 @@ public class TabularDataGraphServlet extends AbstractTabularDataGraphServlet
         return imagingDbDao;
     }
 
+    @Override
+    protected void finalize()
+    {
+        DssScreeningUtils.closeQuietly(imagingDbDao);
+    }
+
     private IEncapsulatedOpenBISService getService()
     {
         synchronized (this)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java
index e23282d2e1b8ba738177f1fc18fe4b4542c1d41f..2f9d7a6a1fa8476ecda60e64a43163f6336c0338 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java
@@ -52,28 +52,32 @@ public class ImageChannelsUtils
     {
         IHCSImageDatasetLoader imageAccessor =
                 HCSImageDatasetLoaderFactory.create(datasetRoot, datasetCode);
-        List<AbsoluteImageReference> images = new ArrayList<AbsoluteImageReference>();
-
-        Size thumbnailSizeOrNull = params.tryGetThumbnailSize();
-        if (params.isMergeAllChannels())
+        try
         {
-            for (String chosenChannel : imageAccessor.getImageParameters().getChannelsCodes())
+            List<AbsoluteImageReference> images = new ArrayList<AbsoluteImageReference>();
+
+            Size thumbnailSizeOrNull = params.tryGetThumbnailSize();
+            if (params.isMergeAllChannels())
+            {
+                for (String chosenChannel : imageAccessor.getImageParameters().getChannelsCodes())
+                {
+                    AbsoluteImageReference image =
+                            getImage(imageAccessor, params.getChannelStack(), chosenChannel,
+                                    thumbnailSizeOrNull);
+                    images.add(image);
+                }
+            } else
             {
                 AbsoluteImageReference image =
-                        getImage(imageAccessor, params.getChannelStack(), chosenChannel,
+                        getImage(imageAccessor, params.getChannelStack(), params.getChannel(),
                                 thumbnailSizeOrNull);
                 images.add(image);
             }
-        } else
+            return images;
+        } finally
         {
-            AbsoluteImageReference image =
-                    getImage(imageAccessor, params.getChannelStack(), params.getChannel(),
-                            thumbnailSizeOrNull);
-            images.add(image);
+            imageAccessor.close();
         }
-        imageAccessor.close();
-
-        return images;
     }
 
     /**
@@ -251,8 +255,8 @@ public class ImageChannelsUtils
             Size thumbnailSizeOrNull)
     {
         AbsoluteImageReference image =
-                imageAccessor
-                        .tryGetImage(chosenChannelCode, channelStackReference, thumbnailSizeOrNull);
+                imageAccessor.tryGetImage(chosenChannelCode, channelStackReference,
+                        thumbnailSizeOrNull);
         if (image != null)
         {
             return image;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java
index cb9dc5c0e3de0087d6b01a3fac5acba3d7ff2725..07030a7805832ab8ee1629d948ba617cf82baf3a 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java
@@ -123,13 +123,22 @@ public class ImageAnalysisMergedRowsReportingPlugin extends AbstractDatastorePlu
 
     private IImagingQueryDAO getDAO()
     {
-        if (dao == null)
+        synchronized (this)
         {
-            dao = DssScreeningUtils.createQuery();
+            if (dao == null)
+            {
+                dao = DssScreeningUtils.createQuery();
+            }
         }
         return dao;
     }
 
+    @Override
+    protected void finalize()
+    {
+        DssScreeningUtils.closeQuietly(dao);
+    }
+
     private IEncapsulatedOpenBISService getService()
     {
         if (service == null)
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 df09fe0eb62a55113564d52d1c75df039679e42c..774415062c0f593c47fd89c22a14f5eadc02c48f 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
@@ -81,6 +81,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements
      */
     public static final int MINOR_VERSION = 2;
 
+    // this dao will hold one connection to the database
     private IImagingQueryDAO dao;
 
     public DssServiceRpcScreening(String storeRootDir)
@@ -168,13 +169,18 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements
     {
         IHCSImageDatasetLoader imageAccessor =
                 HCSImageDatasetLoaderFactory.create(datasetRoot, dataset.getDatasetCode());
-        IContent imageFile = getAnyImagePath(imageAccessor, dataset);
-        PlateImageParameters params = imageAccessor.getImageParameters();
-        imageAccessor.close();
-        int tilesNumber = params.getTileColsNum() * params.getTileRowsNum();
-        BufferedImage image = ImageUtil.loadImage(imageFile.getInputStream());
-        return new ImageDatasetMetadata(dataset, params.getChannelsCodes(), params
-                .getChannelsLabels(), tilesNumber, image.getWidth(), image.getHeight());
+        try
+        {
+            IContent imageFile = getAnyImagePath(imageAccessor, dataset);
+            PlateImageParameters params = imageAccessor.getImageParameters();
+            int tilesNumber = params.getTileColsNum() * params.getTileRowsNum();
+            BufferedImage image = ImageUtil.loadImage(imageFile.getInputStream());
+            return new ImageDatasetMetadata(dataset, params.getChannelsCodes(), params
+                    .getChannelsLabels(), tilesNumber, image.getWidth(), image.getHeight());
+        } finally
+        {
+            imageAccessor.close();
+        }
     }
 
     private static IContent getAnyImagePath(IHCSImageDatasetLoader imageAccessor,
@@ -468,13 +474,22 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements
 
     private IImagingQueryDAO getDAO()
     {
-        if (dao == null)
+        synchronized (this)
         {
-            dao = DssScreeningUtils.createQuery();
+            if (dao == null)
+            {
+                dao = DssScreeningUtils.createQuery();
+            }
         }
         return dao;
     }
 
+    @Override
+    protected void finalize()
+    {
+        DssScreeningUtils.closeQuietly(dao);
+    }
+
     public int getMajorVersion()
     {
         return MAJOR_VERSION;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/shared/DssScreeningUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/shared/DssScreeningUtils.java
index bfdd0ed0fc561f37f8ab0a832332891343a06ae1..16790a0860e352da4d3643ed546bdf198632358a 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/shared/DssScreeningUtils.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/shared/DssScreeningUtils.java
@@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImag
 
 /**
  * Utility methods for DSS.
- *
+ * 
  * @author Franz-Josef Elmer
  */
 public class DssScreeningUtils
@@ -34,6 +34,10 @@ public class DssScreeningUtils
     /**
      * Creates a DAO based on imaging database specified in DSS service.properties by data source
      * {@link ScreeningConstants#IMAGING_DATA_SOURCE}.
+     * <p>
+     * Query has to be closed as soon as it is not used, otherwise we will run out of available
+     * connections quickly!
+     * </p>
      */
     public static IImagingQueryDAO createQuery()
     {
@@ -43,4 +47,18 @@ public class DssScreeningUtils
         return QueryTool.getQuery(dataSource, IImagingQueryDAO.class);
     }
 
+    /** Closes the query if it is not null, ignores the exceptions */
+    public static void closeQuietly(IImagingQueryDAO queryOrNull)
+    {
+        if (queryOrNull != null)
+        {
+            try
+            {
+                queryOrNull.close();
+            } catch (RuntimeException ex)
+            {
+            }
+        }
+    }
+
 }