diff --git a/nb-repository-plugin/.asf.yaml b/.asf.yaml
similarity index 90%
rename from nb-repository-plugin/.asf.yaml
rename to .asf.yaml
index a440864..23d956d 100644
--- a/nb-repository-plugin/.asf.yaml
+++ b/.asf.yaml
@@ -15,7 +15,7 @@
 # limitations under the License.
 
 github:
-  description: "Apache NetBeans Maven Utils to populate repository with Apache Maven NetBeans bits"
+  description: "This repository have been merged to https://github.com/apache/netbeans-mavenutils-nbm-maven-plugin/"
   homepage: https://netbeans.apache.org/
   labels:
     - netbeans
diff --git a/README.md b/README.md
new file mode 100755
index 0000000..b30128f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,27 @@
+<!--
+
+    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.
+
+-->
+
+# Migration Notice
+
+Content of this repository is archived and migrated to https://github.com/apache/netbeans-mavenutils-nbm-maven-plugin/
+
+
+
diff --git a/nb-repository-plugin/.github/dependabot.yml b/nb-repository-plugin/.github/dependabot.yml
deleted file mode 100644
index 06f98d8..0000000
--- a/nb-repository-plugin/.github/dependabot.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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.
-
-version: 2
-updates:
-  - package-ecosystem: "maven"
-    directory: "/"
-    target-branch: "master"
-    schedule:
-      interval: "daily"
-
diff --git a/nb-repository-plugin/.gitignore b/nb-repository-plugin/.gitignore
deleted file mode 100644
index 6dd1416..0000000
--- a/nb-repository-plugin/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-/target/
-/nbactions.xml
-/nb-configuration.xml
\ No newline at end of file
diff --git a/nb-repository-plugin/Jenkinsfile.groovy b/nb-repository-plugin/Jenkinsfile.groovy
deleted file mode 100644
index 6eb19ef..0000000
--- a/nb-repository-plugin/Jenkinsfile.groovy
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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.
- */
-
-asfStandardUtilitiesBuild()
diff --git a/nb-repository-plugin/LICENSE b/nb-repository-plugin/LICENSE
deleted file mode 100644
index de4b130..0000000
--- a/nb-repository-plugin/LICENSE
+++ /dev/null
@@ -1,204 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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.
-
-
diff --git a/nb-repository-plugin/NOTICE b/nb-repository-plugin/NOTICE
deleted file mode 100755
index 80bd77e..0000000
--- a/nb-repository-plugin/NOTICE
+++ /dev/null
@@ -1,13 +0,0 @@
-Apache NetBeans Utilities
-Copyright 2018-2022 The Apache Software Foundation
-
-This product includes software developed at
-The Apache Software Foundation (http://www.apache.org/).
-
-The code is based on Mojohaus Maven Utilities, that has been kindly donated to the Apache
-Software Foundation by Mojohaus Maven Utilities.
-
-Inceptor of the tools was Milos Kleint from the Mojohaus Maven Utilities in 2006
-Import was done from: https://github.com/mojohaus/nbm-maven-plugin/tree/80021ab48705a199513abdf2ad9fc339a8c000e2
-
-
diff --git a/nb-repository-plugin/README.md b/nb-repository-plugin/README.md
deleted file mode 100755
index 49eccea..0000000
--- a/nb-repository-plugin/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-<!--
-
-    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.
-
--->
-
-# Apache NetBeans Repository plugin
-
-[![Build Status](https://ci-builds.apache.org/buildStatus/icon?job=Netbeans%2Fnetbeans-maven-TLP%2Fnetbeans-mavenutils-nb-repository-plugin%2Fmaster)](https://ci-builds.apache.org/job/Netbeans/job/netbeans-maven-TLP/job/netbeans-mavenutils-nb-repository-plugin/job/master/)
-
-[Documentation Site](https://bits.netbeans.org/mavenutilities/nb-repository-plugin)
-
-### Get In Touch
-
-[Subscribe](mailto:users-subscribe@netbeans.apache.org) or [mail](mailto:users@netbeans.apache.org) the [users@netbeans.apache.org](mailto:users@netbeans.apache.org) list - Ask questions, find answers, and also help other users.
-
-[Subscribe](mailto:dev-subscribe@netbeans.apache.org) or [mail](mailto:dev@netbeans.apache.org) the [dev@netbeans.apache.org](mailto:dev@netbeans.apache.org) list - Join developement discussions, propose new ideas and connect with contributors.
-
-### Reporting Bugs
-
-Bugs should be reported to https://issues.apache.org/jira/projects/NETBEANSINFRA/issues/ using the component **MU - Apache NetBeans repository plugin**
-
diff --git a/nb-repository-plugin/pom.xml b/nb-repository-plugin/pom.xml
deleted file mode 100644
index 8b92b13..0000000
--- a/nb-repository-plugin/pom.xml
+++ /dev/null
@@ -1,384 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-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.
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <groupId>org.apache.netbeans.utilities</groupId>
-        <artifactId>utilities-parent</artifactId>
-        <version>2</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>nb-repository-plugin</artifactId>
-    <version>1.8-SNAPSHOT</version>
-    <packaging>maven-plugin</packaging>
-
-    <name>Apache NetBeans Maven Utilities - NB Repository Plugin</name>
-    <description>Maven plugin for creating Maven Repository out of a NetBeans installation (and other sources) for consumption by the projects using nbm-maven-plugin.
-    </description>
-    <inceptionYear>2005</inceptionYear>
-    <url>https://bits.netbeans.org/mavenutilities/nb-repository-plugin</url>
-    <issueManagement>
-        <system>jira</system>
-        <url>https://issues.apache.org/jira/browse/NETBEANSINFRA</url>
-    </issueManagement>
-    <prerequisites>
-        <maven>3.1.1</maven>
-    </prerequisites>
-    <licenses>
-        <license>
-            <name>Apache License 2</name>
-            <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-    <scm>
-        <connection>scm:git:https://gitbox.apache.org/repos/asf/netbeans-mavenutils-nb-repository-plugin.git</connection>
-        <developerConnection>scm:git:https://gitbox.apache.org/repos/asf/netbeans-mavenutils-nb-repository-plugin.git</developerConnection>
-        <url>https://github.com/apache/netbeans-mavenutils-nb-repository-plugin</url>
-      <tag>HEAD</tag>
-    </scm>
-    <!-- TODO need to override parent version value... I suppose this will eventually end up in mojo parent pom, check regularly -->    
-
-    <build>
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-checkstyle-plugin</artifactId>
-                    <version>3.1.2</version>
-                    <dependencies>
-                        <dependency>
-                            <groupId>com.puppycrawl.tools</groupId>
-                            <artifactId>checkstyle</artifactId>
-                            <!-- last jdk 8 compatible version -->
-                            <version>9.3</version>
-                        </dependency>
-                    </dependencies>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-        <plugins>
-            <plugin>
-                <!-- TODO need to override parent version value... I suppose this will eventually end up in mojo parent pom, check regularly -->
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-plugin-plugin</artifactId>
-                <version>3.6.4</version>
-                <configuration>
-                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>mojo-descriptor</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>descriptor</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>help-goal</id>
-                        <goals>
-                            <goal>helpmojo</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>animal-sniffer-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>check</goal>
-                        </goals>
-                        <configuration>
-                            <signature>
-                                <groupId>org.codehaus.mojo.signature</groupId>
-                                <artifactId>java18</artifactId>
-                                <version>1.0</version>
-                            </signature>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-site-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-project-info-reports-plugin</artifactId>
-                <reportSets>
-                    <reportSet>
-                        <reports>
-                            <report>plugins</report>
-                            <!-- <report>cim</report> -->
-                        </reports>
-                    </reportSet>
-                </reportSets>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-changes-plugin</artifactId>
-                <configuration>
-                    <!-- configure github milestone ? -->
-                    <!--<onlyMilestoneIssues>false</onlyMilestoneIssues>
-                    <onlyCurrentVersion>false</onlyCurrentVersion>-->
-                    <!--<skip>true</skip>-->
-                    <component>12336704</component>
-                </configuration>
-               
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-checkstyle-plugin</artifactId>                           
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jxr-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-plugin-plugin</artifactId>
-                <version>3.6.4</version>
-                <configuration>
-                    <requirements>
-                        <!--
-                        NOTE: Maven 2.x does not interpolate properties of the form project.*|pom.* so the Maven Plugin Plugin
-                        gets garbage when manually examining the config of the Maven Compiler Plugin.
-                        -->
-                        <jdk>${mojo.java.target}</jdk>
-                    </requirements>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <quiet>true</quiet>
-                    <source>8</source>
-                    <links>
-                        <!--<link>http://download-llnw.oracle.com/javaee/1.4/api/</link>-->
-                        <link>https://commons.apache.org/proper/commons-collections/javadocs/api-3.2.2/</link>
-                        <link>http://commons.apache.org/dbcp/apidocs/</link>
-                        <link>http://commons.apache.org/fileupload/apidocs/</link>
-                        <link>http://commons.apache.org/logging/apidocs/</link>
-                        <link>http://commons.apache.org/pool/apidocs/</link>
-                        <link>http://junit.sourceforge.net/javadoc/</link>
-                        <link>http://logging.apache.org/log4j/1.2/apidocs/</link>
-                        <!-- unreachable site <link>http://jakarta.apache.org/regexp/apidocs/</link> -->
-                        <link>https://velocity.apache.org/engine/1.5/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-artifact/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-model/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-plugin-api/apidocs/</link>
-                        <link>https://maven.apache.org/shared/maven-reporting-api/apidocs/</link>
-                        <link>http://maven.apache.org/ref/${maven.version}/maven-settings/apidocs/</link>
-                    </links>
-                    <tagletArtifacts>
-                        <tagletArtifact>
-                            <groupId>org.apache.maven.plugin-tools</groupId>
-                            <artifactId>maven-plugin-tools-javadoc</artifactId>
-                        </tagletArtifact>
-                        <tagletArtifact>
-                            <groupId>org.codehaus.plexus</groupId>
-                            <artifactId>plexus-component-javadoc</artifactId>
-                            <version>1.6</version>
-                        </tagletArtifact>
-                    </tagletArtifacts>
-                </configuration>
-               
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-pmd-plugin</artifactId>
-               <configuration>
-                    <targetJdk>1.8</targetJdk>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-linkcheck-plugin</artifactId>
-                <configuration>
-                    <excludedLinks>
-                        <excludedLink>../../images/codehaus-small.png</excludedLink>
-                        <excludedLink>../../images/mojo_logo.png</excludedLink>
-                        <excludedLink>plugin-info.html</excludedLink>
-                    </excludedLinks>
-                    <!--<excludedPages>
-                        <excludedPage>dependencies.html</excludedPage> 
-                    </excludedPages>-->
-                </configuration>	       
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>taglist-maven-plugin</artifactId>
-                <version>3.0.0</version>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.rat</groupId>
-                <artifactId>apache-rat-plugin</artifactId>
-                <version>0.13</version>
-            </plugin>
-        </plugins>
-    </reporting>
-    <profiles>
-        <profile>
-            <id>run-its</id>
-            <build>
-
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-invoker-plugin</artifactId>
-                        <version>3.3.0</version>
-                        <configuration>
-                            <debug>false</debug>
-                            <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
-                            <pomIncludes>
-                                <pomInclude>*/pom.xml</pomInclude>
-                            </pomIncludes>
-                            <postBuildHookScript>verify</postBuildHookScript>
-                            <localRepositoryPath>${project.build.directory}/local-repo</localRepositoryPath>
-                            <settingsFile>src/it/settings.xml</settingsFile>
-                            <goals>
-                                <!-- default build in netbeans IDE -->
-                                <goal>clean</goal>
-                                <goal>install</goal>
-                            </goals>
-                            <filterProperties>
-                                <netbeans.version>RELEASE110</netbeans.version> 
-                            </filterProperties>
-                        </configuration>
-                        <executions>
-                            <execution>
-                                <id>integration-test</id>
-                                <goals>
-                                    <goal>install</goal>
-                                    <goal>integration-test</goal>
-                                    <goal>verify</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-
-            </build>
-        </profile>
-    </profiles>
-    <!--profiles>
-        <profile>
-            <id>tools.jar</id>
-            <activation>
-                <file>
-                    <exists>${java.home}/../lib/tools.jar</exists>
-                </file>
-            </activation>
-            <dependencies>
-                <dependency>
-                    <groupId>com.sun</groupId>
-                    <artifactId>tools</artifactId>
-                    <version>1.5.0</version>
-                    <scope>system</scope>
-                    <systemPath>${java.home}/../lib/tools.jar</systemPath>
-                </dependency>
-            </dependencies>
-        </profile>
-    </profiles-->
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-plugin-api</artifactId>
-            <version>${maven.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugin-tools</groupId>
-            <artifactId>maven-plugin-annotations</artifactId>
-            <version>3.6.4</version>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.codehaus.plexus</groupId>
-            <artifactId>plexus-utils</artifactId>
-            <version>3.4.2</version>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-model</artifactId>
-            <version>${maven.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-core</artifactId>
-            <version>${maven.version}</version>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven.plugin-testing</groupId>
-            <artifactId>maven-plugin-testing-harness</artifactId>
-            <version>3.3.0</version>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.maven</groupId>
-            <artifactId>maven-compat</artifactId>
-            <version>${maven.version}</version>
-            <type>jar</type>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.ant</groupId>
-            <artifactId>ant</artifactId>
-            <version>1.10.12</version>
-            <scope>compile</scope>
-            <type>jar</type>
-        </dependency>
-        <dependency>
-            <groupId>${project.groupId}</groupId>
-            <artifactId>nb-shared</artifactId>
-            <version>1.4</version>
-        </dependency>
-    </dependencies>
-    <properties>
-        <mojo.java.target>1.8</mojo.java.target>
-        <maven.version>3.8.5</maven.version>
-    </properties>
-</project>
diff --git a/nb-repository-plugin/src/it/folder/pom.xml b/nb-repository-plugin/src/it/folder/pom.xml
deleted file mode 100644
index 6013933..0000000
--- a/nb-repository-plugin/src/it/folder/pom.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.apache.netbeans.utilities</groupId>
-        <artifactId>nb-repository-plugin-it-root</artifactId>
-        <version>1.0-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-    <artifactId>nb-repository-plugin-it-single-module</artifactId>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.netbeans.utilities</groupId>
-                <artifactId>nb-repository-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <phase>install</phase>
-                        <goals>
-                            <goal>download</goal>
-                        </goals>
-                        <configuration>
-                            <nexusIndexDirectory>${project.build.directory}/indextest</nexusIndexDirectory>
-                            <repositoryUrl>https://repo1.maven.org/maven2</repositoryUrl>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
\ No newline at end of file
diff --git a/nb-repository-plugin/src/it/pom.xml b/nb-repository-plugin/src/it/pom.xml
deleted file mode 100644
index fd5d5d2..0000000
--- a/nb-repository-plugin/src/it/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <groupId>org.apache.netbeans.utilities</groupId>
-    <artifactId>nb-repository-plugin-it-root</artifactId>
-    <version>1.0-SNAPSHOT</version>
-    <packaging>pom</packaging>
-  
-    <build>
-        <pluginManagement>
-            <plugins>
-               
-                <plugin>  
-                    <groupId>@project.groupId@</groupId>
-                    <artifactId>@project.artifactId@</artifactId>  
-                    <version>@project.version@</version>
-                </plugin>
-                <!--<plugin>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>@compilerPluginVersion@</version>
-                    <configuration>
-                        <source>@testJavaVersion@</source>
-                        <target>@testJavaVersion@</target>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>@surefirePluginVersion@</version>
-                </plugin>-->
-            </plugins>
-        </pluginManagement>
-    </build>
-    <properties>
-        <jar.plugin.version>3.0.2</jar.plugin.version>
-    </properties>
-</project>
\ No newline at end of file
diff --git a/nb-repository-plugin/src/it/settings.xml b/nb-repository-plugin/src/it/settings.xml
deleted file mode 100644
index 5ee363c..0000000
--- a/nb-repository-plugin/src/it/settings.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-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.
--->
-
-<settings>
-    <profiles>
-        <profile>
-            <id>it-repo</id>
-            <activation>
-                <activeByDefault>true</activeByDefault>
-            </activation>
-            <repositories>
-                <repository>
-                    <id>local.central</id>
-                    <url>@localRepositoryUrl@</url>
-                    <releases>
-                        <enabled>true</enabled>
-                    </releases>
-                    <snapshots>
-                        <enabled>true</enabled>
-                    </snapshots>
-                </repository>
-            </repositories>
-            <pluginRepositories>
-                <pluginRepository>
-                    <id>local.central</id>
-                    <url>@localRepositoryUrl@</url>
-                    <releases>
-                        <enabled>true</enabled>
-                    </releases>
-                    <snapshots>
-                        <enabled>true</enabled>
-                    </snapshots>
-                </pluginRepository>
-            </pluginRepositories>
-        </profile>
-    </profiles>
-</settings>
diff --git a/nb-repository-plugin/src/main/java/org/apache/netbeans/nbm/repository/PopulateRepositoryMojo.java b/nb-repository-plugin/src/main/java/org/apache/netbeans/nbm/repository/PopulateRepositoryMojo.java
deleted file mode 100644
index cb2ac49..0000000
--- a/nb-repository-plugin/src/main/java/org/apache/netbeans/nbm/repository/PopulateRepositoryMojo.java
+++ /dev/null
@@ -1,1357 +0,0 @@
-package org.apache.netbeans.nbm.repository;
-
-/*
- * 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.
- */
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.math.BigInteger;
-import java.nio.file.Files;
-import java.security.DigestOutputStream;
-import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import java.util.jar.Attributes;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-import java.util.jar.JarOutputStream;
-import java.util.jar.Manifest;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.deployer.ArtifactDeployer;
-import org.apache.maven.artifact.deployer.ArtifactDeploymentException;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.handler.ArtifactHandler;
-import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.artifact.installer.ArtifactInstallationException;
-import org.apache.maven.artifact.installer.ArtifactInstaller;
-import org.apache.maven.artifact.metadata.ArtifactMetadata;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
-import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
-import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
-import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
-import org.apache.maven.artifact.resolver.AbstractArtifactResolutionException;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
-import org.apache.maven.model.Dependency;
-import org.apache.maven.model.Model;
-import org.apache.maven.model.Parent;
-import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
-import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugins.annotations.Component;
-import org.apache.maven.plugins.annotations.Mojo;
-import org.apache.maven.plugins.annotations.Parameter;
-import org.apache.maven.project.artifact.AttachedArtifact;
-import org.apache.maven.project.artifact.ProjectArtifactMetadata;
-import org.apache.netbeans.nbm.utils.AbstractNetbeansMojo;
-import org.apache.netbeans.nbm.utils.ExamineManifest;
-import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Input;
-import org.apache.tools.ant.taskdefs.PathConvert;
-import org.apache.tools.ant.types.FileSet;
-import org.codehaus.plexus.util.IOUtil;
-
-/**
- * A goal for identifying NetBeans modules from the installation and populating the local
- * repository with them. Optionally you can also deploy to a remote repository.
- * <p>
- * If you are looking for an existing remote repository for NetBeans artifacts, check out <a href="https://search.maven.org/">Maven Central</a>.
- * <a href="http://bits.netbeans.org/nexus/content/groups/netbeans/">http://bits.netbeans.org/nexus/content/groups/netbeans/</a>,
- * contains contains API artifacts for older NetBeans releases.
- * <a href="https://repository.apache.org/content/groups/snapshots">https://repository.apache.org/content/groups/snapshots</a>
- * may also be used for <code>dev-SNAPSHOT</code> artifacts if you wish to test development builds.
- * </p>
- * <p>
- * See this <a href="repository.html">HOWTO</a> on how to generate the NetBeans binaries required
- * by this goal.
- * </p>
- *
- * @author Milos Kleint
- */
-@Mojo( name = "populate", aggregator = true, requiresProject = false )
-public class PopulateRepositoryMojo
-    extends AbstractNetbeansMojo
-{
-    private static final String GROUP_API = ".api";
-    private static final String GROUP_IMPL = ".modules";
-    private static final String GROUP_EXTERNAL = ".external";
-    private static final String GROUP_CLUSTER = ".cluster";
-
-
-    /**
-     * a prefix for groupId of generated content,
-     * eg. for org.netbeans value will generate org.netbeans.cluster groupId for clusters and org.netbeans.modules for module artifacts.
-     * @since 1.2
-     */
-    @Parameter( property = "groupIdPrefix", defaultValue = "org.netbeans" )
-    private String groupIdPrefix;
-
-    /**
-     * an url where to deploy the NetBeans artifacts. Optional, if not specified, the artifacts will be only installed
-     * in local repository, if you need to give credentials to access remote repo, the id of the server is hardwired to "netbeans".
-     */
-    @Parameter( property = "deployUrl" )
-    private String deployUrl;
-
-    /**
-     * an string id representing the server
-     */
-    @Parameter( defaultValue = "netbeans" , property = "deployId" )
-    private String deployId;
-
-    /**
-     * By default the generated metadata is installed in local repository.
-     * Setting this parameter to false will avoid installing the bits. Only meaningful together with
-     * a defined "deployUrl" parameter.
-     * @since 3.0
-     */
-    @Parameter( defaultValue = "false", property = "skipInstall" )
-    private boolean skipLocalInstall;
-
-
-    /**
-     * Location of NetBeans installation
-     */
-    @Parameter( property = "netbeansInstallDirectory", required = true )
-    protected File netbeansInstallDirectory;
-
-    /**
-     * If you want to install/deploy also NetBeans api javadocs, download the javadoc zip file from netbeans.org
-     * expand it to a directory, it should contain multiple zip files. Define this parameter as absolute path to the zip files folder.
-     *
-     */
-    @Parameter( property = "netbeansJavadocDirectory" )
-    protected File netbeansJavadocDirectory;
-
-    /**
-     * Assumes a folder with &lt;code-name-base&gt;.zip files containing sources for modules.
-     */
-    @Parameter( property = "netbeansSourcesDirectory" )
-    protected File netbeansSourcesDirectory;
-
-    /**
-     * If defined, will match the nbm files found in the designated folder with the modules
-     * and upload the nbm file next to the module jar in local and remote repositories.
-     *
-     * Assumes a folder with &lt;code-name-base&gt;.nbm files containing nbm files for modules.
-     * @since 3.0
-     */
-    @Parameter( property = "netbeansNbmDirectory", required = true )
-    protected File netbeansNbmDirectory;
-
-    /**
-     * When specified, will force all modules to have the designated version.
-     * Good when depending on releases. Then you would for example specify RELEASE50 in this parameter and
-     * all modules get this version in the repository. If not defined, the maven version is
-     * derived from the OpenIDE-Module-Specification-Version manifest attribute.
-     * <p>
-     * Highly Recommended!
-     * </p>
-     */
-    @Parameter( property = "forcedVersion" )
-    protected String forcedVersion;
-
-    /**
-     * When specified it points to a file containing a merge of all binaries-list
-     * sha1;coordinate;module
-     * Any dependencies not found this way, will be generated with a unique
-     * id under the org.netbeans.external groupId.
-     * <p/>
-     * @since 1.16
-     */
-    @Parameter( property = "externallist" )
-    private File externallist;
-
-    /**
-     * Whether to create cluster POMs in the {@code org.netbeans.cluster} group.
-     * Only meaningful when {@code forcedVersion} is defined.
-     * @since 3.7
-     */
-    @Parameter( defaultValue = "true", property = "defineCluster" )
-    private boolean defineCluster;
-
-    /**
-     * Optional remote repository to use for inspecting remote dependencies.
-     * This may be used to populate just part of an installation,
-     * when base modules are already available in Maven format.
-     * Currently only supported when {@code forcedVersion} is defined.
-     * @since 3.7
-     */
-    @Parameter( property = "dependencyRepositoryUrl" )
-    private String dependencyRepositoryUrl;
-
-    /**
-     * Repository ID to use when inspecting remote dependencies.
-     * Only meaningful when {@code dependencyRepositoryUrl} is defined.
-     * @since 3.7
-     */
-    @Parameter( defaultValue = "temp", property = "dependencyRepositoryId" )
-    private String dependencyRepositoryId;
-
-    /**
-     * Colon separated artefact coordinate groupId:artefactId:version that
-     * represent parent to be used
-     *
-     * @since 1.4
-     */
-    @Parameter( property = "parentGAV", required = false )
-    private String parentGAV;
-
-    // <editor-fold defaultstate="collapsed" desc="Component parameters">
-    /**
-     * Local maven repository.
-     */
-    @Parameter( required = true, readonly = true, defaultValue = "${localRepository}" )
-    protected ArtifactRepository localRepository;
-
-    /**
-     * Maven ArtifactFactory.
-     */
-    @Component
-    private ArtifactFactory artifactFactory;
-
-    /**
-     * Maven ArtifactInstaller.
-     */
-    @Component
-    private ArtifactInstaller artifactInstaller;
-
-    /**
-     * Maven ArtifactDeployer.
-     *
-     */
-    @Component
-    private ArtifactDeployer artifactDeployer;
-
-    /**
-     * Maven ArtifactHandlerManager
-     *
-     */
-    @Component
-    private ArtifactHandlerManager artifactHandlerManager;
-
-    /**
-     * Maven ArtifactRepositoryFactory.
-     *
-     */
-    @Component
-    private ArtifactRepositoryFactory repositoryFactory;
-
-    @Component
-    private ArtifactResolver artifactResolver;
-
-    @Component
-    private ArtifactRepositoryLayout artifactRepositoryLayout;
-// </editor-fold>
-
-    // parent handler in case we have one
-    private Parent artefactParent = null;
-
-    @Override
-    public void execute()
-        throws MojoExecutionException
-    {
-        getLog().info( "Populate repository with NetBeans modules" );
-        Project antProject = antProject();
-        ArtifactRepository deploymentRepository = null;
-
-        if ( parentGAV != null )
-        {
-            // populate artefactParent
-            artefactParent = new Parent();
-            String[] split = parentGAV.split( ":" );
-            if ( split.length != 3 )
-            {
-                throw new MojoExecutionException(
-                    "parentGAV should respect the following format groupId:artefactId:version" );
-            }
-            artefactParent.setGroupId( split[0] );
-            artefactParent.setArtifactId( split[1] );
-            artefactParent.setVersion( split[2] );
-        }
-
-        if ( deployUrl != null )
-        {
-            ArtifactRepositoryLayout layout = new DefaultRepositoryLayout();
-            deploymentRepository = repositoryFactory.createDeploymentArtifactRepository(
-                deployId, deployUrl, layout, true );
-        }
-        else if ( skipLocalInstall )
-        {
-            throw new MojoExecutionException(
-                    "When skipping install to local repository, one shall define the deployUrl parameter" );
-        }
-
-        if ( netbeansInstallDirectory == null )
-        {
-            Input input = (Input) antProject.createTask( "input" );
-            input.setMessage( "Please enter NetBeans installation directory:" );
-            input.setAddproperty( "installDir" );
-            try
-            {
-                input.execute();
-            }
-            catch ( BuildException e )
-            {
-                getLog().error( "Cannot run ant:input" );
-                throw new MojoExecutionException( e.getMessage(), e );
-            }
-            String prop = antProject.getProperty( "installDir" );
-            netbeansInstallDirectory = new File( prop );
-        }
-
-        File rootDir = netbeansInstallDirectory;
-        if ( !rootDir.exists() )
-        {
-            getLog().error( "NetBeans installation doesn't exist." );
-            throw new MojoExecutionException( "NetBeans installation doesn't exist." );
-        }
-        getLog().info( "Copying NetBeans artifacts from " + netbeansInstallDirectory );
-
-        PathConvert convert = (PathConvert) antProject.createTask( "pathconvert" );
-        convert.setPathSep( "," );
-        convert.setProperty( "netbeansincludes" );
-        FileSet set = new FileSet();
-        set.setDir( rootDir );
-        set.createInclude().setName( "**/modules/*.jar" );
-        set.createInclude().setName( "*/core/*.jar" );
-        set.createInclude().setName( "platform*/lib/*.jar" );
-
-        convert.createPath().addFileset( set );
-        try
-        {
-            convert.execute();
-        }
-        catch ( BuildException e )
-        {
-            getLog().error( "Cannot run ant:pathconvert" );
-            throw new MojoExecutionException( e.getMessage(), e );
-        }
-
-        String prop = antProject.getProperty( "netbeansincludes" );
-        StringTokenizer tok = new StringTokenizer( prop, "," );
-        Map<ModuleWrapper, Artifact> moduleDefinitions = new HashMap<>();
-        Map<String, Collection<ModuleWrapper>> clusters = new HashMap<>();
-        while ( tok.hasMoreTokens() )
-        {
-            String token = tok.nextToken();
-            File module = new File( token );
-            String clust = module.getAbsolutePath().substring( rootDir.getAbsolutePath().length() + 1 );
-            clust = clust.substring( 0, clust.indexOf( File.separator ) );
-            ExamineManifest examinator = new ExamineManifest( getLog() );
-            examinator.setPopulateDependencies( true );
-            examinator.setJarFile( module );
-            examinator.checkFile();
-            if ( examinator.isNetBeansModule() || examinator.isOsgiBundle() )
-            {
-                //TODO get artifact id from the module's manifest?
-                String artifact = module.getName().substring( 0, module.getName().indexOf( ".jar" ) );
-                if ( "boot".equals( artifact ) )
-                {
-                    artifact = "org-netbeans-bootstrap";
-                }
-                if ( "core".equals( artifact ) )
-                {
-                    artifact = "org-netbeans-core-startup";
-                }
-                if ( "core-base".equals( artifact ) )
-                {
-                    artifact = "org-netbeans-core-startup-base";
-                }
-                String version = forcedVersion == null ? examinator.getSpecVersion() : forcedVersion;
-                String group = groupIdPrefix + ( examinator.isOsgiBundle() ? GROUP_EXTERNAL : examinator.hasPublicPackages() ? GROUP_API : GROUP_IMPL );
-                Artifact art = createArtifact( artifact, version, group );
-                ModuleWrapper wr = new ModuleWrapper( artifact, version, group, examinator, module );
-                if ( examinator.isOsgiBundle() )
-                {
-                    Dependency dep = findExternal( module );
-                    if ( dep != null )
-                    {
-
-                        art = createArtifact( dep.getArtifactId(), dep.getVersion(), dep.getGroupId() );
-                        group = dep.getGroupId();
-                        version = dep.getVersion();
-                        wr = new ModuleWrapperMaven( artifact, version, group, examinator, module , dep );
-                    }
-                }
-                wr.setCluster( clust );
-                moduleDefinitions.put( wr, art );
-                Collection<ModuleWrapper> col = clusters.get( clust );
-                if ( col == null )
-                {
-                    col = new ArrayList<>();
-                    clusters.put( clust, col );
-                }
-                col.add( wr );
-            }
-        }
-
-        File javadocRoot = null;
-        if ( netbeansJavadocDirectory != null )
-        {
-            javadocRoot = netbeansJavadocDirectory ;
-            if ( !javadocRoot.exists() )
-            {
-                javadocRoot = null;
-                throw new MojoExecutionException(
-                    "The netbeansJavadocDirectory parameter doesn't point to an existing folder" );
-            }
-        }
-        File sourceRoot = null;
-        if ( netbeansSourcesDirectory != null )
-        {
-            sourceRoot = netbeansSourcesDirectory;
-            if ( !sourceRoot.exists() )
-            {
-                sourceRoot = null;
-                throw new MojoExecutionException(
-                    "The netbeansSourceDirectory parameter doesn't point to an existing folder" );
-            }
-        }
-
-        File nbmRoot = null;
-        if ( netbeansNbmDirectory != null )
-        {
-            nbmRoot = netbeansNbmDirectory;
-            if ( !nbmRoot.exists() )
-            {
-                nbmRoot = null;
-                throw new MojoExecutionException(
-                    "The nbmDirectory parameter doesn't point to an existing folder" );
-            }
-        }
-        List<ModuleWrapper> wrapperList = new ArrayList<>( moduleDefinitions.keySet() );
-        // artifact that we need to populate
-        Map<ModuleWrapper, Artifact> tobePopulated = new HashMap<>();
-        // external artefacts
-        Map<ModuleWrapper, Artifact> oncentralWrapper = new HashMap<>();
-        // triage
-        for ( Map.Entry<ModuleWrapper, Artifact> entry : moduleDefinitions.entrySet() )
-        {
-            if ( entry.getKey() instanceof ModuleWrapperMaven )
-            {
-                oncentralWrapper.put( entry.getKey(), entry.getValue() );
-            }
-            else
-            {
-                tobePopulated.put( entry.getKey(), entry.getValue() );
-            }
-        }
-        List<ExternalsWrapper> externals = new ArrayList<>();
-        int count = tobePopulated.size() + 1;
-        int index = 0;
-
-
-        try
-        {
-            for ( Map.Entry<ModuleWrapper, Artifact> elem : tobePopulated.entrySet() )
-            {
-                ModuleWrapper man = elem.getKey();
-                Artifact art = elem.getValue();
-                index = index + 1;
-                getLog().info( "Processing " + index + "/" + count );
-                File pom = createMavenProject( man, wrapperList, externals );
-                ArtifactMetadata metadata = new ProjectArtifactMetadata( art, pom );
-                art.addMetadata( metadata );
-                File javadoc = null;
-                Artifact javadocArt = null;
-                if ( javadocRoot != null )
-                {
-                    File zip = new File( javadocRoot, art.getArtifactId() + ".zip" );
-                    if ( zip.exists() )
-                    {
-                        javadoc = zip;
-                        javadocArt = createAttachedArtifact( art, javadoc, "jar", "javadoc" );
-                    }
-                }
-                File source = null;
-                Artifact sourceArt = null;
-                if ( sourceRoot != null )
-                {
-                    File zip = new File( sourceRoot, art.getArtifactId() + ".zip" );
-                    if ( zip.exists() )
-                    {
-                        source = zip;
-                        sourceArt = createAttachedArtifact( art, source, "jar", "sources" );
-                    }
-                }
-                File nbm = null;
-                Artifact nbmArt = null;
-                if ( nbmRoot != null )
-                {
-                    File zip = new File( nbmRoot, art.getArtifactId() + ".nbm" );
-
-                    if ( !zip.exists() )
-                    {
-                        zip = new File( nbmRoot,
-                            man.getCluster() + File.separator + art.getArtifactId() + ".nbm" );
-                    }
-                    if ( zip.exists() )
-                    {
-                        nbm = zip;
-                        nbmArt = createAttachedArtifact( art, nbm, "nbm-file", null );
-                        if ( nbmArt.getArtifactHandler().getExtension().equals( "nbm-file" ) )
-                        {
-                            // Maven 2.x compatibility.
-                            nbmArt = createAttachedArtifact( art, nbm, "nbm", null );
-                        }
-                        assert nbmArt.getArtifactHandler().getExtension().equals( "nbm" );
-                    }
-                }
-                File moduleJar = man.getFile();
-                File moduleJarMinusCP = null;
-                if ( ! man.getModuleManifest().getClasspath().isEmpty() )
-                {
-                    try
-                    {
-                        moduleJarMinusCP = File.createTempFile( man.getArtifact(), ".jar" );
-                        moduleJarMinusCP.deleteOnExit();
-                        InputStream is = new FileInputStream( moduleJar );
-                        try
-                        {
-                            OutputStream os = new FileOutputStream( moduleJarMinusCP );
-                            try
-                            {
-                                JarInputStream jis = new JarInputStream( is );
-                                Manifest mani = new Manifest( jis.getManifest() );
-                                mani.getMainAttributes().remove( Attributes.Name.CLASS_PATH );
-                                if ( !man.deps.isEmpty() )
-                                { // MNBMODULE-132
-                                    StringBuilder b = new StringBuilder();
-                                    for ( Dependency dep : man.deps )
-                                    {
-                                        if ( b.length() > 0 )
-                                        {
-                                            b.append( ' ' );
-                                        }
-                                        b.append( dep.getGroupId() ).append( ':' ).append( dep.getArtifactId() ).append( ':' ).append( dep.getVersion() );
-                                        if ( dep.getClassifier() != null )
-                                        {
-                                            b.append( ":" ).append( dep.getClassifier() );
-                                        }
-                                    }
-                                    mani.getMainAttributes().putValue( "Maven-Class-Path", b.toString() );
-                                }
-                                else
-                                {
-                                    getLog().warn( "did not find any external artifacts for " + man.getModule() );
-                                }
-                                JarOutputStream jos = new JarOutputStream( os, mani );
-                                JarEntry entry;
-                                while ( ( entry = jis.getNextJarEntry() ) != null )
-                                {
-                                    if ( entry.getName().matches( "META-INF/.+[.]SF" ) )
-                                    {
-                                        throw new IOException( "cannot handle signed JARs" );
-                                    }
-                                    jos.putNextEntry( entry );
-                                    byte[] buf = new byte[(int) entry.getSize()];
-                                    int read = jis.read( buf, 0, buf.length );
-                                    if ( read != buf.length )
-                                    {
-                                        throw new IOException( "read wrong amount" );
-                                    }
-                                    jos.write( buf );
-                                }
-                                jos.close();
-                            }
-                            finally
-                            {
-                                os.close();
-                            }
-                        }
-                        finally
-                        {
-                            is.close();
-                        }
-                    }
-                    catch ( IOException x )
-                    {
-                        getLog().warn( "Could not process " + moduleJar + ": " + x, x );
-                        moduleJarMinusCP.delete();
-                        moduleJarMinusCP = null;
-                    }
-                }
-                try
-                {
-                    if ( !skipLocalInstall )
-                    {
-                        install( moduleJarMinusCP != null ? moduleJarMinusCP : moduleJar, art );
-                        if ( javadoc != null )
-                        {
-                            install( javadoc, javadocArt );
-                        }
-                        if ( source != null )
-                        {
-                            install( source, sourceArt );
-                        }
-                        if ( nbm != null )
-                        {
-                            install( nbm, nbmArt );
-                        }
-                    }
-                    try
-                    {
-                        if ( deploymentRepository != null )
-                        {
-                            artifactDeployer.deploy( moduleJarMinusCP != null ? moduleJarMinusCP : moduleJar, art,
-                                                     deploymentRepository, localRepository );
-                            if ( javadoc != null )
-                            {
-                                artifactDeployer.deploy( javadoc, javadocArt, deploymentRepository, localRepository );
-                            }
-                            if ( source != null )
-                            {
-                                artifactDeployer.deploy( source, sourceArt, deploymentRepository, localRepository );
-                            }
-                            if ( nbm != null )
-                            {
-                                artifactDeployer.deploy( nbm, nbmArt, deploymentRepository, localRepository );
-                            }
-                        }
-                    }
-                    catch ( ArtifactDeploymentException ex )
-                    {
-                        throw new MojoExecutionException( "Error Deploying artifact", ex );
-                    }
-                }
-                finally
-                {
-                    if ( moduleJarMinusCP != null )
-                    {
-                        moduleJarMinusCP.delete();
-                    }
-                }
-            }
-        }
-        finally
-        {
-            /*if ( searcher != null )
-            {
-                try
-                {
-                    searcher.close();
-                }
-                catch ( IOException ex )
-                {
-                    getLog().error( ex );
-                }
-            }*/
-        }
-
-        //process collected non-recognized external jars..
-        if ( externals.size() > 0 )
-        {
-            index = 0;
-            count = externals.size();
-            for ( ExternalsWrapper ex : externals )
-            {
-                Artifact art = createArtifact( ex.getArtifact(), ex.getVersion(), ex.getGroupid() );
-                index = index + 1;
-                getLog().info( "Processing external " + index + "/" + count );
-                File pom = createExternalProject( ex );
-                ArtifactMetadata metadata = new ProjectArtifactMetadata( art, pom );
-                art.addMetadata( metadata );
-                if ( !skipLocalInstall )
-                {
-                    install( ex.getFile(), art );
-                }
-                try
-                {
-                    if ( deploymentRepository != null )
-                    {
-                        artifactDeployer.deploy( ex.getFile(), art,
-                            deploymentRepository, localRepository );
-                    }
-                }
-                catch ( ArtifactDeploymentException exc )
-                {
-                    throw new MojoExecutionException( "Error Deploying artifact", exc );
-                }
-            }
-        }
-
-        if ( ! defineCluster )
-        {
-            getLog().info( "Not creating cluster POMs." );
-        }
-        else if ( forcedVersion == null )
-        {
-            getLog().warn( "Version not specified, cannot create cluster POMs." );
-        }
-        else
-        {
-            for ( Map.Entry<String, Collection<ModuleWrapper>> elem : clusters.entrySet() )
-            {
-                String cluster = stripClusterName( elem.getKey() );
-                Collection<ModuleWrapper> modules = elem.getValue();
-                getLog().info( "Processing cluster " + cluster );
-                Artifact art = createClusterArtifact( cluster, forcedVersion );
-                File pom = createClusterProject( art, modules );
-                ProjectArtifactMetadata metadata = new ProjectArtifactMetadata( art, pom );
-                art.addMetadata( metadata );
-                if ( !skipLocalInstall )
-                {
-                    install( pom, art );
-                }
-                try
-                {
-                    if ( deploymentRepository != null )
-                    {
-                        artifactDeployer.deploy( pom, art, deploymentRepository, localRepository );
-                    }
-                }
-                catch ( ArtifactDeploymentException ex )
-                {
-                    throw new MojoExecutionException( "Error Deploying artifact", ex );
-                }
-            }
-
-        }
-    }
-
-    void install( File file, Artifact art )
-        throws MojoExecutionException
-    {
-        assert localRepository != null;
-        try
-        {
-            artifactInstaller.install( file, art, localRepository );
-        }
-        catch ( ArtifactInstallationException e )
-        {
-            // TODO: install exception that does not give a trace
-            throw new MojoExecutionException( "Error installing artifact", e );
-        }
-    }
-
-    //performs the same tasks as the MavenProjectHelper
-    Artifact createAttachedArtifact( Artifact primary, File file, String type, String classifier )
-    {
-        assert type != null;
-
-        ArtifactHandler handler;
-
-        handler = artifactHandlerManager.getArtifactHandler( type );
-
-        if ( handler == null )
-        {
-            getLog().warn( "No artifact handler for " + type );
-            handler = artifactHandlerManager.getArtifactHandler( "jar" );
-        }
-
-        Artifact artifact = new AttachedArtifact( primary, type, classifier, handler );
-
-        artifact.setFile( file );
-        artifact.setResolved( true );
-        return artifact;
-    }
-
-    private File createMavenProject( ModuleWrapper wrapper, List<ModuleWrapper> wrapperList,
-                                     List<ExternalsWrapper> externalsList )
-            throws MojoExecutionException
-    {
-        Model mavenModel = new Model();
-
-        mavenModel.setGroupId( wrapper.getGroup() );
-        mavenModel.setArtifactId( wrapper.getArtifact() );
-        mavenModel.setVersion( wrapper.getVersion() );
-        mavenModel.setPackaging( "jar" );
-        mavenModel.setModelVersion( "4.0.0" );
-        if ( artefactParent != null )
-        {
-            mavenModel.setParent( artefactParent );
-        }
-        ExamineManifest man = wrapper.getModuleManifest();
-        List<Dependency> deps = new ArrayList<>();
-        if ( !man.getDependencyTokens().isEmpty() )
-        {
-            for ( String elem : man.getDependencyTokens() )
-            {
-                // create pseudo wrapper
-                ModuleWrapper wr = new ModuleWrapper( elem );
-                int index = wrapperList.indexOf( wr );
-                if ( index > -1 )
-                {
-                    wr = wrapperList.get( index );
-                    Dependency dep;
-                    if ( wr instanceof ModuleWrapperMaven )
-                    {
-                       dep = ( ( ModuleWrapperMaven ) wr ).getDep();
-                    }
-                    else
-                    {
-                        dep = new Dependency();
-                        dep.setArtifactId( wr.getArtifact() );
-                        dep.setGroupId( wr.getGroup() );
-                        dep.setVersion( wr.getVersion() );
-                    }
-                    dep.setType( "jar" );
-                    //we don't want the API modules to depend on non-api ones..
-                    // otherwise the transitive dependency mechanism pollutes your classpath..
-                    if ( wrapper.getModuleManifest().hasPublicPackages()
-                            && !wr.getModuleManifest().hasPublicPackages() )
-                    {
-                        dep.setScope( "runtime" );
-                    }
-                    deps.add( dep );
-                }
-                else if ( dependencyRepositoryUrl != null )
-                {
-                    Dependency dep = new Dependency();
-                    dep.setType( "jar" );
-                    String artifactId = elem.replace( '.', '-' );
-                    dep.setArtifactId( artifactId );
-                    if ( forcedVersion == null )
-                    {
-                        throw new MojoExecutionException( "Cannot use dependencyRepositoryUrl without forcedVersion" );
-                    }
-                    dep.setVersion( forcedVersion );
-                    ArtifactRepositoryPolicy policy = new ArtifactRepositoryPolicy();
-                    List<ArtifactRepository> repos = Collections.singletonList(
-                            repositoryFactory.createArtifactRepository(
-                                    dependencyRepositoryId, dependencyRepositoryUrl, artifactRepositoryLayout, policy, policy ) );
-                    try
-                    {
-                        artifactResolver.resolve(
-                                artifactFactory.createBuildArtifact( groupIdPrefix + GROUP_API, artifactId, forcedVersion, "pom" ),
-                                repos,
-                                localRepository );
-                        dep.setGroupId( groupIdPrefix + GROUP_API );
-                    }
-                    catch ( AbstractArtifactResolutionException x )
-                    {
-                        try
-                        {
-                            artifactResolver.resolve( artifactFactory.createBuildArtifact( groupIdPrefix + GROUP_IMPL, artifactId, forcedVersion, "pom" ), repos, localRepository );
-                            dep.setGroupId( groupIdPrefix + GROUP_IMPL );
-                            if ( wrapper.getModuleManifest().hasPublicPackages() )
-                            {
-                                dep.setScope( "runtime" );
-                            }
-                        }
-                        catch ( AbstractArtifactResolutionException x2 )
-                        {
-                            try
-                            {
-                                artifactResolver.resolve( artifactFactory.createBuildArtifact( groupIdPrefix + GROUP_EXTERNAL, artifactId, forcedVersion, "pom" ), repos, localRepository );
-                                dep.setGroupId( groupIdPrefix + GROUP_EXTERNAL );
-                                if ( wrapper.getModuleManifest().hasPublicPackages() )
-                                {
-                                    dep.setScope( "runtime" );
-                                }
-                            }
-                            catch ( AbstractArtifactResolutionException x3 )
-                            {
-                                getLog().warn( x3.getOriginalMessage() );
-                                throw new MojoExecutionException( "No module found for dependency '" + elem + "'", x );
-                            }
-
-
-                        }
-
-                    }
-                    deps.add( dep );
-                }
-                else
-                {
-                    getLog().warn( "No module found for dependency '" + elem + "'" );
-                }
-            }
-        }
-        //need some generic way to handle Classpath: items.
-        //how to figure the right version?
-        String cp = wrapper.getModuleManifest().getClasspath();
-        if ( !cp.isEmpty() )
-        {
-            StringTokenizer tok = new StringTokenizer( cp );
-            while ( tok.hasMoreTokens() )
-            {
-                String path = tok.nextToken();
-                File f = new File( wrapper.getFile().getParentFile(), path );
-                if ( f.exists() )
-                {
-                    Dependency dep = findExternal( f );
-                    if ( dep != null )
-                    {
-                        deps.add( dep );
-                        // XXX MNBMODULE-170: repack NBM with *.external
-                    }
-                    else
-                    {
-                        ExternalsWrapper ex = new ExternalsWrapper();
-                        ex.setFile( f );
-                        String artId = f.getName();
-                        if ( artId.endsWith( ".jar" ) )
-                        {
-                            artId = artId.substring( 0, artId.length() - ".jar".length() );
-                        }
-                        ex.setVersion( wrapper.getVersion() );
-                        ex.setArtifact( artId );
-                        ex.setGroupid( groupIdPrefix + GROUP_EXTERNAL );
-                        externalsList.add( ex );
-                        dep = new Dependency();
-                        dep.setArtifactId( artId );
-                        dep.setGroupId( groupIdPrefix + GROUP_EXTERNAL );
-                        dep.setVersion( wrapper.getVersion() );
-                        dep.setType( "jar" );
-                        deps.add( dep );
-                    }
-                }
-            }
-        }
-
-        wrapper.deps = deps;
-        mavenModel.setDependencies( deps );
-        FileWriter writer = null;
-        File fil = null;
-        try
-        {
-            MavenXpp3Writer xpp = new MavenXpp3Writer();
-            fil = File.createTempFile( "maven", ".pom" );
-            fil.deleteOnExit();
-            writer = new FileWriter( fil );
-            xpp.write( writer, mavenModel );
-        }
-        catch ( IOException ex )
-        {
-            ex.printStackTrace();
-
-        }
-        finally
-        {
-            if ( writer != null )
-            {
-                try
-                {
-                    writer.close();
-                }
-                catch ( IOException io )
-                {
-                    io.printStackTrace();
-                }
-            }
-        }
-        return fil;
-    }
-
-    private Dependency findExternal( File f )
-    {
-        if ( externallist == null )
-        {
-            return null;
-        }
-        try
-        {
-            List<String> content512 = Files.readAllLines( externallist.toPath() );
-            MessageDigest shaDig = MessageDigest.getInstance( "SHA1" );
-
-            try ( InputStream is = new FileInputStream( f ); OutputStream os = new DigestOutputStream( new NullOutputStream(), shaDig ); )
-            {
-                IOUtil.copy( is, os );
-            }
-            String sha1 = encode ( shaDig.digest() ).toUpperCase();
-            for ( String string : content512 )
-            {
-                if ( string.startsWith( "#" ) )
-                {
-                    continue;
-                }
-                String[] split = string.split( ";" );
-                if ( split[0].equals( sha1 ) && split[1].contains( ":" ) )
-                {
-                    Dependency dep = splitDependencyString( split[1] );
-                    getLog().info( "found match " + dep.getGroupId() + ":" + dep.getArtifactId() + ":" + dep.getVersion() + " for " + f.getName() );
-                    return dep;
-                }
-            }
-            getLog().info( "no repository match for " + f.getName() + f.getAbsolutePath() + " with sha " + sha1 );
-        }
-        catch ( Exception x )
-        {
-            getLog().error( x );
-        }
-        return null;
-    }
-
-    static Dependency splitDependencyString( String split )
-    {
-        String[] splits = split.split( ":" );
-        Dependency dep = new Dependency();
-        dep.setArtifactId( splits[1] );
-        dep.setGroupId( splits[0] );
-        dep.setVersion( splits[2] );
-        dep.setType( "jar" );
-        dep.setClassifier( "" );
-        if ( splits.length > 3 )
-        {
-            String[] split2 = splits[3].split( "@" );
-            if ( split2.length > 1 )
-            {
-                dep.setClassifier( split2[0] );
-                dep.setType( split2[1] );
-            }
-            else
-            {
-                dep.setClassifier( splits[3] );
-            }
-        }
-        return dep;
-    }
-
-    File createExternalProject( ExternalsWrapper wrapper )
-    {
-        Model mavenModel = new Model();
-
-        mavenModel.setGroupId( wrapper.getGroupid() );
-        mavenModel.setArtifactId( wrapper.getArtifact() );
-        mavenModel.setVersion( wrapper.getVersion() );
-        mavenModel.setPackaging( "jar" );
-        mavenModel.setModelVersion( "4.0.0" );
-        if ( artefactParent != null )
-        {
-            mavenModel.setParent( artefactParent );
-        }
-        mavenModel.setName(
-            "Maven definition for " + wrapper.getFile().getName() + " - external part of NetBeans module." );
-        mavenModel.setDescription(
-            "POM and identification for artifact that was not possible to uniquely identify as a maven dependency." );
-        FileWriter writer = null;
-        File fil = null;
-        try
-        {
-            MavenXpp3Writer xpp = new MavenXpp3Writer();
-            fil = File.createTempFile( "maven", ".pom" );
-            fil.deleteOnExit();
-            writer = new FileWriter( fil );
-            xpp.write( writer, mavenModel );
-        }
-        catch ( IOException ex )
-        {
-            ex.printStackTrace();
-        }
-        finally
-        {
-            if ( writer != null )
-            {
-                try
-                {
-                    writer.close();
-                }
-                catch ( IOException io )
-                {
-                    io.printStackTrace();
-                }
-            }
-        }
-        return fil;
-
-    }
-
-    private File createClusterProject( Artifact cluster, Collection<ModuleWrapper> mods )
-    {
-        Model mavenModel = new Model();
-
-        mavenModel.setGroupId( cluster.getGroupId() );
-        mavenModel.setArtifactId( cluster.getArtifactId() );
-        mavenModel.setVersion( cluster.getVersion() );
-//        mavenModel.setPackaging("nbm-application");
-        mavenModel.setPackaging( "pom" );
-        mavenModel.setModelVersion( "4.0.0" );
-        if ( artefactParent != null )
-        {
-            mavenModel.setParent( artefactParent );
-        }
-        List<Dependency> deps = new ArrayList<>();
-        for ( ModuleWrapper wr : mods )
-        {
-            Dependency dep = new Dependency();
-            if ( wr.getModuleManifest().isNetBeansModule() )
-            {
-                dep.setArtifactId( wr.getArtifact() );
-                dep.setGroupId( wr.getGroup() );
-                dep.setVersion( wr.getVersion() );
-                dep.setType( "nbm-file" );
-            }
-            else if ( wr instanceof ModuleWrapperMaven )
-            {
-                ModuleWrapperMaven mwr = ( ModuleWrapperMaven ) wr;
-                dep.setArtifactId( mwr.getDep().getArtifactId() );
-                dep.setGroupId( mwr.getDep().getGroupId() );
-                dep.setVersion( mwr.getDep().getVersion() );
-                dep.setClassifier( mwr.getDep().getClassifier() );
-                dep.setScope( mwr.getDep().getScope());
-            }
-            else
-            {
-                dep.setArtifactId( wr.getArtifact() );
-                dep.setGroupId( wr.getGroup() );
-                dep.setVersion( wr.getVersion() );
-            }
-            deps.add( dep );
-        }
-        mavenModel.setDependencies( deps );
-//
-//
-//        Build build = new Build();
-//        Plugin plg = new Plugin();
-//        plg.setGroupId("org.codehaus.mojo");
-//        plg.setArtifactId("nbm-maven-plugin");
-//        plg.setVersion("2.7-SNAPSHOT");
-//        plg.setExtensions(true);
-//        build.addPlugin(plg);
-//        mavenModel.setBuild(build);
-
-        FileWriter writer = null;
-        File fil = null;
-        try
-        {
-            MavenXpp3Writer xpp = new MavenXpp3Writer();
-            fil = File.createTempFile( "maven", ".pom" );
-            fil.deleteOnExit();
-            writer = new FileWriter( fil );
-            xpp.write( writer, mavenModel );
-        }
-        catch ( IOException ex )
-        {
-            ex.printStackTrace();
-        }
-        finally
-        {
-            IOUtil.close( writer );
-        }
-        return fil;
-    }
-
-    Artifact createArtifact( String artifact, String version, String group )
-    {
-        return artifactFactory.createBuildArtifact( group, artifact, version, "jar" );
-    }
-
-    private Artifact createClusterArtifact( String artifact, String version )
-    {
-        return artifactFactory.createBuildArtifact( groupIdPrefix + GROUP_CLUSTER, artifact, version, "pom" );
-    }
-
-    private static final Pattern PATTERN_CLUSTER = Pattern.compile( "([a-zA-Z]+)[0-9\\.]*" );
-    static String stripClusterName( String key )
-    {
-        Matcher m = PATTERN_CLUSTER.matcher( key );
-        if ( m.matches() )
-        {
-            return m.group( 1 );
-        }
-        return key;
-    }
-
-    private static class ExternalsWrapper
-    {
-
-        private File file;
-
-        private String artifact;
-
-        private String groupid;
-
-        public String getArtifact()
-        {
-            return artifact;
-        }
-
-        public void setArtifact( String artifact )
-        {
-            this.artifact = artifact;
-        }
-
-        public File getFile()
-        {
-            return file;
-        }
-
-        public void setFile( File file )
-        {
-            this.file = file;
-        }
-
-        public String getGroupid()
-        {
-            return groupid;
-        }
-
-        public void setGroupid( String groupid )
-        {
-            this.groupid = groupid;
-        }
-
-        public String getVersion()
-        {
-            return version;
-        }
-
-        public void setVersion( String version )
-        {
-            this.version = version;
-        }
-        private String version;
-
-    }
-
-    private static class ModuleWrapperMaven extends ModuleWrapper
-    {
-
-        private final Dependency dep;
-
-        ModuleWrapperMaven( String art, String ver, String grp, ExamineManifest manifest, File fil, Dependency de )
-        {
-            super( art, ver, grp, manifest, fil );
-            this.dep = de;
-        }
-
-        public Dependency getDep()
-        {
-            return dep;
-        }
-    }
-
-    private static class ModuleWrapper
-    {
-
-        ExamineManifest man;
-
-        private String artifact;
-
-        private String version;
-
-        private String group;
-
-        private File file;
-
-        private String cluster;
-
-        String module;
-
-        List<Dependency> deps;
-
-        ModuleWrapper( String module )
-        {
-            this.module = module;
-        }
-
-        ModuleWrapper( String art, String ver, String grp, ExamineManifest manifest, File fil )
-        {
-            man = manifest;
-            artifact = art;
-            version = ver;
-            group = grp;
-            file = fil;
-        }
-
-        @Override
-        public int hashCode()
-        {
-            return getModule().hashCode();
-        }
-
-        @Override
-        public boolean equals( Object obj )
-        {
-            return obj instanceof ModuleWrapper && getModule().equals( ( (ModuleWrapper) obj ).getModule() );
-        }
-
-        public String getModule()
-        {
-            return module != null ? module : getModuleManifest().getModule();
-        }
-
-        public ExamineManifest getModuleManifest()
-        {
-            return man;
-        }
-
-        private String getArtifact()
-        {
-            return artifact;
-        }
-
-        private String getVersion()
-        {
-            return version;
-        }
-
-        private String getGroup()
-        {
-            return group;
-        }
-
-        private File getFile()
-        {
-            return file;
-        }
-
-        void setCluster( String clust )
-        {
-            cluster = clust;
-        }
-
-        String getCluster()
-        {
-            return cluster;
-        }
-    }
-
-    private static class NullOutputStream
-        extends OutputStream
-    {
-
-        @Override
-        public void write( int b )
-            throws IOException
-        {
-        }
-    }
-
-    /**
-     * Encodes a 128 bit or 160-bit byte array into a String.
-     *
-     * @param binaryData Array containing the digest
-     * @return Encoded hex string, or null if encoding failed
-     */
-    static String encode( byte[] binaryData )
-    {
-        int bitLength = binaryData.length * 8;
-        if ( bitLength != 128 && bitLength != 160 )
-        {
-            throw new IllegalArgumentException(
-                "Unrecognised length for binary data: " + bitLength + " bits" );
-        }
-        return String.format( "%0" + bitLength / 4 + "x", new BigInteger( 1, binaryData ) );
-    }
-}
diff --git a/nb-repository-plugin/src/site/apt/index.apt b/nb-repository-plugin/src/site/apt/index.apt
deleted file mode 100644
index 5b5a4e2..0000000
--- a/nb-repository-plugin/src/site/apt/index.apt
+++ /dev/null
@@ -1,40 +0,0 @@
-~~ 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.
-
- ------
- Maven 2 NB Repository Plugin 
- ------
- Milos Kleint
- <dev@apache.netbeans.org>
- ------
- 2012-10-19
-
-NetBeans Repository plugin
-
- The plugin is capable of populating the local or remote maven repository with module jars and NBM files from a given NetBeans installation. Useful for
-module development, modules with public APIs are separated from those without a public API.
-See the {{{./populate-mojo.html}<<<populate>>>}} goal and the {{{./repository.html}HOWTO document}} for details.
-
- {{{https://search.maven.org/}Maven Central}} contains artefacts of Apache NetBeans 9.0 and later.
-
- Also see: {{{http://wiki.netbeans.org/NetBeansDeveloperFAQ#Mavenized_Builds}Maven NBM development FAQs}}
-
-Older NetBeans Version
-
- To get access to a repository with NetBeans.org module artifacts and metadata, add {{{http://bits.netbeans.org/maven2/}http://bits.netbeans.org/maven2/}} repository to your project POM
-or the repository manager you are using. The repository hosts binaries from NetBeans 6.5 to NetBeans 8.2.
-
diff --git a/nb-repository-plugin/src/site/apt/repository.apt b/nb-repository-plugin/src/site/apt/repository.apt
deleted file mode 100644
index 4aa9a1c..0000000
--- a/nb-repository-plugin/src/site/apt/repository.apt
+++ /dev/null
@@ -1,56 +0,0 @@
-~~ 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.
-
- ------
- Maven 2 NB Repository Plugin 
- ------
- Milos Kleint
- <dev@apache.netbeans.org>
- ------
- 2012-10-19
-
-HOWTO: Upload NetBeans release binaries to a Maven repository
-
-
- There is a goal that converts the NetBeans module information into Maven metadata
-and is capable of uploading the module jar file, javadoc, sources and nbm files to local
-and remote repositories. See {{{./populate-mojo.html}<<<populate>>> goal}} description.
-
- For a binary-only upload (jar files and nbm files only), it's possible to download the bits from official sites. 
-See this page {{{http://netbeans.apache.org/download/dev/index.html}Building from source}}
-
- For the complete upload, you will need to checkout the sources of the IDE/Platform you
-want to upload. See this page {{{http://netbeans.apache.org/download/dev/index.html}Building from source}}
-
- To have external dependencies correctly identified by their real GAV, you will need to download the index from central (or other) repository. 
-See {{{./download-mojo.html}<<<download>>> goal}}
-
- The goal has multiple input parameters that link the goal to binaries prepared beforehand.
-
-   * <<netbeansInstallDirectory>> designates the base directory where resides the NetBeans installation
-that shall be uploaded. Run <<<ant>>> in your local git clone to build the distribution at <<<nbbuild/netbeans>>> subdirectory.
-
-   * <<netbeansNbmDirectory>> designates the base directory where the nbm files are located.
-Run <<<ant build-nbms>>> in your local <<<git clone>>> to build the nbms at <<<nbbuild/nbms>>> directory.
-
-   * <<netbeansSourcesDirectory>> designates the base directory containing zip files with module jar sources.
-Run <<<ant build-source-zips>>> in your local hg clone to build the nbms at <<<nbbuild/build/source-zips>>> directory.
-
-   * <<netbeansJavadocDirectory>> designates the base directory containing zip files with javadoc zips for modules with public apis.
-Run <<<ant build-javadoc>>> in your local hg clone to build the nbms at <<<nbbuild/build/javadoc>>> directory.
-
-
diff --git a/nb-repository-plugin/src/site/site.xml b/nb-repository-plugin/src/site/site.xml
deleted file mode 100644
index 3965618..0000000
--- a/nb-repository-plugin/src/site/site.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!--
-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.
--->
-<project xmlns="http://maven.apache.org/DECORATION/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/DECORATION/1.0.0 http://maven.apache.org/xsd/decoration-1.0.0.xsd">
-    <skin>
-        <groupId>org.apache.netbeans.utilities</groupId>
-        <artifactId>maven-netbeans-skin</artifactId>
-        <version>1.0-SNAPSHOT</version>
-    </skin>
-    <body>
-    <menu name="Overview">
-      <item name="Usage" href="index.html"/>
-      <item name="Plugin Goals" href="plugin-info.html"/>
-      <!-- <item name="Javadoc" href="apidocs/index.html"/> -->
-      <!--item name="FAQ" href="faq.html"/-->
-    </menu>
-    <!--<menu name="Upgrade">   
-      <item name="2.4 -> 2.5 upgrade" href="2425upgrade.html"/>
-      <item name="2.6 -> 3.0 upgrade" href="2630upgrade.html"/>
-    </menu>-->
-    <menu name="HOWTOs ">
-      <item name="Populate repository" href="repository.html"/>
-    </menu>
-  </body>
-</project>
-
diff --git a/nb-repository-plugin/src/test/java/org/apache/netbeans/nbm/repository/PopulateRepositoryMojoTest.java b/nb-repository-plugin/src/test/java/org/apache/netbeans/nbm/repository/PopulateRepositoryMojoTest.java
deleted file mode 100644
index 5a6ab2a..0000000
--- a/nb-repository-plugin/src/test/java/org/apache/netbeans/nbm/repository/PopulateRepositoryMojoTest.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.apache.netbeans.nbm.repository;
-
-/*
- * 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.
- */
-
-import junit.framework.TestCase;
-import org.apache.maven.model.Dependency;
-
-/**
- * 
- * @author Milos Kleint
- */
-public class PopulateRepositoryMojoTest extends TestCase /** AbstractMojoTestCase  the only way out of dependency hell.**/{
-    
-    public void testStripClusterName()
-    {
-        assertEquals( "platform", PopulateRepositoryMojo.stripClusterName( "platform9" ) );
-        assertEquals( "platform", PopulateRepositoryMojo.stripClusterName( "platform11" ) );
-        assertEquals( "nb", PopulateRepositoryMojo.stripClusterName( "nb6.9" ) );
-        assertEquals( "extra", PopulateRepositoryMojo.stripClusterName( "extra" ) );
-    }
-
-    public void testInstall() throws Exception
-    {
-//TODO how is this done on maven3?
-//        PopulateRepositoryMojo mojo = ( PopulateRepositoryMojo ) lookupMojo( "populate", new File( getBasedir(), "src/test/resources/PopulateMojoTest.xml" ) );
-//        File repo = new File( System.getProperty( "java.io.tmpdir" ), "PopulateRepositoryMojoTest" );
-//        FileUtils.deleteDirectory( repo );
-//        mojo.localRepository = new DefaultArtifactRepository( "test", repo.toURI().toString(), new DefaultRepositoryLayout() );
-//        Artifact art1 = mojo.createArtifact( "testarg", "1.0", "testgrp" );
-//        File f = File.createTempFile( "PopulateRepositoryMojoTest", ".nbm" );
-//        f.deleteOnExit();
-//        Artifact art2 = mojo.createAttachedArtifact( art1, f, "nbm-file", null );
-//        assertEquals( "nbm", art2.getArtifactHandler().getExtension() );
-//        //TODO does not work because of missing session
-////        mojo.install( f, art2 );
-////        assertTrue( new File( repo, "testgrp/testarg/1.0/testarg-1.0.nbm" ).isFile() );
-////        assertFalse( new File( repo, "testgrp/testarg/1.0/testarg-1.0.jar" ).isFile() );
-    }
-    
-    public void testSplit() throws Exception
-    {
-        Dependency dep1 = PopulateRepositoryMojo.splitDependencyString("org.apache.maven:apache-maven:3.6.3:bin@zip");
-        assertEquals("org.apache.maven", dep1.getGroupId() );
-        assertEquals("apache-maven", dep1.getArtifactId());
-        assertEquals("3.6.3", dep1.getVersion());
-        assertEquals("bin", dep1.getClassifier());
-        assertEquals("zip", dep1.getType());
-        
-        Dependency dep2 = PopulateRepositoryMojo.splitDependencyString("org.apache.maven:apache-maven:3.6.3:myclassifier");
-        assertEquals("org.apache.maven", dep2.getGroupId() );
-        assertEquals("apache-maven", dep2.getArtifactId());
-        assertEquals("3.6.3", dep2.getVersion());
-        assertEquals("myclassifier", dep2.getClassifier());
-        assertEquals("jar", dep2.getType());
-        
-        Dependency dep3 = PopulateRepositoryMojo.splitDependencyString("org.apache.maven:apache-maven:3.6.3");
-        assertEquals("org.apache.maven", dep3.getGroupId() );
-        assertEquals("apache-maven", dep3.getArtifactId());
-        assertEquals("3.6.3", dep3.getVersion());
-        assertEquals("", dep3.getClassifier());
-        assertEquals("jar", dep3.getType());
-    }
-
-    public void testEncode() throws Exception
-    {
-        assertEquals( "057558504e1d03e57ce6fd80ad983b3c2e803b40", PopulateRepositoryMojo.encode( new byte[] {
-            (byte) 0x05, (byte) 0x75, (byte) 0x58, (byte) 0x50, (byte) 0x4e, (byte) 0x1d, (byte) 0x03, (byte) 0xe5, (byte) 0x7c, (byte) 0xe6,
-            (byte) 0xfd, (byte) 0x80, (byte) 0xad, (byte) 0x98, (byte) 0x3b, (byte) 0x3c, (byte) 0x2e, (byte) 0x80, (byte) 0x3b, (byte) 0x40,
-        } ) );
-        assertEquals( "ca70822c47a67fc3a11670270567c2d01566dae1", PopulateRepositoryMojo.encode( new byte[] {
-            (byte) 0xca, (byte) 0x70, (byte) 0x82, (byte) 0x2c, (byte) 0x47, (byte) 0xa6, (byte) 0x7f, (byte) 0xc3, (byte) 0xa1, (byte) 0x16,
-            (byte) 0x70, (byte) 0x27, (byte) 0x05, (byte) 0x67, (byte) 0xc2, (byte) 0xd0, (byte) 0x15, (byte) 0x66, (byte) 0xda, (byte) 0xe1,
-        } ) );
-    }
-
-}
diff --git a/nb-repository-plugin/src/test/resources/PopulateMojoTest.xml b/nb-repository-plugin/src/test/resources/PopulateMojoTest.xml
deleted file mode 100644
index 233d42c..0000000
--- a/nb-repository-plugin/src/test/resources/PopulateMojoTest.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-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.
--->
-<project>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>nb-repository-plugin</artifactId>
-                <configuration/>
-            </plugin>
-        </plugins>
-    </build>
-</project>
