Merge with Master
diff --git a/pom.xml b/pom.xml
index c91d51a..634ef5c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -162,5 +162,11 @@
             <version>1.1.1</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.sling</groupId>
+            <artifactId>org.apache.sling.feature.io</artifactId>
+            <version>1.0.3-SNAPSHOT</version>
+            <scope>provided</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/src/main/java/org/apache/sling/feature/analyser/task/impl/CheckBundlesForConnect.java b/src/main/java/org/apache/sling/feature/analyser/task/impl/CheckBundlesForConnect.java
index 8480dee..b8443c8 100644
--- a/src/main/java/org/apache/sling/feature/analyser/task/impl/CheckBundlesForConnect.java
+++ b/src/main/java/org/apache/sling/feature/analyser/task/impl/CheckBundlesForConnect.java
@@ -60,7 +60,7 @@
                 }
 
                 final Set<String> packages = new HashSet<>();
-                try (final JarInputStream jis = new JarInputStream(new FileInputStream(bd.getArtifactFile()))) {
+                try (final JarInputStream jis = new JarInputStream(bd.getArtifactFile().openStream())) {
                     JarEntry entry;
                     while ((entry = jis.getNextJarEntry()) != null) {
                         if (entry.getName().endsWith(".class")) {
diff --git a/src/main/java/org/apache/sling/feature/scanner/ArtifactDescriptor.java b/src/main/java/org/apache/sling/feature/scanner/ArtifactDescriptor.java
index 5f41fda..c717356 100644
--- a/src/main/java/org/apache/sling/feature/scanner/ArtifactDescriptor.java
+++ b/src/main/java/org/apache/sling/feature/scanner/ArtifactDescriptor.java
@@ -16,7 +16,7 @@
  */
 package org.apache.sling.feature.scanner;
 
-import java.io.File;
+import java.net.URL;
 
 import org.apache.sling.feature.Artifact;
 
@@ -38,7 +38,7 @@
      * Get the artifact file
      * @return The artifact file
      */
-    public abstract File getArtifactFile();
+    public abstract URL getArtifactFile();
 
     /**
      * Get the artifact
diff --git a/src/main/java/org/apache/sling/feature/scanner/Scanner.java b/src/main/java/org/apache/sling/feature/scanner/Scanner.java
index a2d7920..850e4a1 100644
--- a/src/main/java/org/apache/sling/feature/scanner/Scanner.java
+++ b/src/main/java/org/apache/sling/feature/scanner/Scanner.java
@@ -18,6 +18,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -117,7 +118,7 @@
         final String key = bundle.getId().toMvnId().concat(":").concat(String.valueOf(startLevel));
         BundleDescriptor desc = (BundleDescriptor) this.cache.get(key);
         if (desc == null) {
-            final File file = artifactProvider.provide(bundle.getId());
+            final URL file = artifactProvider.provide(bundle.getId());
             if (file == null) {
                 throw new IOException("Unable to find file for " + bundle.getId());
             }
diff --git a/src/main/java/org/apache/sling/feature/scanner/impl/ApiRegionsExtensionScanner.java b/src/main/java/org/apache/sling/feature/scanner/impl/ApiRegionsExtensionScanner.java
index eb914c0..0483854 100644
--- a/src/main/java/org/apache/sling/feature/scanner/impl/ApiRegionsExtensionScanner.java
+++ b/src/main/java/org/apache/sling/feature/scanner/impl/ApiRegionsExtensionScanner.java
@@ -16,8 +16,8 @@
  */
 package org.apache.sling.feature.scanner.impl;
 
-import java.io.File;
 import java.io.IOException;
+import java.net.URL;
 
 import org.apache.sling.feature.Artifact;
 import org.apache.sling.feature.Extension;
@@ -45,7 +45,7 @@
         FeatureDescriptor featureDescriptor = new FeatureDescriptorImpl(feature);
 
         for (Artifact artifact : feature.getBundles()) {
-            File file = provider.provide(artifact.getId());
+            URL file = provider.provide(artifact.getId());
             BundleDescriptor bundleDescriptor = new BundleDescriptorImpl(artifact, file, artifact.getStartOrder());
             featureDescriptor.getBundleDescriptors().add(bundleDescriptor);
         }
diff --git a/src/main/java/org/apache/sling/feature/scanner/impl/BundleDescriptorImpl.java b/src/main/java/org/apache/sling/feature/scanner/impl/BundleDescriptorImpl.java
index 45855ac..74cf932 100644
--- a/src/main/java/org/apache/sling/feature/scanner/impl/BundleDescriptorImpl.java
+++ b/src/main/java/org/apache/sling/feature/scanner/impl/BundleDescriptorImpl.java
@@ -16,8 +16,18 @@
  */
 package org.apache.sling.feature.scanner.impl;
 
-import java.io.File;
+import org.apache.felix.utils.manifest.Clause;
+import org.apache.felix.utils.manifest.Parser;
+import org.apache.felix.utils.resource.ResourceBuilder;
+import org.apache.felix.utils.resource.ResourceImpl;
+import org.apache.sling.feature.Artifact;
+import org.apache.sling.feature.io.IOUtils;
+import org.apache.sling.feature.scanner.BundleDescriptor;
+import org.apache.sling.feature.scanner.PackageInfo;
+import org.osgi.framework.Constants;
+
 import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -28,15 +38,6 @@
 import java.util.jar.Manifest;
 import java.util.stream.Collectors;
 
-import org.apache.felix.utils.manifest.Clause;
-import org.apache.felix.utils.manifest.Parser;
-import org.apache.felix.utils.resource.ResourceBuilder;
-import org.apache.felix.utils.resource.ResourceImpl;
-import org.apache.sling.feature.Artifact;
-import org.apache.sling.feature.scanner.BundleDescriptor;
-import org.apache.sling.feature.scanner.PackageInfo;
-import org.osgi.framework.Constants;
-
 /**
  * Information about a bundle
  */
@@ -56,19 +57,19 @@
     private final Manifest manifest;
 
     /** The physical file for analyzing. */
-    private final File artifactFile;
+    private final URL artifactFile;
 
     /** The corresponding artifact from the feature. */
     private final Artifact artifact;
 
     public BundleDescriptorImpl(final Artifact a,
-            final File file,
+            final URL file,
             final int startLevel) throws IOException  {
         super(a.getId().toMvnId());
         this.artifact = a;
         this.artifactFile = file;
         this.startLevel = startLevel;
-        try (final JarFile jarFile = new JarFile(this.artifactFile) ) {
+        try (final JarFile jarFile = IOUtils.getJarFileFromURL(this.artifactFile, true, null)) {
             this.manifest = jarFile.getManifest();
         }
         if ( this.manifest == null ) {
@@ -106,7 +107,7 @@
     }
 
     @Override
-    public File getArtifactFile() {
+    public URL getArtifactFile() {
         return artifactFile;
     }
 
diff --git a/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackageDescriptor.java b/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackageDescriptor.java
index 7897fcd..5f56c75 100644
--- a/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackageDescriptor.java
+++ b/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackageDescriptor.java
@@ -22,6 +22,7 @@
 import org.apache.sling.feature.scanner.BundleDescriptor;
 
 import java.io.File;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -39,7 +40,7 @@
     /** Configurations in the content package. */
     public final List<Configuration> configs = new ArrayList<>();
 
-    private File artifactFile;
+    private URL artifactFile;
 
     private Artifact artifact;
 
@@ -52,7 +53,7 @@
      * @return The artifact file
      */
     @Override
-    public File getArtifactFile() {
+    public URL getArtifactFile() {
         return artifactFile;
     }
 
@@ -78,7 +79,7 @@
      * Set the artifact file
      * @param artifactFile The artifact file
      */
-    public void setArtifactFile(File artifactFile) {
+    public void setArtifactFile(URL artifactFile) {
         checkLocked();
         this.artifactFile = artifactFile;
     }
diff --git a/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackageScanner.java b/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackageScanner.java
index e5d2878..b57b199 100644
--- a/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackageScanner.java
+++ b/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackageScanner.java
@@ -29,6 +29,7 @@
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.Reader;
+import java.net.URL;
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -50,15 +51,12 @@
         PACKAGE
     }
 
-    public Set<ContentPackageDescriptor> scan(final Artifact desc, final File file) throws IOException {
-        if (!file.getName().endsWith(".zip") ) {
-            throw new IOException("Artifact seems to be no content package (not a zip file): " + desc.getId().toMvnId());
-        }
+    public Set<ContentPackageDescriptor> scan(final Artifact desc, final URL file) throws IOException {
 
         final Set<ContentPackageDescriptor> contentPackages = new HashSet<>();
-        final ContentPackageDescriptor cp = new ContentPackageDescriptor(file.getName());
-        final int lastDot = file.getName().lastIndexOf(".");
-        cp.setName(file.getName().substring(0, lastDot));
+        final ContentPackageDescriptor cp = new ContentPackageDescriptor(file.getPath());
+        final int lastDot = file.getPath().lastIndexOf(".");
+        cp.setName(file.getPath().substring(file.getPath().lastIndexOf("/") + 1, lastDot));
         cp.setArtifact(desc);
         cp.setArtifactFile(file);
 
@@ -72,18 +70,18 @@
 
     private void extractContentPackage(final ContentPackageDescriptor cp,
             final Set<ContentPackageDescriptor> infos,
-            final File archive)
+            final URL archive)
     throws IOException {
-        logger.debug("Analyzing Content Package {}", archive.getName());
+        logger.debug("Analyzing Content Package {}", archive);
 
         final File tempDir = Files.createTempDirectory(null).toFile();
         try {
-            final File toDir = new File(tempDir, archive.getName());
+            final File toDir = new File(tempDir, archive.getPath().substring(archive.getPath().lastIndexOf("/") + 1));
             toDir.mkdirs();
 
             final List<File> toProcess = new ArrayList<>();
 
-            try (final ZipInputStream zis = new ZipInputStream(new FileInputStream(archive)) ) {
+            try (final ZipInputStream zis = new ZipInputStream(archive.openStream()) ) {
                 boolean done = false;
                 while ( !done ) {
                     final ZipEntry entry = zis.getNextEntry();
@@ -168,7 +166,7 @@
                                     }
 
                                     final Artifact bundle = new Artifact(extractArtifactId(tempDir, newFile));
-                                    final BundleDescriptor info = new BundleDescriptorImpl(bundle, newFile, startLevel);
+                                    final BundleDescriptor info = new BundleDescriptorImpl(bundle, newFile.toURI().toURL(), startLevel);
                                     bundle.getMetadata().put("content-package", cp.getArtifact().getId().toMvnId());
                                     bundle.getMetadata().put("content-path", contentPath);
 
@@ -196,11 +194,11 @@
             }
 
             for(final File f : toProcess) {
-                extractContentPackage(cp, infos, f);
+                extractContentPackage(cp, infos, f.toURI().toURL());
                 final ContentPackageDescriptor i = new ContentPackageDescriptor(f.getName());
                 final int lastDot = f.getName().lastIndexOf(".");
                 i.setName(f.getName().substring(0, lastDot));
-                i.setArtifactFile(f);
+                i.setArtifactFile(f.toURI().toURL());
                 i.setContentPackageInfo(cp.getArtifact(), f.getName());
                 infos.add(i);
 
diff --git a/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackagesExtensionScanner.java b/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackagesExtensionScanner.java
index bde04ee..af4e502 100644
--- a/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackagesExtensionScanner.java
+++ b/src/main/java/org/apache/sling/feature/scanner/impl/ContentPackagesExtensionScanner.java
@@ -26,6 +26,7 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.net.URL;
 import java.util.Set;
 
 public class ContentPackagesExtensionScanner implements ExtensionScanner {
@@ -56,7 +57,7 @@
         final ContainerDescriptor cd = new ContainerDescriptor(feature.getId().toMvnId() + "(" + getId() + ")") {};
 
         for(final Artifact a : extension.getArtifacts()) {
-            final File file = provider.provide(a.getId());
+            final URL file = provider.provide(a.getId());
             if ( file == null ) {
                 throw new IOException("Unable to find file for " + a.getId());
             }
diff --git a/src/main/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScanner.java b/src/main/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScanner.java
index 7cf2906..956a90c 100644
--- a/src/main/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScanner.java
+++ b/src/main/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScanner.java
@@ -33,6 +33,7 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.net.URL;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -53,7 +54,7 @@
             final Map<String,String> frameworkProps,
             final ArtifactProvider provider)
     throws IOException {
-        final File platformFile = provider.provide(framework);
+        final URL platformFile = provider.provide(framework);
         if ( platformFile == null ) {
             throw new IOException("Unable to find file for " + framework.toMvnId());
         }
@@ -82,7 +83,7 @@
             }
 
             @Override
-            public File getArtifactFile() {
+            public URL getArtifactFile() {
                 return platformFile;
             }
 
@@ -140,10 +141,10 @@
 
     private static final String DEFAULT_PROPERTIES = "default.properties";
 
-    Map<String,String> getFrameworkProperties(final Map<String,String> appProps, final File framework)
+    Map<String,String> getFrameworkProperties(final Map<String,String> appProps, final URL framework)
     throws IOException {
         final Map<String, Properties> propsMap = new HashMap<>();
-        try (final ZipInputStream zis = new ZipInputStream(new FileInputStream(framework)) ) {
+        try (final ZipInputStream zis = new ZipInputStream(framework.openStream()) ) {
             boolean done = false;
             while ( !done ) {
                 final ZipEntry entry = zis.getNextEntry();
diff --git a/src/main/java/org/apache/sling/feature/scanner/package-info.java b/src/main/java/org/apache/sling/feature/scanner/package-info.java
index 4c65dc3..d3a2684 100644
--- a/src/main/java/org/apache/sling/feature/scanner/package-info.java
+++ b/src/main/java/org/apache/sling/feature/scanner/package-info.java
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-@org.osgi.annotation.versioning.Version("1.0.0")
+@org.osgi.annotation.versioning.Version("2.0.0")
 package org.apache.sling.feature.scanner;
 
 
diff --git a/src/test/java/org/apache/sling/feature/analyser/task/impl/AbstractApiRegionsAnalyserTaskTest.java b/src/test/java/org/apache/sling/feature/analyser/task/impl/AbstractApiRegionsAnalyserTaskTest.java
index c9753b4..cad154f 100644
--- a/src/test/java/org/apache/sling/feature/analyser/task/impl/AbstractApiRegionsAnalyserTaskTest.java
+++ b/src/test/java/org/apache/sling/feature/analyser/task/impl/AbstractApiRegionsAnalyserTaskTest.java
@@ -35,6 +35,7 @@
 import org.mockito.stubbing.Answer;
 
 import java.io.File;
+import java.net.URL;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
@@ -152,7 +153,7 @@
         }
 
         @Override
-        public File getArtifactFile() {
+        public URL getArtifactFile() {
             // do nothing
             return null;
         }
diff --git a/src/test/java/org/apache/sling/feature/analyser/task/impl/CheckBundleExportsImportsTest.java b/src/test/java/org/apache/sling/feature/analyser/task/impl/CheckBundleExportsImportsTest.java
index 8bb5620..8a89863 100644
--- a/src/test/java/org/apache/sling/feature/analyser/task/impl/CheckBundleExportsImportsTest.java
+++ b/src/test/java/org/apache/sling/feature/analyser/task/impl/CheckBundleExportsImportsTest.java
@@ -329,7 +329,7 @@
 
     private void fdAddBundle(FeatureDescriptor fd, String id, String file) throws IOException {
         BundleDescriptor bd1 = new BundleDescriptorImpl(
-                new Artifact(ArtifactId.fromMvnId(id)), new File(resourceRoot, file), 0);
+                new Artifact(ArtifactId.fromMvnId(id)), new File(resourceRoot, file).toURI().toURL(), 0);
         fd.getBundleDescriptors().add(bd1);
     }
 }
diff --git a/src/test/java/org/apache/sling/feature/analyser/task/impl/CheckRequirementsCapabilitiesTest.java b/src/test/java/org/apache/sling/feature/analyser/task/impl/CheckRequirementsCapabilitiesTest.java
index 5981b25..ea693b9 100644
--- a/src/test/java/org/apache/sling/feature/analyser/task/impl/CheckRequirementsCapabilitiesTest.java
+++ b/src/test/java/org/apache/sling/feature/analyser/task/impl/CheckRequirementsCapabilitiesTest.java
@@ -45,7 +45,7 @@
 
         BundleDescriptor bd1 = new BundleDescriptorImpl(
                 new Artifact(ArtifactId.fromMvnId("g:b1:1.2.0")),
-                f, 7);
+                f.toURI().toURL(), 7);
 
         Feature feature = new Feature(ArtifactId.fromMvnId("a:b:1"));
 
@@ -80,7 +80,7 @@
 
         BundleDescriptor bd1 = new BundleDescriptorImpl(
                 new Artifact(ArtifactId.fromMvnId("g:b1:1.2.0")),
-                f, 7);
+                f.toURI().toURL(), 7);
 
         Feature feature = new Feature(ArtifactId.fromMvnId("a:b:1"));
         FeatureDescriptor fd = new FeatureDescriptorImpl(feature);
diff --git a/src/test/java/org/apache/sling/feature/scanner/impl/BundleDescriptorImplTest.java b/src/test/java/org/apache/sling/feature/scanner/impl/BundleDescriptorImplTest.java
index a8d289c..1bdc342 100644
--- a/src/test/java/org/apache/sling/feature/scanner/impl/BundleDescriptorImplTest.java
+++ b/src/test/java/org/apache/sling/feature/scanner/impl/BundleDescriptorImplTest.java
@@ -23,6 +23,7 @@
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.net.URL;
 import java.util.Set;
 import java.util.jar.JarOutputStream;
 import java.util.jar.Manifest;
@@ -52,7 +53,7 @@
             + "Bundle-Version: 1\n"
             + "Bundle-ManifestVersion: 2\n"
             + "Export-Package: org.apache.sling;version=1.0,org.apache.felix;version=2.0\n";
-        File f = createBundle(bmf);
+        URL f = new URL("jar:" + createBundle(bmf).toURI().toURL() + "!/");
         BundleDescriptorImpl bdf = new BundleDescriptorImpl(new Artifact(new ArtifactId("foo", "bar", "1.0", "bla", "bundle")), f, 1);
         final Set<PackageInfo> infos = bdf.getExportedPackages();
         assertEquals(2, infos.size());
diff --git a/src/test/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScannerTest.java b/src/test/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScannerTest.java
index b75b134..617a986 100644
--- a/src/test/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScannerTest.java
+++ b/src/test/java/org/apache/sling/feature/scanner/impl/FelixFrameworkScannerTest.java
@@ -38,7 +38,7 @@
         FelixFrameworkScanner ffs = new FelixFrameworkScanner();
 
         Map<String,String> kvmap = new HashMap<>();
-        Map<String,String> props = ffs.getFrameworkProperties(kvmap, fwFile);
+        Map<String,String> props = ffs.getFrameworkProperties(kvmap, fwFile.toURI().toURL());
         assertEquals("osgi.service; objectClass:List<String>=org.osgi.service.resolver.Resolver; "
                     + "uses:=org.osgi.service.resolver, "
                 + "osgi.service; objectClass:List<String>=org.osgi.service.startlevel.StartLevel; "
@@ -54,8 +54,7 @@
 
     @Test
     public void testGetFrameworkExports() throws Exception {
-        URL url = getClass().getResource("/test-framework.jar");
-        File fwFile = new File(url.toURI());
+        URL fwFile = getClass().getResource("/test-framework.jar");
 
         FelixFrameworkScanner ffs = new FelixFrameworkScanner();
 
@@ -66,7 +65,7 @@
                 "6.0.1", null, null), kvmap, new ArtifactProvider() {
 
                     @Override
-                    public File provide(ArtifactId id) {
+                    public URL provide(ArtifactId id) {
                         return fwFile;
                     }
                 });