diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/AbstractCompositeSearchCriteriaTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/AbstractCompositeSearchCriteriaTranslator.java
index 5219d8fca325c3cd76ef23a5ab724840860110d3..013a9c92d0633c3eed13de2985dae581400bba78 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/AbstractCompositeSearchCriteriaTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/AbstractCompositeSearchCriteriaTranslator.java
@@ -73,6 +73,9 @@ public abstract class AbstractCompositeSearchCriteriaTranslator extends Abstract
                 continue;
             } else
             {
+                for (DetailedSearchCriteria additionalCriteria: translationResult.getCriteriaList()) {
+                    detailedCriterionList.addAll(additionalCriteria.getCriteria());
+                }
                 detailedCriterionList.addAll(translationResult.getCriterionList());
                 detailedSubCriteriaList.addAll(translationResult.getSubCriteriaList());
             }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/SampleSearchCriteriaTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/SampleSearchCriteriaTranslator.java
index 06ee207a1ed10950051b40c8cfb15df2b4559036..b1af693ab96bab3a8d22a1ec8513ad3f12aad553 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/SampleSearchCriteriaTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/search/SampleSearchCriteriaTranslator.java
@@ -16,17 +16,25 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.search;
 
+import java.util.Collections;
+
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.ISearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.NoSampleContainerSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.NoSampleSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.OnlyListableSeachCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleChildrenSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleContainerSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleParentsSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AssociatedEntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchSubCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SimpleAttributeSearchFieldKind;
+import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 
 /**
  * @author pkupczyk
@@ -42,7 +50,9 @@ public class SampleSearchCriteriaTranslator extends AbstractCompositeSearchCrite
     @Override
     protected boolean doAccepts(ISearchCriteria criteria)
     {
-        return criteria instanceof SampleSearchCriteria || criteria instanceof NoSampleSearchCriteria;
+        return criteria instanceof SampleSearchCriteria
+                || criteria instanceof NoSampleSearchCriteria
+                || criteria instanceof OnlyListableSeachCriteria;
     }
 
     @Override
@@ -61,6 +71,13 @@ public class SampleSearchCriteriaTranslator extends AbstractCompositeSearchCrite
             }
 
             return new SearchCriteriaTranslationResult(new DetailedSearchSubCriteria(entityKind, null));
+        } else if (criteria instanceof OnlyListableSeachCriteria)
+        {
+            SimpleAttributeSearchFieldKind attributeFieldKind = new SimpleAttributeSearchFieldKind(SearchFieldConstants.PREFIX_ENTITY_TYPE + SearchFieldConstants.IS_LISTABLE, "listable");
+            DetailedSearchField createAttributeField = DetailedSearchField.createAttributeField(attributeFieldKind);
+            DetailedSearchCriterion criterion = new DetailedSearchCriterion(createAttributeField, "true");
+            
+            return new SearchCriteriaTranslationResult(criterion);
         } else
         {
             context.pushEntityKind(EntityKind.SAMPLE);
@@ -85,8 +102,7 @@ public class SampleSearchCriteriaTranslator extends AbstractCompositeSearchCrite
             } else if (criteria instanceof SampleSearchCriteria)
             {
                 entityKind = AssociatedEntityKind.SAMPLE;
-            } else
-            {
+            } else {
                 throw new IllegalArgumentException("Unknown criteria: " + criteria);
             }
             DetailedSearchSubCriteria subCriteria = new DetailedSearchSubCriteria(entityKind, translationResult.getCriteria());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java
index bcbe50d40e358d1976d40d94828635f7c9ea6a33..67bc22581a494c5bf801973d397146e27a397220 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleTypePE.java
@@ -35,9 +35,14 @@ import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 
 import org.apache.commons.lang.builder.ToStringBuilder;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Store;
 import org.hibernate.validator.constraints.Length;
 
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
+import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
@@ -50,6 +55,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 @Table(name = TableNames.SAMPLE_TYPES_TABLE, uniqueConstraints =
 { @UniqueConstraint(columnNames =
 { ColumnNames.CODE_COLUMN }) })
+@Indexed(index = "SampleTypePE")
 public final class SampleTypePE extends EntityTypePE
 {
     private static final long serialVersionUID = IServer.VERSION;
@@ -117,6 +123,7 @@ public final class SampleTypePE extends EntityTypePE
     }
 
     @Column(name = ColumnNames.IS_LISTABLE)
+    @Field(index = Index.YES, store = Store.YES, name = SearchFieldConstants.IS_LISTABLE)
     public Boolean isListable()
     {
         return listable;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java
index 331ab685daec6607f9c6a533243ae08118220c05..b1c5d38a57d87f0d3eb54664e2f25ba3d237e880 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/hibernate/SearchFieldConstants.java
@@ -102,4 +102,6 @@ public final class SearchFieldConstants
     public static final String MODIFICATION_DATE = "modification_date";
 
     public static final String ACCESS_DATE = "access_date";
+
+    public static final String IS_LISTABLE = "is_listable";
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/OnlyListableSeachCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/OnlyListableSeachCriteria.js
new file mode 100644
index 0000000000000000000000000000000000000000..bce2d8624914cddf47988ddd741eb215887649a1
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/OnlyListableSeachCriteria.js
@@ -0,0 +1,12 @@
+/**
+ * @author pkupczyk
+ */
+define([ "stjs", "as/dto/sample/search/AbstractCompositeSearchCriteria" ], function(stjs, AbstractCompositeSearchCriteria) {
+	var OnlyListableSeachCriteria = function() {
+	};
+	stjs.extend(AbstractCompositeSearchCriteria, OnlyListableSeachCriteria, [ OnlyListableSeachCriteria ], function(constructor, prototype) {
+		prototype['@type'] = 'as.dto.sample.search.OnlyListableSeachCriteria';
+		constructor.serialVersionUID = 1;
+	}, {});
+	return OnlyListableSeachCriteria;
+})
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/SampleSearchCriteria.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/SampleSearchCriteria.js
index 62fcd50caf5b45ab7341cd2b7b7c69a8c530f89c..13d609c3518ffcdd929c91a29c3fe68a9750decf 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/SampleSearchCriteria.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/resources/api/v3/as/dto/sample/search/SampleSearchCriteria.js
@@ -3,7 +3,7 @@
  */
 define([ "require", "stjs", "as/dto/common/search/AbstractEntitySearchCriteria", "as/dto/common/search/SearchOperator", "as/dto/sample/search/SampleSearchRelation", "as/dto/space/search/SpaceSearchCriteria",
 		"as/dto/experiment/search/ExperimentSearchCriteria", "as/dto/experiment/search/NoExperimentSearchCriteria",
-		"as/dto/sample/search/NoSampleContainerSearchCriteria" ], function(require, stjs, AbstractEntitySearchCriteria, SearchOperator, SampleSearchRelation) {
+		"as/dto/sample/search/NoSampleContainerSearchCriteria", "as/dto/sample/search/OnlyListableSeachCriteria" ], function(require, stjs, AbstractEntitySearchCriteria, SearchOperator, SampleSearchRelation) {
 
 	var SampleSearchCriteria = function(relation) {
 		AbstractEntitySearchCriteria.call(this);
@@ -38,6 +38,10 @@ define([ "require", "stjs", "as/dto/common/search/AbstractEntitySearchCriteria",
 			var NoSampleContainerSearchCriteria = require("as/dto/sample/search/NoSampleContainerSearchCriteria");
 			return this.addCriteria(new NoSampleContainerSearchCriteria());
 		};
+		prototype.withListableOnly = function() {
+			var OnlyListableSeachCriteria = require("as/dto/sample/search/OnlyListableSeachCriteria");
+			return this.addCriteria(new OnlyListableSeachCriteria());
+		};
 		prototype.withOrOperator = function() {
 			return this.withOperator(SearchOperator.OR);
 		};
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java
index f924f14a5a23e3c73bf5aa2e2be4d35d4ec15b3f..507007ac1a7a7ef850eace8e5401ce97a9b5924f 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchSampleTest.java
@@ -967,6 +967,56 @@ public class SearchSampleTest extends AbstractSampleTest
         v3api.logout(sessionToken);
     }
 
+    final String LISTED_ID = "/CISD/C1";
+    final String UNLISTED_ID = "/CISD/CL1:A01";
+
+    @Test
+    public void testSearchListableOnlyShouldNotFindUnlisted()
+    {
+
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SampleFetchOptions fo = new SampleFetchOptions();
+
+        SampleSearchCriteria criteria = new SampleSearchCriteria();
+        criteria.withId().thatEquals(new SampleIdentifier(UNLISTED_ID));
+        
+        
+        List<Sample> samples = search(sessionToken, criteria, fo);
+        
+        assertEquals(samples.size(), 1);
+        
+        assertSampleIdentifiersInOrder(samples, UNLISTED_ID);
+
+        criteria.withListableOnly();
+        samples = search(sessionToken, criteria, fo);
+        assertEquals(samples.size(), 0);
+    }
+
+    @Test
+    public void testSearchListableOnlyShouldFindListed()
+    {
+
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        SampleFetchOptions fo = new SampleFetchOptions();
+        fo.withType();
+        fo.withProperties();
+
+        SampleSearchCriteria criteria = new SampleSearchCriteria();
+        criteria.withId().thatEquals(new SampleIdentifier(LISTED_ID));
+
+        List<Sample> samples = search(sessionToken, criteria, fo);
+        
+        assertEquals(samples.size(), 1);
+        
+        assertEquals(samples.get(0).getIdentifier().getIdentifier(), LISTED_ID);
+
+        criteria.withListableOnly();
+        samples = search(sessionToken, criteria, fo);
+        assertEquals(samples.size(), 1);
+
+        assertEquals(samples.get(0).getIdentifier().getIdentifier(), LISTED_ID);
+    }
+
     private void testSearch(String user, SampleSearchCriteria criteria, String... expectedIdentifiers)
     {
         String sessionToken = v3api.login(user, PASSWORD);