diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbstractHCSImageFileExtractor.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbstractHCSImageFileExtractor.java
index e5f4dad6741b4282b585624934bda085d188571d..06328853bad0fbbdd2b026b1aa1c134630062bf0 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbstractHCSImageFileExtractor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbstractHCSImageFileExtractor.java
@@ -44,6 +44,7 @@ import ch.systemsx.cisd.common.utilities.PropertyUtils;
 import ch.systemsx.cisd.openbis.dss.etl.HCSImageFileExtractionResult.Channel;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ChannelDescription;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ColorComponent;
 
 /**
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageFileExtractor.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageFileExtractor.java
index b21a5aa7689733bdf34bedb774ec3aa7b444c070..ce716bdc53b941172bcb5ca663365a79dd34448c 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageFileExtractor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageFileExtractor.java
@@ -27,6 +27,7 @@ import ch.systemsx.cisd.bds.hcs.Location;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
 import ch.systemsx.cisd.openbis.dss.etl.HCSImageFileExtractionResult.Channel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ChannelDescription;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ColorComponent;
 
 /**
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PlateStorageProcessor.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PlateStorageProcessor.java
index 2e2a3a66c3c4f98463ec244c20c27b35e5404102..9c3a93a387b844b125b16406af5b448c106e3f79 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PlateStorageProcessor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PlateStorageProcessor.java
@@ -67,6 +67,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ChannelDescription;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.dto.PlateDimension;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImagingQueryDAO;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dynamix/HCSImageFileExtractor.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dynamix/HCSImageFileExtractor.java
index 44e38f70787dd2b4826ddf007edc3955d6d8663c..dc74be8fb950855020812978c4956f2c5501a5fe 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dynamix/HCSImageFileExtractor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dynamix/HCSImageFileExtractor.java
@@ -36,10 +36,10 @@ import ch.systemsx.cisd.bds.hcs.Location;
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.openbis.dss.etl.AbstractHCSImageFileExtractor;
 import ch.systemsx.cisd.openbis.dss.etl.AcquiredPlateImage;
-import ch.systemsx.cisd.openbis.dss.etl.ChannelDescription;
 import ch.systemsx.cisd.openbis.dss.etl.HCSImageFileExtractionResult.Channel;
 import ch.systemsx.cisd.openbis.dss.etl.dynamix.WellLocationMappingUtils.DynamixWellPosition;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ChannelDescription;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 
 /**
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 aec92e1894a26fb5e70ff1187d4146938b89e87c..82dcb6955f897ed9d07449ce0351e9af09a28c62 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
@@ -172,8 +172,8 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements
         PlateImageParameters params = imageAccessor.getImageParameters();
         int tilesNumber = params.getTileColsNum() * params.getTileRowsNum();
         BufferedImage image = ImageUtil.loadImage(imageFile.getInputStream());
-        return new ImageDatasetMetadata(dataset, params.getChannelsCodes(), tilesNumber, image
-                .getWidth(), image.getHeight());
+        return new ImageDatasetMetadata(dataset, params.getChannelsCodes(), params
+                .getChannelsLabels(), tilesNumber, image.getWidth(), image.getHeight());
     }
 
     private static IContent getAnyImagePath(IHCSImageDatasetLoader imageAccessor,
@@ -232,7 +232,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements
         List<String> labels = getLabels(builder);
         return new FeatureVectorDataset(dataset, codes, labels, featureVectors);
     }
-    
+
     private List<String> normalize(List<String> names)
     {
         ArrayList<String> codes = new ArrayList<String>(names.size());
@@ -288,7 +288,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements
         }
         return labels;
     }
-    
+
     private FeatureVectorWithDescription createFeatureVector(FeatureTableRow featureTableRow,
             final List<String> featureCodes)
     {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java
index 38e1627fa8db0038b54115785f9259c47f1e9988..d74f46f1e0007fec7ba2bfdd2bf0dec2a3acc3d0 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java
@@ -18,17 +18,23 @@ public class ImageDatasetMetadata implements Serializable
 
     private final List<String> channelNames;
 
+    private final List<String> channelCodes;
+
+    private final List<String> channelLabels;
+
     private final int tilesNumber;
 
     private final int width;
 
     private final int height;
 
-    public ImageDatasetMetadata(IImageDatasetIdentifier dataset, List<String> channelNames,
-            int tilesNumber, int width, int height)
+    public ImageDatasetMetadata(IImageDatasetIdentifier dataset, List<String> channelCodes,
+            List<String> channelLabels, int tilesNumber, int width, int height)
     {
         this.imageDataset = dataset;
-        this.channelNames = channelNames;
+        this.channelNames = channelCodes;
+        this.channelCodes = channelCodes;
+        this.channelLabels = channelLabels;
         this.channelsNumber = channelNames.size();
         this.tilesNumber = tilesNumber;
         this.width = width;
@@ -50,13 +56,32 @@ public class ImageDatasetMetadata implements Serializable
     }
 
     /**
-     * codes of channels in which images have been acquired for the described dataset
+     * names of channels in which images have been acquired for the described dataset
      */
+    @Deprecated
     public List<String> getChannelNames()
     {
         return channelNames;
     }
 
+    /**
+     * Returns channel codes. If channel codes are unspecified channel names are returned. This will
+     * be the case if a serialized instance of a previous of this class will be deserialized.
+     */
+    public List<String> getChannelCodes()
+    {
+        return channelCodes == null ? channelNames : channelCodes;
+    }
+
+    /**
+     * Returns channel labels. If channel labels are unspecified channel names are returned. This
+     * will be the case if a serialized instance of a previous of this class will be deserialized.
+     */
+    public List<String> getChannelLabels()
+    {
+        return channelLabels == null ? channelNames : channelLabels;
+    }
+
     /**
      * number of image tiles (aka fields) into which each well is splited
      */
@@ -80,7 +105,7 @@ public class ImageDatasetMetadata implements Serializable
     @Override
     public String toString()
     {
-        return "Dataset " + imageDataset + " has [" + channelNames + "] channels, " + tilesNumber
-                + " tiles. Images resolution: " + width + "x" + height;
+        return "Dataset " + imageDataset + " has [" + getChannelCodes() + "] channels, "
+                + tilesNumber + " tiles. Images resolution: " + width + "x" + height;
     }
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ChannelDescription.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/ChannelDescription.java
similarity index 85%
rename from screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ChannelDescription.java
rename to screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/ChannelDescription.java
index 2596bee8eb14c2c063eedcb3e0341477d9ec6ea8..9775101ddaf3800b43370e2105aba3c9ce62f667 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ChannelDescription.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/ChannelDescription.java
@@ -14,12 +14,16 @@
  * limitations under the License.
  */
 
-package ch.systemsx.cisd.openbis.dss.etl;
+package ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto;
+
+import com.google.gwt.user.client.rpc.IsSerializable;
 
 /**
+ * Describes channel by code and label.
+ * 
  * @author Izabela Adamczyk
  */
-public class ChannelDescription
+public class ChannelDescription implements IsSerializable
 {
 
     private final String code;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/PlateImageParameters.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/PlateImageParameters.java
index feca4ddf712d82c7d043c99f271083456180b5c2..27ae3a545aff57ff282d21a54a835df68151880d 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/PlateImageParameters.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/basic/dto/PlateImageParameters.java
@@ -40,6 +40,8 @@ public class PlateImageParameters implements IsSerializable
 
     private List<String> channelsCodes;
 
+    private List<String> channelsLabels;
+
     // true if any well in the dataset has a time series (or depth stack) of images
     private boolean isMultidimensional;
 
@@ -118,4 +120,14 @@ public class PlateImageParameters implements IsSerializable
         this.isMultidimensional = isMultidimensional;
     }
 
+    public void setChannelsLabels(List<String> channelsLabels)
+    {
+        this.channelsLabels = channelsLabels;
+    }
+
+    public List<String> getChannelsLabels()
+    {
+        return channelsLabels;
+    }
+
 }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/HCSDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/HCSDatasetLoader.java
index 0f56582e1a16cb13afd5b751159af5913cb102ac..babbe25198037ff5f91e24c3e1b1fbae7eebae44 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/HCSDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/HCSDatasetLoader.java
@@ -17,7 +17,6 @@
 package ch.systemsx.cisd.openbis.plugin.screening.shared.imaging;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import org.apache.commons.lang.StringEscapeUtils;
@@ -26,6 +25,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.PlateImagePara
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellImageChannelStack;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImagingQueryDAO;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgChannelDTO;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgChannelStackDTO;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgContainerDTO;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgDatasetDTO;
@@ -47,7 +47,7 @@ public class HCSDatasetLoader implements IHCSDatasetLoader
 
     protected Integer channelCount;
 
-    protected List<String> channelCodes;
+    protected List<ImgChannelDTO> channels;
 
     public HCSDatasetLoader(IImagingQueryDAO query, String datasetPermId)
     {
@@ -57,10 +57,9 @@ public class HCSDatasetLoader implements IHCSDatasetLoader
         {
             throw new IllegalStateException(String.format("Dataset '%s' not found", datasetPermId));
         }
-        String[] codesAsArray =
-                query.getChannelCodesByDatasetIdOrExperimentId(getDataset().getId(), getContainer()
+        this.channels =
+                query.getChannelsByDatasetIdOrExperimentId(getDataset().getId(), getContainer()
                         .getExperimentId());
-        this.channelCodes = new ArrayList<String>(Arrays.asList(codesAsArray));
     }
 
     /** has to be called at the end */
@@ -85,7 +84,7 @@ public class HCSDatasetLoader implements IHCSDatasetLoader
 
     public int getChannelCount()
     {
-        return channelCodes.size();
+        return channels.size();
     }
 
     public List<WellImageChannelStack> listImageChannelStacks(WellLocation wellLocation)
@@ -122,12 +121,15 @@ public class HCSDatasetLoader implements IHCSDatasetLoader
         params.setTileRowsNum(getDataset().getFieldNumberOfRows());
         params.setTileColsNum(getDataset().getFieldNumberOfColumns());
         params.setIsMultidimensional(dataset.getIsMultidimensional());
-        List<String> escapedChannelCodes = new ArrayList<String>();
-        for (String name : channelCodes)
+        List<String> channelsCodes = new ArrayList<String>();
+        List<String> channelsLabels = new ArrayList<String>();
+        for (ImgChannelDTO channel : channels)
         {
-            escapedChannelCodes.add(StringEscapeUtils.escapeCsv(name));
+            channelsCodes.add(StringEscapeUtils.escapeCsv(channel.getCode()));
+            channelsLabels.add(StringEscapeUtils.escapeCsv(channel.getLabel()));
         }
-        params.setChannelsCodes(escapedChannelCodes);
+        params.setChannelsCodes(channelsCodes);
+        params.setChannelsCodes(channelsLabels);
         return params;
     }
 }
\ No newline at end of file
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/IImagingQueryDAO.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/IImagingQueryDAO.java
index be84f753092167daaea6bf574bfa94ceec833090..b58b63073029cd2f7e7a368c73fab17696ff5395 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/IImagingQueryDAO.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/IImagingQueryDAO.java
@@ -108,8 +108,9 @@ public interface IImagingQueryDAO extends TransactionQuery
     @Select("select count(*) from CHANNELS where DS_ID = ?{1} or EXP_ID = ?{2}")
     public int countChannelByDatasetIdOrExperimentId(long datasetId, long experimentId);
 
-    @Select("select code from CHANNELS where DS_ID = ?{1} or EXP_ID = ?{2} order by CODE")
-    public String[] getChannelCodesByDatasetIdOrExperimentId(long datasetId, long experimentId);
+    @Select("select * from CHANNELS where DS_ID = ?{1} or EXP_ID = ?{2} order by CODE")
+    public List<ImgChannelDTO> getChannelsByDatasetIdOrExperimentId(long datasetId,
+            long experimentId);
 
     @Select(sql = "select id from CHANNELS where DS_ID = ?{1} or EXP_ID = ?{2} order by LABEL", fetchSize = FETCH_SIZE)
     public long[] getChannelIdsByDatasetIdOrExperimentId(long datasetId, long experimentId);
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java
index 542941acfc4d40ecab2d3da849a0b981ecd561a5..9132401f6fedde16021ac277052aad96072eda72 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java
@@ -205,9 +205,9 @@ public class ScreeningOpenbisServiceFacadeTest extends AssertJUnit
         final String geneCode = "MYGENE";
         final MaterialIdentifier materialIdentifier =
                 new MaterialIdentifier(MaterialTypeIdentifier.GENE, geneCode);
-        final PlateWellReferenceWithDatasets pwRef = new PlateWellReferenceWithDatasets(new Plate(
-                null, null, null, ExperimentIdentifier.createFromPermId(null)),
-                new WellPosition(1, 2));
+        final PlateWellReferenceWithDatasets pwRef =
+                new PlateWellReferenceWithDatasets(new Plate(null, null, null, ExperimentIdentifier
+                        .createFromPermId(null)), new WellPosition(1, 2));
         context.checking(new Expectations()
             {
                 {
@@ -216,7 +216,8 @@ public class ScreeningOpenbisServiceFacadeTest extends AssertJUnit
                 }
             });
 
-        final List<PlateWellReferenceWithDatasets> ref = facade.listPlateWells(materialIdentifier, false);
+        final List<PlateWellReferenceWithDatasets> ref =
+                facade.listPlateWells(materialIdentifier, false);
         assertEquals(1, ref.size());
         assertEquals(pwRef, ref.get(0));
 
@@ -265,10 +266,14 @@ public class ScreeningOpenbisServiceFacadeTest extends AssertJUnit
     @Test
     public void testListImageMetaData()
     {
-        List<String> channelNames = Arrays.asList("channel1");
-        final ImageDatasetMetadata m1 = new ImageDatasetMetadata(i1id, channelNames, 1, 1, 1);
-        final ImageDatasetMetadata m2 = new ImageDatasetMetadata(i1id, channelNames, 1, 1, 1);
-        final ImageDatasetMetadata m3 = new ImageDatasetMetadata(i2id, channelNames, 1, 1, 1);
+        List<String> channelCodes = Arrays.asList("channel1");
+        List<String> channelLabels = Arrays.asList("Channel 1");
+        final ImageDatasetMetadata m1 =
+                new ImageDatasetMetadata(i1id, channelCodes, channelLabels, 1, 1, 1);
+        final ImageDatasetMetadata m2 =
+                new ImageDatasetMetadata(i1id, channelCodes, channelLabels, 1, 1, 1);
+        final ImageDatasetMetadata m3 =
+                new ImageDatasetMetadata(i2id, channelCodes, channelLabels, 1, 1, 1);
         context.checking(new Expectations()
             {
                 {
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/ImagingQueryDAOTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/ImagingQueryDAOTest.java
index e542bb1943db64c28bd6d8c91bc4dd7af35f478d..7ca89ea5696ee4afa1d278d1e34284f3ea5f50f4 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/ImagingQueryDAOTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/shared/imaging/dataaccess/ImagingQueryDAOTest.java
@@ -163,10 +163,12 @@ public class ImagingQueryDAOTest extends AbstractDBTest
     {
         // test countChannelByDatasetIdOrExperimentId
         assertEquals(2, dao.countChannelByDatasetIdOrExperimentId(datasetId, experimentId));
-        String[] channelNames =
-                dao.getChannelCodesByDatasetIdOrExperimentId(datasetId, experimentId);
-        assertEquals("DSCHANNEL", channelNames[0]);
-        assertEquals("EXPCHANNEL", channelNames[1]);
+        List<ImgChannelDTO> channelDTOS =
+                dao.getChannelsByDatasetIdOrExperimentId(datasetId, experimentId);
+        assertEquals("DSCHANNEL", channelDTOS.get(0).getCode());
+        assertEquals(CHANNEL_LABEL, channelDTOS.get(0).getLabel());
+        assertEquals("EXPCHANNEL", channelDTOS.get(1).getCode());
+        assertEquals(CHANNEL_LABEL, channelDTOS.get(1).getLabel());
 
         // test getChannelIdsByDatasetIdOrExperimentId
         long[] channels = dao.getChannelIdsByDatasetIdOrExperimentId(datasetId, experimentId);