diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImports.java b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImports.java
index 5ce1635..0a5797c 100644
--- a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImports.java
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleExportsImports.java
@@ -53,9 +53,6 @@
     private static final String NO_REGION = " __NO_REGION__ ";
     private static final String OWN_FEATURE = " __OWN_FEATURE__ ";
 
-    /** Ignore JDK packages */
-    private static final List<String> IGNORED_IMPORT_PREFIXES = Arrays.asList("java.", "javax.", "org.w3c.", "org.xml.");
-
     @Override
     public String getName() {
         return "Bundle Import/Export Check";
@@ -68,12 +65,8 @@
 
     public static final class Report {
 
-        public List<PackageInfo> exportWithoutVersion = new ArrayList<>();
-
         public List<PackageInfo> exportMatchingSeveral = new ArrayList<>();
 
-        public List<PackageInfo> importWithoutVersion = new ArrayList<>();
-
         public List<PackageInfo> missingExports = new ArrayList<>();
 
         public List<PackageInfo> missingExportsWithVersion = new ArrayList<>();
@@ -92,48 +85,12 @@
         return report;
     }
 
-    private void checkForVersionOnExportedPackages(final AnalyserTaskContext ctx, final Map<BundleDescriptor, Report> reports) {
-        for(final BundleDescriptor info : ctx.getFeatureDescriptor().getBundleDescriptors()) {
-            if ( info.getExportedPackages() != null ) {
-                for(final PackageInfo i : info.getExportedPackages()) {
-                    if ( i.getPackageVersion().compareTo(Version.emptyVersion) == 0 ) {
-                        getReport(reports, info).exportWithoutVersion.add(i);
-                    }
-                }
-            }
-        }
-    }
-
-    private boolean ignoreImportPackage(final String name) {
-        for(final String prefix : IGNORED_IMPORT_PREFIXES) {
-            if ( name.startsWith(prefix) ) {
-                return true;
-            }
-        }
-        return false;
-    }
-    
-    private void checkForVersionOnImportingPackages(final AnalyserTaskContext ctx, final Map<BundleDescriptor, Report> reports) {
-        for(final BundleDescriptor info : ctx.getFeatureDescriptor().getBundleDescriptors()) {
-            if ( info.getImportedPackages() != null ) {
-                for(final PackageInfo i : info.getImportedPackages()) {
-                    if ( i.getVersion() == null && !ignoreImportPackage(i.getName()) ) {
-                        getReport(reports, info).importWithoutVersion.add(i);
-                    }
-                }
-            }
-        }
-    }
-
     @Override
     public void execute(final AnalyserTaskContext ctx) throws Exception {
         boolean ignoreAPIRegions = ctx.getConfiguration().getOrDefault(
                 IGNORE_API_REGIONS_CONFIG_KEY, "false").equalsIgnoreCase("true");
 
-        // basic checks
         final Map<BundleDescriptor, Report> reports = new HashMap<>();
-        checkForVersionOnExportedPackages(ctx, reports);
-        checkForVersionOnImportingPackages(ctx, reports);
 
         final SortedMap<Integer, List<BundleDescriptor>> bundlesMap = new TreeMap<>();
         for(final BundleDescriptor bi : ctx.getFeatureDescriptor().getBundleDescriptors()) {
@@ -258,15 +215,6 @@
         for(final Map.Entry<BundleDescriptor, Report> entry : reports.entrySet()) {
             final String key = "Bundle " + entry.getKey().getArtifact().getId().getArtifactId() + ":" + entry.getKey().getArtifact().getId().getVersion();
 
-            if ( !entry.getValue().importWithoutVersion.isEmpty() ) {
-                ctx.reportArtifactWarning(entry.getKey().getArtifact().getId(),
-                        key + " is importing package(s) " + getPackageInfo(entry.getValue().importWithoutVersion, false) + " without specifying a version range.");
-            }
-            if ( !entry.getValue().exportWithoutVersion.isEmpty() ) {
-                ctx.reportArtifactWarning(entry.getKey().getArtifact().getId(),
-                        key + " is exporting package(s) " + getPackageInfo(entry.getValue().importWithoutVersion, false) + " without a version.");
-            }
-
             if ( !entry.getValue().missingExports.isEmpty() ) {
                 ctx.reportArtifactError(entry.getKey().getArtifact().getId(),
                         key + " is importing package(s) " + getPackageInfo(entry.getValue().missingExports, false) + " in start level " +
diff --git a/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackages.java b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackages.java
new file mode 100644
index 0000000..affe8cd
--- /dev/null
+++ b/src/main/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackages.java
@@ -0,0 +1,134 @@
+/*
+ * 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.sling.feature.extension.apiregions.analyser;
+
+import org.apache.sling.feature.analyser.task.AnalyserTask;
+import org.apache.sling.feature.analyser.task.AnalyserTaskContext;
+import org.apache.sling.feature.extension.apiregions.api.ApiRegions;
+import org.apache.sling.feature.scanner.BundleDescriptor;
+import org.apache.sling.feature.scanner.PackageInfo;
+import org.osgi.framework.Version;
+
+import java.util.*;
+
+public class CheckApiRegionsBundleUnversionedPackages implements AnalyserTask {
+
+    /** Ignore JDK packages */
+    private static final List<String> IGNORED_IMPORT_PREFIXES = Arrays.asList("java.", "javax.", "org.w3c.", "org.xml.");
+
+    @Override
+    public String getName() {
+        return "Bundle Unversioned Packages Check";
+    }
+
+    @Override
+    public String getId() {
+        return ApiRegions.EXTENSION_NAME + "-unversioned-packages";
+    }
+
+    public static final class Report {
+
+        public List<PackageInfo> exportWithoutVersion = new ArrayList<>();
+
+        public List<PackageInfo> importWithoutVersion = new ArrayList<>();
+
+    }
+
+    private Report getReport(final Map<BundleDescriptor, Report> reports, final BundleDescriptor info) {
+        Report report = reports.get(info);
+        if ( report == null ) {
+            report = new Report();
+            reports.put(info, report);
+        }
+        return report;
+    }
+
+    private void checkForVersionOnExportedPackages(final AnalyserTaskContext ctx, final Map<BundleDescriptor, Report> reports) {
+        for(final BundleDescriptor info : ctx.getFeatureDescriptor().getBundleDescriptors()) {
+            if ( info.getExportedPackages() != null ) {
+                for(final PackageInfo i : info.getExportedPackages()) {
+                    if ( i.getPackageVersion().compareTo(Version.emptyVersion) == 0 ) {
+                        getReport(reports, info).exportWithoutVersion.add(i);
+                    }
+                }
+            }
+        }
+    }
+
+    private boolean ignoreImportPackage(final String name) {
+        for(final String prefix : IGNORED_IMPORT_PREFIXES) {
+            if ( name.startsWith(prefix) ) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    private void checkForVersionOnImportingPackages(final AnalyserTaskContext ctx, final Map<BundleDescriptor, Report> reports) {
+        for(final BundleDescriptor info : ctx.getFeatureDescriptor().getBundleDescriptors()) {
+            if ( info.getImportedPackages() != null ) {
+                for(final PackageInfo i : info.getImportedPackages()) {
+                    if ( i.getVersion() == null && !ignoreImportPackage(i.getName()) ) {
+                        getReport(reports, info).importWithoutVersion.add(i);
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public void execute(final AnalyserTaskContext ctx) throws Exception {
+        final Map<BundleDescriptor, Report> reports = new HashMap<>();
+        checkForVersionOnExportedPackages(ctx, reports);
+        checkForVersionOnImportingPackages(ctx, reports);
+
+        for(final Map.Entry<BundleDescriptor, Report> entry : reports.entrySet()) {
+            final String key = "Bundle " + entry.getKey().getArtifact().getId().getArtifactId() + ":" + entry.getKey().getArtifact().getId().getVersion();
+
+            if ( !entry.getValue().importWithoutVersion.isEmpty() ) {
+                ctx.reportArtifactWarning(entry.getKey().getArtifact().getId(),
+                        key + " is importing package(s) " + getPackageInfo(entry.getValue().importWithoutVersion) + " without specifying a version range.");
+            }
+            if ( !entry.getValue().exportWithoutVersion.isEmpty() ) {
+                ctx.reportArtifactWarning(entry.getKey().getArtifact().getId(),
+                        key + " is exporting package(s) " + getPackageInfo(entry.getValue().exportWithoutVersion) + " without a version.");
+            }
+        }
+    }
+
+    private String getPackageInfo(final List<PackageInfo> pcks) {
+        if ( pcks.size() == 1 ) {
+                return pcks.get(0).getName();
+        }
+        final StringBuilder sb = new StringBuilder();
+        boolean first = true;
+        sb.append('[');
+        for(final PackageInfo info : pcks) {
+            if ( first ) {
+                first = false;
+            } else {
+                sb.append(", ");
+            }
+            sb.append(info.getName());
+        }
+        sb.append(']');
+        return sb.toString();
+    }
+
+}
diff --git a/src/main/resources/META-INF/services/org.apache.sling.feature.analyser.task.AnalyserTask b/src/main/resources/META-INF/services/org.apache.sling.feature.analyser.task.AnalyserTask
index 1ed0442..4f80111 100644
--- a/src/main/resources/META-INF/services/org.apache.sling.feature.analyser.task.AnalyserTask
+++ b/src/main/resources/META-INF/services/org.apache.sling.feature.analyser.task.AnalyserTask
@@ -3,6 +3,7 @@
 org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsDuplicates
 org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsOrder
 org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsBundleExportsImports
+org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsBundleUnversionedPackages
 org.apache.sling.feature.extension.apiregions.analyser.CheckApiRegionsCrossFeatureDups
 org.apache.sling.feature.extension.apiregions.analyser.CheckArtifactRules
 org.apache.sling.feature.extension.apiregions.analyser.CheckConfigurationApi
diff --git a/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackagesTest.java b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackagesTest.java
new file mode 100644
index 0000000..37747c1
--- /dev/null
+++ b/src/test/java/org/apache/sling/feature/extension/apiregions/analyser/CheckApiRegionsBundleUnversionedPackagesTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.sling.feature.extension.apiregions.analyser;
+
+import org.apache.sling.feature.*;
+import org.apache.sling.feature.analyser.task.AnalyserTaskContext;
+import org.apache.sling.feature.extension.apiregions.api.ApiRegions;
+import org.apache.sling.feature.scanner.BundleDescriptor;
+import org.apache.sling.feature.scanner.FeatureDescriptor;
+import org.apache.sling.feature.scanner.impl.BundleDescriptorImpl;
+import org.apache.sling.feature.scanner.impl.FeatureDescriptorImpl;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+
+public class CheckApiRegionsBundleUnversionedPackagesTest {
+    private static File resourceRoot;
+
+    @BeforeClass
+    public static void setupClass() {
+        resourceRoot =
+                new File(CheckApiRegionsBundleUnversionedPackagesTest.class.
+                        getResource("/test-framework.jar").getFile()).getParentFile();
+    }
+
+    @Test
+    public void testId() {
+        assertEquals(ApiRegions.EXTENSION_NAME + "-unversioned-packages", new CheckApiRegionsBundleUnversionedPackages().getId());
+    }
+
+    @Test
+    public void testBundleUnversionedPackage() throws Exception {
+        CheckApiRegionsBundleUnversionedPackages t = new CheckApiRegionsBundleUnversionedPackages();
+
+        Feature f = new Feature(ArtifactId.fromMvnId("f:f:1"));
+        f.setComplete(true);
+        FeatureDescriptor fd = new FeatureDescriptorImpl(f);
+
+        fdAddBundle(fd, "g:b1:1", "test-bundle5.jar");
+
+        AnalyserTaskContext ctx = Mockito.mock(AnalyserTaskContext.class);
+        Mockito.when(ctx.getFeature()).thenReturn(f);
+        Mockito.when(ctx.getFeatureDescriptor()).thenReturn(fd);
+        t.execute(ctx);
+
+        Mockito.verify(ctx, Mockito.times(2)).reportArtifactWarning(Mockito.any(), Mockito.anyString());
+
+        Mockito.verify(ctx).reportArtifactWarning(
+                Mockito.eq(ArtifactId.fromMvnId("g:b1:1")),
+                Mockito.contains("org.foo.i"));
+        Mockito.verify(ctx).reportArtifactWarning(
+                Mockito.eq(ArtifactId.fromMvnId("g:b1:1")),
+                Mockito.contains("org.foo.e"));
+    }
+
+
+    private void fdAddBundle(FeatureDescriptor fd, String id, String file, ArtifactId... origins) throws IOException {
+        Artifact artifact = new Artifact(ArtifactId.fromMvnId(id));
+        artifact.setFeatureOrigins(origins);
+        BundleDescriptor bd1 = new BundleDescriptorImpl(
+                artifact, new File(resourceRoot, file).toURI().toURL(), 0);
+        fd.getBundleDescriptors().add(bd1);
+    }
+}
diff --git a/src/test/resources/test-bundle5.jar b/src/test/resources/test-bundle5.jar
new file mode 100644
index 0000000..cb5d2de
--- /dev/null
+++ b/src/test/resources/test-bundle5.jar
Binary files differ
