diff --git a/winegrower-examples/simple/src/main/java/org/apache/winegrower/examples/Simple.java b/winegrower-examples/simple/src/main/java/org/apache/winegrower/examples/Simple.java
index 17abadf..c698b6c 100644
--- a/winegrower-examples/simple/src/main/java/org/apache/winegrower/examples/Simple.java
+++ b/winegrower-examples/simple/src/main/java/org/apache/winegrower/examples/Simple.java
@@ -13,17 +13,21 @@
  */
 package org.apache.winegrower.examples;
 
+import org.osgi.annotation.bundle.Header;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 
+import static org.osgi.framework.Constants.BUNDLE_ACTIVATOR;
+
+@Header(name = BUNDLE_ACTIVATOR, value = "${@class}")
 public class Simple implements BundleActivator {
 
-  public void start(BundleContext bundleContext) {
-    System.out.println("Starting simple winegrower application");
-  }
+    public void start(BundleContext bundleContext) {
+        System.out.println("Starting simple winegrower application");
+    }
 
-  public void stop(BundleContext bundleContext) {
-    System.out.println("Stopping simple winegrower application");
-  }
+    public void stop(BundleContext bundleContext) {
+        System.out.println("Stopping simple winegrower application");
+    }
 
 }
diff --git a/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/PourMojo.java b/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/PourMojo.java
index ecc0a3b..4760fe1 100644
--- a/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/PourMojo.java
+++ b/winegrower-extension/winegrower-build/winegrower-maven-plugin/src/main/java/org/apache/winegrower/extension/build/maven/PourMojo.java
@@ -90,7 +90,7 @@
                         new CountDownLatch(1).await();
                     } catch (final InterruptedException e) {
                         Thread.currentThread()
-                              .interrupt();
+                                .interrupt();
                     }
                 }
             };
@@ -114,12 +114,12 @@
 
     private ClassLoader createClassLoader(final ClassLoader parent) {
         final List<File> jars = Stream.concat(project.getArtifacts().stream()
-            .filter(a -> !((dependencyScopes == null && !(Artifact.SCOPE_COMPILE.equals(
-                a.getScope()) || Artifact.SCOPE_RUNTIME.equals(
-                a.getScope()))) || (dependencyScopes != null && !dependencyScopes.contains(
-                a.getScope()))))
-            .map(Artifact::getFile), Stream.of(project.getBuild().getOutputDirectory()).map(File::new).filter(File::exists))
-            .collect(toList());
+                .filter(a -> !((dependencyScopes == null && !(Artifact.SCOPE_COMPILE.equals(
+                        a.getScope()) || Artifact.SCOPE_RUNTIME.equals(
+                        a.getScope()))) || (dependencyScopes != null && !dependencyScopes.contains(
+                        a.getScope()))))
+                .map(Artifact::getFile), Stream.of(project.getBuild().getOutputDirectory()).map(File::new).filter(File::exists))
+                .collect(toList());
         final List<URL> urls = jars.stream().map(file -> {
             try {
                 return file.toURI().toURL();
@@ -128,9 +128,9 @@
             }
         }).collect(toList());
         final boolean excludeOsgi = jars.stream()
-             .anyMatch(it -> it.getName().startsWith("org.osgi.") || it.getName().startsWith("osgi."));
+                .anyMatch(it -> it.getName().startsWith("org.osgi.") || it.getName().startsWith("osgi."));
         final boolean hasWinegrower = jars.stream()
-             .anyMatch(it -> it.getName().startsWith("winegrower-core"));
+                .anyMatch(it -> it.getName().startsWith("winegrower-core"));
         if (excludeOsgi) {
             // add build-common
             final File buildCommon = Files.toFile(parent.getResource("org/apache/winegrower/extension/build/common/Run.class"));
@@ -163,11 +163,11 @@
                     }
                 }) {
 
-                    @Override
-                    public boolean equals(final Object obj) {
-                        return super.equals(obj) || parent.equals(obj);
-                    }
-                };
+            @Override
+            public boolean equals(final Object obj) {
+                return super.equals(obj) || parent.equals(obj);
+            }
+        };
     }
 
     private Object createConfiguration(final Class<?> configClass)
@@ -176,6 +176,8 @@
         ofNullable(workDir)
                 .ifPresent(value -> doCall(configuration, "setWorkDir", new Class<?>[]{File.class}, new Object[]{value}));
         ofNullable(prioritizedBundles)
+                .filter(it -> !it.isEmpty())
+                .map(it -> it.stream().filter(v -> !"empty".equals(v)).collect(toList()))
                 .ifPresent(value -> doCall(configuration, "setPrioritizedBundles", new Class<?>[]{List.class}, new Object[]{value}));
         ofNullable(ignoredBundles)
                 .ifPresent(value -> doCall(configuration, "setIgnoredBundles", new Class<?>[]{Collection.class}, new Object[]{value}));
@@ -184,27 +186,29 @@
         ofNullable(scanningExcludes)
                 .ifPresent(value -> doCall(configuration, "setScanningExcludes", new Class<?>[]{Collection.class}, new Object[]{value}));
         ofNullable(manifestContributors)
+                .filter(it -> !it.isEmpty())
                 .ifPresent(contributors -> {
                     try {
                         final Class<?> type = Thread.currentThread().getContextClassLoader().loadClass(
                                 "org.apache.winegrower.scanner.manifest.ManifestContributor");
                         final Collection<?> value = contributors.stream()
-                                                                .map(clazz -> {
-                                                                    try {
-                                                                        return Thread.currentThread()
-                                                                                     .getContextClassLoader()
-                                                                                     .loadClass(clazz)
-                                                                                     .getConstructor()
-                                                                                     .newInstance();
-                                                                    } catch (final InstantiationException | NoSuchMethodException | IllegalAccessException | ClassNotFoundException e) {
-                                                                        throw new IllegalArgumentException(e);
-                                                                    } catch (final InvocationTargetException e) {
-                                                                        throw new IllegalArgumentException(
-                                                                                e.getTargetException());
-                                                                    }
-                                                                })
-                                                                .map(type::cast)
-                                                                .collect(toList());
+                                .filter(it -> !"empty".equals(it))
+                                .map(clazz -> {
+                                    try {
+                                        return Thread.currentThread()
+                                                .getContextClassLoader()
+                                                .loadClass(clazz)
+                                                .getConstructor()
+                                                .newInstance();
+                                    } catch (final InstantiationException | NoSuchMethodException | IllegalAccessException | ClassNotFoundException e) {
+                                        throw new IllegalArgumentException(e);
+                                    } catch (final InvocationTargetException e) {
+                                        throw new IllegalArgumentException(
+                                                e.getTargetException());
+                                    }
+                                })
+                                .map(type::cast)
+                                .collect(toList());
                         doCall(configuration, "setManifestContributors", new Class<?>[]{Collection.class}, new Object[]{value});
                     } catch (final ClassNotFoundException e) {
                         throw new IllegalArgumentException(e);
@@ -216,7 +220,7 @@
                 .ifPresent(filter -> {
                     try {
                         final Predicate<String> predicate = (Predicate<String>) Thread.currentThread()
-                                                                                      .getContextClassLoader().loadClass(filter).getConstructor().newInstance();
+                                .getContextClassLoader().loadClass(filter).getConstructor().newInstance();
                         doCall(configuration, "setJarFilter", new Class<?>[]{Predicate.class}, new Object[]{predicate});
                     } catch (final InstantiationException | NoSuchMethodException | IllegalAccessException | ClassNotFoundException e) {
                         throw new IllegalArgumentException(e);
