Index: metaobj-impl/api-impl/src/java/org/sakaiproject/metaobj/shared/mgt/impl/StructuredArtifactFinder.java
===================================================================
--- metaobj-impl/api-impl/src/java/org/sakaiproject/metaobj/shared/mgt/impl/StructuredArtifactFinder.java	(revision 51362)
+++ metaobj-impl/api-impl/src/java/org/sakaiproject/metaobj/shared/mgt/impl/StructuredArtifactFinder.java	(working copy)
@@ -65,7 +65,7 @@
 
    public Collection findByType(String type) {
 	   ArrayList<Artifact> artifacts = new ArrayList<Artifact>();
-	   for (ContentResource resource : findArtifacts(type))
+	   for (ContentResource resource : findArtifacts(type, null))
 		   artifacts.add(createArtifact(resource));
 	   return artifacts;
    }
Index: metaobj-impl/api-impl/src/java/org/sakaiproject/metaobj/shared/mgt/impl/MetaobjFormFilter.java
===================================================================
--- metaobj-impl/api-impl/src/java/org/sakaiproject/metaobj/shared/mgt/impl/MetaobjFormFilter.java	(revision 0)
+++ metaobj-impl/api-impl/src/java/org/sakaiproject/metaobj/shared/mgt/impl/MetaobjFormFilter.java	(revision 0)
@@ -0,0 +1,83 @@
+package org.sakaiproject.metaobj.shared.mgt.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.sakaiproject.content.api.ContentResource;
+import org.sakaiproject.content.api.ContentResourceFilter;
+import org.sakaiproject.content.api.ResourceToolAction;
+import org.sakaiproject.entity.api.ResourceProperties;
+
+public class MetaobjFormFilter implements ContentResourceFilter {
+	private String targetType = null;
+	private Set<String> collectionIds = null;
+	
+	private static Log log = LogFactory.getLog(MetaobjFormFilter.class);
+
+	public MetaobjFormFilter() {
+		// Nothing
+	}
+
+	public MetaobjFormFilter(String targetType) {
+		this.targetType = targetType;
+	}
+
+	public MetaobjFormFilter(Set<String> collectionIds) {
+		this.collectionIds = collectionIds;
+	}
+
+	public MetaobjFormFilter(String targetType, Set<String> collectionIds) {
+		this.targetType = targetType;
+		this.collectionIds = collectionIds;
+	}
+
+	public String getTargetType() {
+		return this.targetType;
+	}
+
+	public void setTargetType(String targetType) {
+		this.targetType = targetType;
+	}
+
+	public Set<String> getCollectionIds() {
+		return collectionIds;
+	}
+
+	public void setCollectionIds(Set<String> collectionIds) {
+		this.collectionIds = collectionIds;
+	}
+
+	public boolean allowSelect(ContentResource contentResource) {
+		return false;
+	}
+
+	public boolean allowView(ContentResource contentResource) {
+		if (contentResource == null)
+			return false;
+
+		String actualType = contentResource.getProperties().getProperty(ResourceProperties.PROP_STRUCTOBJ_TYPE);
+		if (actualType == null)
+			log.warn("Unexpected null form type on resource: " + contentResource.getReference());
+
+		boolean passesType = (targetType == null || targetType.equals(actualType));
+		boolean passesCollection = (collectionIds == null);
+
+		if (passesType && !passesCollection) {
+			for (String collId : collectionIds) {
+				if (contentResource.getId().startsWith(collId)) {
+					passesCollection = true;
+					break;
+				}
+			}
+		}
+
+		return (passesType && passesCollection);
+	}
+
+	public List<ResourceToolAction> filterAllowedActions(List<ResourceToolAction> actions) {
+		return new ArrayList<ResourceToolAction>();
+	}
+}
Index: metaobj-impl/api-impl/src/java/org/sakaiproject/metaobj/shared/mgt/impl/WrappedStructuredArtifactFinder.java
===================================================================
--- metaobj-impl/api-impl/src/java/org/sakaiproject/metaobj/shared/mgt/impl/WrappedStructuredArtifactFinder.java	(revision 51329)
+++ metaobj-impl/api-impl/src/java/org/sakaiproject/metaobj/shared/mgt/impl/WrappedStructuredArtifactFinder.java	(working copy)
@@ -24,6 +24,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.Set;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -55,7 +56,8 @@
    private static Log log = LogFactory.getLog(WrappedStructuredArtifactFinder.class);
 
    public Collection findByOwnerAndType(Id owner, String type) {
-      Collection<ContentResource> artifacts = findArtifacts(type);
+      Set<String> userCollectionIds = (Set<String>) getContentHostingService().getCollectionMap().keySet();
+      Collection<ContentResource> artifacts = findArtifacts(type, userCollectionIds);
       ArrayList<ContentResourceArtifact> returned = new ArrayList<ContentResourceArtifact>();
 
       if (owner == null)
@@ -146,45 +148,30 @@
 	 *             StructuredArtifactFinder
 	 * @param type
 	 *            The Form type to retrieve; may be null to get all types
+	 * @param collectionIds
+	 *            A set of collection IDs; if a resource does not belong to one of these, it will be
+	 *            filtered before checking access; may be null to skip pre-filtering based on collection
 	 * @return A filtered collection of ContentResource objects for readable Forms of the specific type
 	 */
 	@Deprecated
-	protected Collection<ContentResource> findArtifacts(String type) {
+	protected Collection<ContentResource> findArtifacts(String type, Set<String> collectionIds) {
 		//FIXME: Document exactly why WrappedStructuredArtifactFinder.findByType() returns null
 		//TODO: Refactor Wrapped vs. Structured
+		MetaobjFormFilter filter = new MetaobjFormFilter(type, collectionIds);
 		ArrayList<ContentResource> artifacts = new ArrayList<ContentResource>();
+		
 		int page = 0;
-		Collection<ContentResource> rawResources = getContentHostingService()
-				.getResourcesOfType(ResourceType.TYPE_METAOBJ, getFinderPageSize(), page);
-		while (rawResources != null && rawResources.size() > 0) {
-			artifacts.addAll(filterArtifacts(rawResources, type));
+		Collection<ContentResource> rawResources = getContentHostingService().getResourcesOfType(
+				ResourceType.TYPE_METAOBJ, filter, getFinderPageSize(), page);
+		
+		while (rawResources != null) {
+			artifacts.addAll(rawResources);
 			page++;
 			rawResources = getContentHostingService().getResourcesOfType(
-					ResourceType.TYPE_METAOBJ, getFinderPageSize(), page);
+					ResourceType.TYPE_METAOBJ, filter, getFinderPageSize(), page);
 		}
+		
 		return artifacts;
 	}
    
-   /**
-	 * Filter a collection of artifacts down to a specific Structured Object/Form type, in place.
-	 * 
-	 * @param artifacts
-	 *            The Collection<ContentResource> to filter - should contain only resources for Forms
-	 * @param type
-	 *            The Form type filter on; may be null to get all Form types
-	 * @return The original collection of artifacts, with non-matching Forms
-	 *         removed
-	 */
-	protected Collection<ContentResource> filterArtifacts(Collection<ContentResource> artifacts, String type) {
-		for (Iterator<ContentResource> i = artifacts.iterator(); i.hasNext();) {
-			ContentResource resource = i.next();
-			String currentType = resource.getProperties().getProperty(ResourceProperties.PROP_STRUCTOBJ_TYPE);
-			if (currentType == null)
-				log.warn("Unexpected null form type on resource: " + resource.getReference());
-		   
-			if (type != null && !type.equals(currentType))
-				i.remove();
-		}
-		return artifacts;
-	}
 }
