diff --git a/src/main/java/org/apache/netbeans/nbm/CreateClusterMojo.java b/src/main/java/org/apache/netbeans/nbm/CreateClusterMojo.java
index 3903d41..ad1b4c4 100644
--- a/src/main/java/org/apache/netbeans/nbm/CreateClusterMojo.java
+++ b/src/main/java/org/apache/netbeans/nbm/CreateClusterMojo.java
@@ -18,7 +18,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -41,165 +40,154 @@
 import org.codehaus.plexus.util.io.InputStreamFacade;
 
 /**
- * Create the NetBeans module clusters from reactor.
- * Semi-deprecated; used only for standalone modules and "suites".
+ * Create the NetBeans module clusters from reactor. Semi-deprecated; used only
+ * for standalone modules and "suites".
+ *
  * @author Milos Kleint
  */
-@Mojo( name = "cluster", aggregator = true, requiresDependencyResolution = ResolutionScope.RUNTIME )
+@Mojo(name = "cluster", aggregator = true, requiresDependencyResolution = ResolutionScope.RUNTIME)
 public class CreateClusterMojo
-        extends AbstractNbmMojo
-{
+        extends AbstractNbmMojo {
+
+    /**
+     * NetBeans module assembly build directory. directory where the the
+     * NetBeans jar and nbm file get constructed.
+     */
+    @Parameter(defaultValue = "${project.build.directory}/nbm", property = "maven.nbm.buildDir")
+    protected File nbmBuildDir;
+
+    /**
+     * NetBeans module's cluster. Replaces the cluster element in module
+     * descriptor.
+     *
+     */
+    @Parameter(required = true, defaultValue = "extra")
+    protected String cluster;
 
     /**
      * directory where the the NetBeans cluster will be created.
      */
-    @Parameter( defaultValue = "${project.build.directory}/netbeans_clusters", required = true )
-    protected File nbmBuildDir;
+    @Parameter(defaultValue = "${project.build.directory}/netbeans_clusters", required = true)
+    protected File clusterBuildDir;
 
     /**
      * default cluster value for reactor projects without cluster information,
      * typically OSGi bundles
+     *
      * @since 3.2
      */
-    @Parameter( defaultValue = "extra" )
+    @Parameter(defaultValue = "extra")
     private String defaultCluster;
     /**
-     * If the executed project is a reactor project, this will contains the full list of projects in the reactor.
+     * If the executed project is a reactor project, this will contains the full
+     * list of projects in the reactor.
      */
-    @Parameter( required = true, readonly = true, property = "reactorProjects" )
+    @Parameter(required = true, readonly = true, property = "reactorProjects")
     private List<MavenProject> reactorProjects;
 
     public void execute()
-        throws MojoExecutionException, MojoFailureException
-    {
+            throws MojoExecutionException, MojoFailureException {
         Project antProject = registerNbmAntTasks();
 
-        if ( !nbmBuildDir.exists() )
-        {
-            nbmBuildDir.mkdirs();
+        if (!clusterBuildDir.exists()) {
+            clusterBuildDir.mkdirs();
         }
 
-        if ( reactorProjects != null && reactorProjects.size() > 0 )
-        {
-            for ( MavenProject proj : reactorProjects )
-            {
-                //TODO how to figure where the the buildDir/nbm directory is
-                File nbmDir = new File( proj.getBasedir(),
-                        "target" + File.separator + "nbm" + File.separator + "netbeans" );
-                if ( nbmDir.exists() )
-                {
-                    Copy copyTask = (Copy) antProject.createTask( "copy" );
-                    copyTask.setTodir( nbmBuildDir );
-                    copyTask.setOverwrite( true );
-                    FileSet set = new FileSet();
-                    set.setDir( nbmDir );
-                    set.createInclude().setName( "**" );
-                    copyTask.addFileset( set );
+        if (reactorProjects != null && reactorProjects.size() > 0) {
+            for (MavenProject proj : reactorProjects) {
 
-                    try
-                    {
+                File nbmDir = new File(nbmBuildDir, "netbeans" + File.separator + cluster);
+
+                if (nbmDir.exists()) {
+                    Copy copyTask = (Copy) antProject.createTask("copy");
+                    copyTask.setTodir(clusterBuildDir);
+                    copyTask.setOverwrite(true);
+                    FileSet set = new FileSet();
+                    set.setDir(nbmDir);
+                    set.createInclude().setName("**");
+                    copyTask.addFileset(set);
+
+                    try {
                         copyTask.execute();
-                    }
-                    catch ( BuildException ex )
-                    {
-                        getLog().error( "Cannot merge modules into cluster" );
+                    } catch (BuildException ex) {
+                        getLog().error("Cannot merge modules into cluster");
                         throw new MojoExecutionException(
-                                "Cannot merge modules into cluster", ex );
+                                "Cannot merge modules into cluster", ex);
                     }
-                }
-                else
-                {
-                    if ( "nbm".equals( proj.getPackaging() ) )
-                    {
-                        String error =
-                            "The NetBeans binary directory structure for "
+                } else {
+                    if ("nbm".equals(proj.getPackaging())) {
+                        String error
+                                = "The NetBeans binary directory structure for "
                                 + proj.getId()
                                 + " is not created yet."
                                 + "\n Please execute 'mvn install nbm:cluster' to build all relevant projects in the reactor.";
-                        throw new MojoFailureException( error );
+                        throw new MojoFailureException(error);
                     }
-                    if ( "bundle".equals( proj.getPackaging() ) )
-                    {
+                    if ("bundle".equals(proj.getPackaging())) {
                         Artifact art = proj.getArtifact();
-                        final ExamineManifest mnf = new ExamineManifest( getLog() );
+                        final ExamineManifest mnf = new ExamineManifest(getLog());
 
-                        File jar = new File( proj.getBuild().getDirectory(), proj.getBuild().getFinalName() + ".jar" );
-                        if ( !jar.exists() )
-                        {
-                            getLog().error( "Skipping " + proj.getId()
-                                                + ". Cannot find the main artifact in output directory." );
+                        File jar = new File(proj.getBuild().getDirectory(), proj.getBuild().getFinalName() + ".jar");
+                        if (!jar.exists()) {
+                            getLog().error("Skipping " + proj.getId()
+                                    + ". Cannot find the main artifact in output directory.");
                             continue;
                         }
-                        mnf.setJarFile( jar );
+                        mnf.setJarFile(jar);
                         mnf.checkFile();
 
-                        File cluster = new File( nbmBuildDir, defaultCluster );
-                        getLog().debug( "Copying " + art.getId() + " to cluster " + defaultCluster );
-                        File modules = new File( cluster, "modules" );
+                        File cluster = new File(clusterBuildDir, defaultCluster);
+                        getLog().debug("Copying " + art.getId() + " to cluster " + defaultCluster);
+                        File modules = new File(cluster, "modules");
                         modules.mkdirs();
-                        File config = new File( cluster, "config" );
-                        File confModules = new File( config, "Modules" );
+                        File config = new File(cluster, "config");
+                        File confModules = new File(config, "Modules");
                         confModules.mkdirs();
-                        File updateTracting = new File( cluster, "update_tracking" );
+                        File updateTracting = new File(cluster, "update_tracking");
                         updateTracting.mkdirs();
 
                         final String cnb = mnf.getModule();
-                        final String cnbDashed = cnb.replace( ".", "-" );
-                        final File moduleArt = new File( modules, cnbDashed + ".jar" ); //do we need the file in some canotical name pattern?
+                        final String cnbDashed = cnb.replace(".", "-");
+                        final File moduleArt = new File(modules, cnbDashed + ".jar"); //do we need the file in some canotical name pattern?
                         final String specVer = mnf.getSpecVersion();
-                        try
-                        {
-                            FileUtils.copyFile( jar, moduleArt );
-                            final File moduleConf = new File( confModules, cnbDashed + ".xml" );
-                            FileUtils.copyStreamToFile( new InputStreamFacade()
-                            {
-                                public InputStream getInputStream() throws IOException
-                                {
-                                    return new StringInputStream( CreateClusterAppMojo.createBundleConfigFile( cnb, mnf.isBundleAutoload() ), "UTF-8" );
+                        try {
+                            FileUtils.copyFile(jar, moduleArt);
+                            final File moduleConf = new File(confModules, cnbDashed + ".xml");
+                            FileUtils.copyStreamToFile(new InputStreamFacade() {
+                                public InputStream getInputStream() throws IOException {
+                                    return new StringInputStream(CreateClusterAppMojo.createBundleConfigFile(cnb, mnf.isBundleAutoload()), "UTF-8");
                                 }
-                            }, moduleConf );
-                            FileUtils.copyStreamToFile( new InputStreamFacade()
-                            {
-                                public InputStream getInputStream() throws IOException
-                                {
-                                    return new StringInputStream( CreateClusterAppMojo.createBundleUpdateTracking( cnb, moduleArt, moduleConf, specVer ), "UTF-8" );
+                            }, moduleConf);
+                            FileUtils.copyStreamToFile(new InputStreamFacade() {
+                                public InputStream getInputStream() throws IOException {
+                                    return new StringInputStream(CreateClusterAppMojo.createBundleUpdateTracking(cnb, moduleArt, moduleConf, specVer), "UTF-8");
                                 }
-                            }, new File( updateTracting, cnbDashed + ".xml" ) );
-                        }
-                        catch ( IOException exc )
-                        {
-                            getLog().error( exc );
+                            }, new File(updateTracting, cnbDashed + ".xml"));
+                        } catch (IOException exc) {
+                            getLog().error(exc);
                         }
 
                     }
                 }
             }
             //in 6.1 the rebuilt modules will be cached if the timestamp is not touched.
-            File[] files = nbmBuildDir.listFiles();
-            for ( int i = 0; i < files.length; i++ )
-            {
-                if ( files[i].isDirectory() )
-                {
-                    File stamp = new File( files[i], ".lastModified" );
-                    if ( !stamp.exists() )
-                    {
-                        try
-                        {
+            File[] files = clusterBuildDir.listFiles();
+            for (int i = 0; i < files.length; i++) {
+                if (files[i].isDirectory()) {
+                    File stamp = new File(files[i], ".lastModified");
+                    if (!stamp.exists()) {
+                        try {
                             stamp.createNewFile();
-                        }
-                        catch ( IOException ex )
-                        {
+                        } catch (IOException ex) {
                             ex.printStackTrace();
                         }
                     }
-                    stamp.setLastModified( new Date().getTime() );
+                    stamp.setLastModified(new Date().getTime());
                 }
             }
-            getLog().info( "Created NetBeans module cluster(s) at " + nbmBuildDir );
-        }
-        else
-        {
-            throw new MojoExecutionException( "This goal only makes sense on reactor projects." );
+            getLog().info("Created NetBeans module cluster(s) at " + clusterBuildDir);
+        } else {
+            throw new MojoExecutionException("This goal only makes sense on reactor projects.");
         }
     }
 }
