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 5ad527f2ec7c01a74a48b901f36ce2bf8e642e51..64a1538ef27d20947e0079bd256efb372d947b5a 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
@@ -622,31 +622,36 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
         for (FeatureTableRow featureTableRow : datasetFeatures.getFeatures())
         {
             WellLocation wellPosition = featureTableRow.getWellLocation();
-            double[] values = getFloatFeaturesAsDouble(featureTableRow);
-            featureVectors.add(new FeatureVector(convert(wellPosition), values));
+            featureVectors.add(getFeatureVector(convert(wellPosition), featureTableRow));
         }
         return new FeatureVectorDataset(dataset, datasetFeatures.getFeatureCodes(),
                 datasetFeatures.getFeatureLabels(), featureVectors);
     }
 
-    // TODO 2010-11-29, Tomasz Pylak: allow to access Vocabulary Features in the API
-    private static double[] getFloatFeaturesAsDouble(FeatureTableRow featureTableRow)
+    private static FeatureVector getFeatureVector(WellPosition position, FeatureTableRow featureTableRow)
     {
         FeatureValue[] featureValues = featureTableRow.getFeatureValues();
         double[] doubleValues = new double[featureValues.length];
+        String[] vocabularyTerms = new String[featureValues.length];
+        boolean[] vocabularyFeatureFlags = new boolean[featureValues.length];
+
         for (int i = 0; i < featureValues.length; ++i)
         {
             FeatureValue featureValue = featureValues[i];
             if (featureValue.isFloat())
             {
                 doubleValues[i] = featureValue.asFloat();
-            } else
+            } else if (featureValue.isVocabularyTerm())
             {
-                // convert a vocabulary term to NaN
+                vocabularyFeatureFlags[i] = true;
+                vocabularyTerms[i] = featureValue.tryAsVocabularyTerm();
                 doubleValues[i] = Double.NaN;
+            } else
+            {
+                throw new IllegalStateException("Feature can be only either a float or a vocabulary term");
             }
         }
-        return doubleValues;
+        return new FeatureVector(position, doubleValues, vocabularyFeatureFlags, vocabularyTerms);
     }
 
     private static WellPosition convert(WellLocation wellPosition)
@@ -694,8 +699,9 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
     private FeatureVectorWithDescription createFeatureVector(FeatureTableRow featureTableRow,
             final List<String> featureCodes)
     {
+        FeatureVector feature = getFeatureVector(featureTableRow.getReference().getWellPosition(), featureTableRow);
         return new FeatureVectorWithDescription(featureTableRow.getReference(), featureCodes,
-                getFloatFeaturesAsDouble(featureTableRow));
+                feature.getValues());
     }
 
     @Override
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVectorWithDescription.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVectorWithDescription.java
index 37db156288bdc1791aef6b13337091d25146584d..49f4e7eca025b6703f44793776a8d143a61bb805 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVectorWithDescription.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/FeatureVectorWithDescription.java
@@ -32,6 +32,14 @@ public class FeatureVectorWithDescription extends FeatureVector implements IFeat
         this.featureNames = featureNames;
     }
 
+    public FeatureVectorWithDescription(FeatureVectorDatasetWellReference dataset,
+            List<String> featureNames, double[] values, boolean[] vocabularyFeatureFlags, String[] vocabularyTerms)
+    {
+        super(dataset.getWellPosition(), values, vocabularyFeatureFlags, vocabularyTerms);
+        this.datasetWellReference = dataset;
+        this.featureNames = featureNames;
+    }
+
     /**
      * Identifier of the dataset and well of this feature vector.
      */