diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java
index 22d6d04..95af2c5 100644
--- a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/FSPackageRegistry.java
@@ -40,6 +40,8 @@
 
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.vault.fs.api.PathFilterSet;
+import org.apache.jackrabbit.vault.fs.api.WorkspaceFilter;
+import org.apache.jackrabbit.vault.fs.config.DefaultWorkspaceFilter;
 import org.apache.jackrabbit.vault.fs.config.MetaInf;
 import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
@@ -49,6 +51,7 @@
 import org.apache.jackrabbit.vault.packaging.PackageException;
 import org.apache.jackrabbit.vault.packaging.PackageExistsException;
 import org.apache.jackrabbit.vault.packaging.PackageId;
+import org.apache.jackrabbit.vault.packaging.ScopedWorkspaceFilter;
 import org.apache.jackrabbit.vault.packaging.SubPackageHandling;
 import org.apache.jackrabbit.vault.packaging.VaultPackage;
 import org.apache.jackrabbit.vault.packaging.events.PackageEvent;
@@ -70,6 +73,7 @@
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.osgi.service.metatype.annotations.Designate;
 import org.osgi.service.metatype.annotations.ObjectClassDefinition;
+import org.osgi.service.metatype.annotations.Option;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -112,6 +116,8 @@
 
     private File homeDir;
 
+    private InstallationScope scope;
+
     private File getHomeDir() {
         return homeDir;
     }
@@ -123,7 +129,19 @@
      * @throws IOException If an I/O error occurs.
      */
     public FSPackageRegistry(@Nonnull File homeDir) throws IOException {
+        this(homeDir, InstallationScope.UNSCOPED);
+    }
+
+    /**
+     * Creates a new FSPackageRegistry based on the given home directory.
+     *
+     * @param homeDir the directory in which packages and their metadata is stored
+     * @param scope to set a corresponding workspacefilter
+     * @throws IOException If an I/O error occurs.
+     */
+    public FSPackageRegistry(@Nonnull File homeDir, InstallationScope scope) throws IOException {
         this.homeDir = homeDir;
+        this.scope = scope;
         loadPackageCache();
     }
 
@@ -141,6 +159,18 @@
 
         @AttributeDefinition
         String homePath() default "packageregistry";
+        
+        @AttributeDefinition(name = "Installation Scope",
+                description = "Allows to limit the installation scope of this Apache Jackrabbit FS Package Registry Service. "
+                        + "Packages installed from this registry may be unscoped (unfiltered), "
+                        + "application scoped (only content for /apps & /libs) "
+                        + "or content scoped (all content despite of /libs & /apps)",
+                options = {
+                    @Option(label = "Unscoped", value = "UNSCOPED"),
+                    @Option(label = "Application Scoped", value = "APPLICATION_SCOPED"),
+                    @Option(label = "Content Scoped", value = "CONTENT_SCOPED")
+        })
+        String scope() default "UNSCOPED";
     }
 
     @Activate
@@ -157,6 +187,7 @@
                 homeDir.mkdirs();
             }
         }
+        this.scope = InstallationScope.valueOf(config.scope());
         loadPackageCache();
         log.info("Jackrabbit Filevault FS Package Registry initialized with home location {}", this.homeDir.getPath());
     }
@@ -645,6 +676,30 @@
             throw new PackageException(msg);
         }
         try (VaultPackage vltPkg = pkg.getPackage()) {
+            WorkspaceFilter filter = getInstallState(vltPkg.getId()).getFilter();
+            switch(scope) {
+                case APPLICATION_SCOPED:
+                   if (filter instanceof DefaultWorkspaceFilter) {
+                       opts.setFilter(ScopedWorkspaceFilter.createApplicationScoped((DefaultWorkspaceFilter)filter));
+                   } else {
+                       String msg = "Scoped only supports WorkspaceFilters extending DefaultWorkspaceFilter";
+                       log.error(msg);
+                       throw new PackageException(msg);
+                   }
+                   break;
+                case CONTENT_SCOPED:
+                    if (filter instanceof DefaultWorkspaceFilter) {
+                        opts.setFilter(ScopedWorkspaceFilter.createContentScoped((DefaultWorkspaceFilter)filter));
+                    } else {
+                        String msg = "Scoped only supports WorkspaceFilters extending DefaultWorkspaceFilter";
+                        log.error(msg);
+                        throw new PackageException(msg);
+                    }
+                    break;
+                default:
+                    // no need to set filter in other cases
+                
+            }
             vltPkg.extract(session, opts);
             dispatch(PackageEvent.Type.EXTRACT, pkg.getId(), null);
             updateInstallState(vltPkg.getId(), FSPackageStatus.EXTRACTED);
diff --git a/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/InstallationScope.java b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/InstallationScope.java
new file mode 100644
index 0000000..cb4f8e0
--- /dev/null
+++ b/vault-core/src/main/java/org/apache/jackrabbit/vault/packaging/registry/impl/InstallationScope.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.vault.packaging.registry.impl;
+
+public enum InstallationScope {
+    UNSCOPED, APPLICATION_SCOPED, CONTENT_SCOPED 
+}
\ No newline at end of file
diff --git a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFSPackageRegistry.java b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFSPackageRegistry.java
index 14c1ca4..e0b4b78 100644
--- a/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFSPackageRegistry.java
+++ b/vault-core/src/test/java/org/apache/jackrabbit/vault/packaging/integration/TestFSPackageRegistry.java
@@ -18,19 +18,22 @@
 package org.apache.jackrabbit.vault.packaging.integration;
 
 import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
+import java.util.Arrays;
 import java.util.Calendar;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
 
 import javax.jcr.RepositoryException;
 
-import org.apache.commons.collections.map.HashedMap;
+import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.jackrabbit.vault.fs.api.ProgressTrackerListener;
-import org.apache.jackrabbit.vault.fs.io.Archive;
 import org.apache.jackrabbit.vault.fs.io.ImportOptions;
 import org.apache.jackrabbit.vault.packaging.Dependency;
 import org.apache.jackrabbit.vault.packaging.DependencyException;
@@ -47,7 +50,7 @@
 import org.apache.jackrabbit.vault.packaging.registry.impl.FSInstallState;
 import org.apache.jackrabbit.vault.packaging.registry.impl.FSPackageRegistry;
 import org.apache.jackrabbit.vault.packaging.registry.impl.FSPackageStatus;
-import org.junit.After;
+import org.apache.jackrabbit.vault.packaging.registry.impl.InstallationScope;
 import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -68,7 +71,18 @@
 
     private static final Logger log = LoggerFactory.getLogger(TestFSPackageRegistry.class);
 
+    public static final String[] APPLICATION_PATHS = {
+            "/libs",
+            "/libs/foo"
+    };
+    
+    public static final String[] CONTENT_PATHS = {
+            "/tmp",
+            "/tmp/foo"
+    };
+    
     private FSPackageRegistry registry;
+    private File registryHome;
 
     @Override
     @Before
@@ -79,7 +93,8 @@
         } else {
             DIR_REGISTRY_HOME.mkdir();
         }
-        registry = new FSPackageRegistry(DIR_REGISTRY_HOME);
+        
+        getFreshRegistry();
     }
     
     /**
@@ -234,7 +249,7 @@
         }
         
         // loading registry again to force loading of metadata from files
-        registry = new FSPackageRegistry(DIR_REGISTRY_HOME);
+        registry = new FSPackageRegistry(registryHome);
         
         try {
             registry.registerExternal(file, false);
@@ -298,6 +313,78 @@
         assertFalse(registry.open(PACKAGE_ID_SUB_B).isInstalled());
     }
     
+    
+
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testInstallExternalUnScoped() throws IOException, PackageException, RepositoryException, org.apache.jackrabbit.oak.plugins.segment.file.InvalidFileStoreVersionException {
+        File file = getTempFile("testpackages/mixed_package.zip");
+        
+        cleanPaths(APPLICATION_PATHS);
+        cleanPaths(CONTENT_PATHS);
+        getFreshRegistry();
+
+        PackageId pkg = registry.registerExternal(file, false);
+        
+        ExecutionPlanBuilder builder = registry.createExecutionPlan();
+        Collector listener = new Collector();
+        builder.with(listener);
+        builder.addTask().with(pkg).with(Type.EXTRACT);
+        ExecutionPlan plan  = builder.with(admin).execute();
+        assertFalse(plan.hasErrors());
+        checkFiltered(APPLICATION_PATHS, new String[] {}, listener.paths);
+        checkFiltered(CONTENT_PATHS, new String[] {}, listener.paths);
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testInstallExternalContentScoped() throws IOException, PackageException, RepositoryException, org.apache.jackrabbit.oak.plugins.segment.file.InvalidFileStoreVersionException {
+        File file = getTempFile("testpackages/mixed_package.zip");
+
+        cleanPaths(APPLICATION_PATHS);
+        cleanPaths(CONTENT_PATHS);
+        getFreshRegistry(InstallationScope.CONTENT_SCOPED);
+        
+        PackageId pkg = registry.registerExternal(file, false);
+        
+        ExecutionPlanBuilder builder = registry.createExecutionPlan();
+        Collector listener = new Collector();
+        builder.with(listener);
+        builder.addTask().with(pkg).with(Type.EXTRACT);
+        ExecutionPlan plan  = builder.with(admin).execute();
+        assertFalse(plan.hasErrors());
+        checkFiltered(CONTENT_PATHS, APPLICATION_PATHS, listener.paths);
+    }
+
+    @SuppressWarnings("deprecation")
+    private void cleanPaths(String[] paths) throws IOException, RepositoryException, org.apache.jackrabbit.oak.plugins.segment.file.InvalidFileStoreVersionException  {
+        for (String path : paths) {
+            clean(path);
+        }
+    }
+
+    @SuppressWarnings("deprecation")
+    @Test
+    public void testInstallExternalApplicationScoped() throws IOException, PackageException, RepositoryException, org.apache.jackrabbit.oak.plugins.segment.file.InvalidFileStoreVersionException {
+        File file = getTempFile("testpackages/mixed_package.zip");
+        
+        cleanPaths(APPLICATION_PATHS);
+        cleanPaths(CONTENT_PATHS);
+        getFreshRegistry(InstallationScope.APPLICATION_SCOPED);
+        
+        PackageId pkg = registry.registerExternal(file, false);
+        
+        ExecutionPlanBuilder builder = registry.createExecutionPlan();
+        Collector listener = new Collector();
+        builder.with(listener);
+        builder.addTask().with(pkg).with(Type.EXTRACT);
+        ExecutionPlan plan  = builder.with(admin).execute();
+        assertFalse(plan.hasErrors());
+        checkFiltered(APPLICATION_PATHS, CONTENT_PATHS, listener.paths);
+        
+    }
+    
 
     /**
      * test if package removal works
@@ -591,4 +678,34 @@
         loadPackageCache.invoke(registry);
         assertEquals(FSPackageStatus.NOTREGISTERED, registry.getInstallState(idC).getStatus());
     }
+    
+    private void getFreshRegistry(InstallationScope... scope) throws IOException {
+        if (this.registryHome != null && this.registryHome.exists()) {
+            this.registryHome.delete();
+        }
+        this.registryHome = new File(DIR_REGISTRY_HOME, UUID.randomUUID().toString());
+        this.registryHome.mkdir();
+        if (scope.length > 0) {
+            this.registry = new FSPackageRegistry(registryHome, scope[0]);
+        } else {
+            this.registry = new FSPackageRegistry(registryHome);
+        }
+    }
+    
+    private static class Collector implements ProgressTrackerListener {
+        private final List<String> paths = new LinkedList<String>();
+
+        public void onMessage(Mode mode, String action, String path) {
+            paths.add(path);
+        }
+
+        public void onError(Mode mode, String path, Exception e) {
+        }
+    }
+    
+    public static void checkFiltered(String[] containing, String[] filtered, List<String> result) {
+        assertEquals("Results don't contain expected values", Collections.EMPTY_LIST, CollectionUtils.subtract(Arrays.asList(containing), result));
+        assertEquals("Results contain unexpected values", Collections.EMPTY_LIST , CollectionUtils.intersection(result, Arrays.asList(filtered)));
+    }
+
 }
\ No newline at end of file
