diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
new file mode 100644
index 0000000..2b4b93c
--- /dev/null
+++ b/.github/workflows/ci.yaml
@@ -0,0 +1,22 @@
+name: GitHub CI
+
+on: [push]
+
+jobs:
+  ci:
+    runs-on: ubuntu-latest
+    steps:
+      - name: checkout
+        uses: actions/checkout@v2
+      - name: jdk setup
+        uses: actions/setup-java@v1
+        with:
+          java-version: 11
+          java-package: jdk
+          architecture: x64
+#      - name: unit test
+#        run: ./mvnw --batch-mode --activate-profiles indy clean test
+#      - name: integration test
+#        run: ./mvnw --batch-mode --activate-profiles indy -Dmaven.test.skip=true clean install invoker:install invoker:run
+      - name: full test
+        run: ./mvnw --batch-mode --activate-profiles indy clean install invoker:install invoker:run
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index a1423cb..0000000
--- a/.travis.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-language: java
-#jdk: openjdk12
-jdk: oraclejdk11
-sudo: false
-
-# unit test
-#script: "./mvnw --batch-mode --activate-profiles indy clean test"
-
-# integration test
-before_install: "./mvnw --batch-mode clean"
-install: "./mvnw --batch-mode --activate-profiles indy install"
-before_script: "./mvnw --batch-mode invoker:install"
-script: "./mvnw --batch-mode --activate-profiles indy -Dinvoker.streamLogs=true invoker:run"
diff --git a/README.markdown b/README.markdown
index 564d305..224d11f 100644
--- a/README.markdown
+++ b/README.markdown
@@ -6,4 +6,4 @@ GMavenPlus is a rewrite of [GMaven](https://github.com/groovy/gmaven), a [Maven]
 You should find everything you need to know about its use in the [wiki](https://github.com/groovy/GMavenPlus/wiki). For more information, check out the [Maven site](http://groovy.github.io/GMavenPlus/index.html).
 
 ---
-![Travis Build Status](https://travis-ci.org/groovy/GMavenPlus.svg?branch=master)
+![ci](https://github.com/groovy/GMavenPlus/actions/workflows/ci.yaml/badge.svg?branch=master)
diff --git a/integrationTest.groovy b/integrationTestSuite.groovy
similarity index 70%
rename from integrationTest.groovy
rename to integrationTestSuite.groovy
index 52e72f7..301423a 100644
--- a/integrationTest.groovy
+++ b/integrationTestSuite.groovy
@@ -1,10 +1,12 @@
+import groovy.io.FileType
+
 // Note Groovy 1.7.1 has a bad dependency on Jansi 1.1. You have to manually install it into your local cache for the tests to work. You can download it at http://repo.fusesource.com/nexus/content/groups/public/org/fusesource/jansi/jansi/1.1/.
 
 // Remember to test the console and shell goals. There are currently no integration tests for these.
 
-new File(System.getProperty("user.dir")).eachFileMatch groovy.io.FileType.FILES, ~/groovy-.+\.log/, { it.delete() }
+new File(System.getProperty("user.dir")).eachFileMatch FileType.FILES, ~/groovy-.+\.log/, { it.delete() }
 println "Installing plugin..."
-quietlyRunCommand "${mvn()} -B -P nonindy clean install invoker:install"
+quietlyRunCommand "${mvn()} -B -P nonindy -Dmaven.test.skip=true -Dinvoker.skip=true clean install invoker:install"
 // TODO: fix joint compilation failures with Groovy 1.9-beta-1 and 1.9-beta-2
 groovyVersions = ["1.5.0", "1.5.1", "1.5.2", "1.5.3", "1.5.4", "1.5.5", "1.5.6", "1.5.7", "1.5.8",
                   "1.6-beta-1", "1.6-beta-2", "1.6-RC-1", "1.6-RC-2", "1.6-RC-3", "1.6.0", "1.6.1", "1.6.2", "1.6.3", "1.6.4", "1.6.5", "1.6.6", "1.6.7", "1.6.8", "1.6.9",
@@ -15,32 +17,34 @@ groovyVersions = ["1.5.0", "1.5.1", "1.5.2", "1.5.3", "1.5.4", "1.5.5", "1.5.6",
                   "2.1.0-beta-1", "2.1.0-rc-1", "2.1.0-rc-2", "2.1.0-rc-3", "2.1.0", "2.1.1", "2.1.2", "2.1.3", "2.1.4", "2.1.5", "2.1.6", "2.1.7",
                   "2.2.0-beta-1", "2.2.0-beta-2", "2.2.0-rc-1", "2.2.0-rc-2", "2.2.0-rc-3", "2.2.0", "2.2.1", "2.2.2",
                   "2.3.0-beta-1", "2.3.0-beta-2", "2.3.0-rc-1", "2.3.0-rc-2", "2.3.0-rc-4", "2.3.0", "2.3.1", "2.3.2", "2.3.3", "2.3.4", "2.3.5", "2.3.6", "2.3.7", "2.3.8", "2.3.9", "2.3.10", "2.3.11",
-                  "2.4.0-beta-1", "2.4.0-beta-2", "2.4.0-beta-3", "2.4.0-beta-4", "2.4.0-rc-1", "2.4.0-rc-2", "2.4.0", "2.4.1", "2.4.2", "2.4.3", "2.4.4", "2.4.5", "2.4.6", "2.4.7", "2.4.8", "2.4.9", "2.4.10", "2.4.11", "2.4.12", "2.4.13", "2.4.14", "2.4.15",
-                  "2.5.0-alpha-1", "2.5.0-beta-1", "2.5.0-beta-2", "2.5.0-beta-3", "2.5.0-rc-1", "2.5.0-rc-2", "2.5.0", "2.5.1", "2.5.2", "2.5.3", "2.5.4", "2.5.5", "2.5.6", "2.5.7", "2.5.8",
+                  "2.4.0-beta-1", "2.4.0-beta-2", "2.4.0-beta-3", "2.4.0-beta-4", "2.4.0-rc-1", "2.4.0-rc-2", "2.4.0", "2.4.1", "2.4.2", "2.4.3", "2.4.4", "2.4.5", "2.4.6", "2.4.7", "2.4.8", "2.4.9", "2.4.10", "2.4.11", "2.4.12", "2.4.13", "2.4.14", "2.4.15", "2.4.16", "2.4.17", "2.4.18", "2.4.19", "2.4.20", "2.4.21",
+                  "2.5.0-alpha-1", "2.5.0-beta-1", "2.5.0-beta-2", "2.5.0-beta-3", "2.5.0-rc-1", "2.5.0-rc-2", "2.5.0", "2.5.1", "2.5.2", "2.5.3", "2.5.4", "2.5.5", "2.5.6", "2.5.7", "2.5.8", "2.5.9", "2.5.10", "2.5.11", "2.5.12", "2.5.13", "2.5.14",
                   "2.6.0-alpha-1", "2.6.0-alpha-2", "2.6.0-alpha-3",
-                  "3.0.0-alpha-1", "3.0.0-alpha-2", "3.0.0-alpha-3", "3.0.0-alpha-4", "3.0.0-beta-1", "3.0.0-beta-2", "3.0.0-beta-3"]
+                  "3.0.0-alpha-1", "3.0.0-alpha-2", "3.0.0-alpha-3", "3.0.0-alpha-4", "3.0.0-beta-1", "3.0.0-beta-2", "3.0.0-beta-3", "3.0.0-rc-1", "3.0.0-rc-2", "3.0.0-rc-3", "3.0.0", "3.0.1", "3.0.2", "3.0.3", "3.0.4", "3.0.5", "3.0.6", "3.0.7", "3.0.8", "3.0.9",
+                  "4.0.0-alpha-1", "4.0.0-alpha-2", "4.0.0-alpha-3", "4.0.0-beta-1", "4.0.0-beta-2", "4.0.0-rc-1"]
 for (int i = 0; i < groovyVersions.size(); i++) {
     def groovyVersion = groovyVersions[i]
+
     System.out.print "Testing Groovy ${groovyVersion}..."
-    def pom = new File("pom.xml")
-    pom.write((pom.text =~ /<groovyVersion>.+/).replaceFirst("<groovyVersion>${groovyVersion}</groovyVersion>"))
     testLabel = groovyVersion
     os = new FileOutputStream(new File("groovy-${testLabel}.log"))
-    profile = "${i < groovyVersions.indexOf("2.3.0") ? 'pre2.3-' : ''}nonindy"
+    profiles = "${i < groovyVersions.indexOf("2.3.0") ? 'pre2.3-' : ''}nonindy"
+    properties = "-DgroovyVersion=${groovyVersion} -DgroovyGroupId=${i >= groovyVersions.indexOf("4.0.0-alpha-1") ? 'org.apache.groovy' : 'org.codehaus.groovy'}"
     testVersion()
-    if (i >= groovyVersions.indexOf("2.0.0-beta-3")) {
+
+    if (i >= groovyVersions.indexOf("2.0.0-beta-3") && i < groovyVersions.indexOf("4.0.0-alpha-1")) {
         System.out.print "Testing Groovy ${groovyVersion}-indy..."
         testLabel = "${groovyVersion}-indy"
         os = new FileOutputStream(new File("groovy-${testLabel}.log"))
-        profile = "${i < groovyVersions.indexOf("2.3.0") ? 'pre2.3-' : ''}indy"
+        profiles = "${i < groovyVersions.indexOf("2.3.0") ? 'pre2.3-' : ''}indy"
+        properties = "-DgroovyVersion=${groovyVersion} -DgroovyGroupId=${i >= groovyVersions.indexOf("4.0.0-alpha-1") ? 'org.apache.groovy' : 'org.codehaus.groovy'}"
         testVersion()
     }
 }
-quietlyRunCommand "git checkout pom.xml"
 quietlyRunCommand "${mvn()} -B clean"
 
 void testVersion() {
-    def exitCode = runCommand "${mvn()} -B -P $profile -Dinvoker.streamLogs=true invoker:run"
+    def exitCode = runCommand "${mvn()} --batch-mode --activate-profiles ${profiles} -Dinvoker.streamLogs=true ${properties} invoker:run"
     os.flush()
     os.close()
     if (exitCode != 0) {
@@ -57,18 +61,18 @@ def runCommand(def command) {
     proc.waitFor()
 }
 
-def quietlyRunCommand(def command) {
+static def quietlyRunCommand(def command) {
     def proc = command.execute()
     proc.consumeProcessOutput()
     proc.waitFor()
 }
 
-def mvn() {
+static def mvn() {
     if (System.getProperty('os.name').contains('Windows')) {
         try {
             quietlyRunCommand("mvn.bat -v")
             return "mvn.bat"
-        } catch (IOException ioe) {
+        } catch (IOException ignored) {
             return "mvn.cmd"
         }
     } else {
diff --git a/pom.xml b/pom.xml
index 6759f69..c7ec800 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,25 +5,27 @@
   <groupId>org.codehaus.gmavenplus</groupId>
   <artifactId>gmavenplus-plugin</artifactId>
   <packaging>maven-plugin</packaging>
-  <version>1.8.1</version>
+  <version>1.14.0-SNAPSHOT</version>
 
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-    <mavenVersion>3.0.1</mavenVersion>
-    <jacocoPluginVersion>0.8.3</jacocoPluginVersion>
-    <javadocPluginVersion>3.1.0</javadocPluginVersion>
+    <mavenVersion>3.0</mavenVersion>
+    <jacocoPluginVersion>0.8.7</jacocoPluginVersion>
+    <javadocPluginVersion>3.3.1</javadocPluginVersion>
+    <shortJavaVersion>8</shortJavaVersion>
     <!-- these are properties so integration tests can use them -->
-    <javaVersion>1.6</javaVersion>
-    <dependencyPluginVersion>3.1.1</dependencyPluginVersion>
+    <javaVersion>1.${shortJavaVersion}</javaVersion>
+    <dependencyPluginVersion>3.2.0</dependencyPluginVersion>
     <compilerPluginVersion>3.8.1</compilerPluginVersion>
-    <junitVersion>4.12</junitVersion>
-    <surefirePluginVersion>2.22.1</surefirePluginVersion>
-    <pluginPluginVersion>3.6.0</pluginPluginVersion>
+    <junitVersion>4.13.2</junitVersion>
+    <surefirePluginVersion>3.0.0-M5</surefirePluginVersion>
+    <pluginPluginVersion>3.6.1</pluginPluginVersion>
     <!-- this is a property so that site generation can use it -->
-    <sourcePluginVersion>3.0.1</sourcePluginVersion>
-    <!-- this is a property so that site generation and integration tests can use it -->
-    <groovyVersion>2.5.8</groovyVersion>
+    <sourcePluginVersion>3.2.1</sourcePluginVersion>
+    <!-- these are properties so that site generation and integration tests can use it -->
+    <groovyGroupId>org.codehaus.groovy</groovyGroupId>
+    <groovyVersion>3.0.9</groovyVersion>
   </properties>
 
   <dependencies>
@@ -50,24 +52,33 @@
     <dependency>
       <groupId>org.apache.maven.plugin-tools</groupId>
       <artifactId>maven-plugin-annotations</artifactId>
-      <version>3.6.0</version>
+      <version>3.6.2</version>
       <scope>provided</scope>
     </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-classworlds</artifactId>
-      <version>2.6.0</version>
-    </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-archiver</artifactId>
-      <version>2.6</version>
+      <version>3.5.1</version>
+    </dependency>
+    <dependency>
+      <!-- this is needed to be able to use maven-archiver 3.5 -->
+      <groupId>org.apache.maven.shared</groupId>
+      <artifactId>maven-shared-utils</artifactId>
+      <version>3.3.4</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <!-- this is needed to be able to use maven-archiver 3.5 -->
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+      <version>3.4.1</version>
+      <scope>runtime</scope>
     </dependency>
     <dependency>
       <!-- this is to support use of Groovysh (Groovy jars don't include) -->
       <groupId>org.fusesource.jansi</groupId>
       <artifactId>jansi</artifactId>
-      <version>1.17.1</version>
+      <version>2.4.0</version>
       <scope>runtime</scope>
     </dependency>
     <dependency>
@@ -82,14 +93,14 @@
       <!-- this is to support use of AntBuilder (Groovy jars don't include) -->
       <groupId>org.apache.ant</groupId>
       <artifactId>ant</artifactId>
-      <version>1.10.5</version>
+      <version>1.10.12</version>
       <scope>runtime</scope>
     </dependency>
     <dependency>
       <!-- this is to support use of @grab (Groovy jars don't include) -->
       <groupId>org.apache.ivy</groupId>
       <artifactId>ivy</artifactId>
-      <version>2.4.0</version>
+      <version>2.5.0</version>
       <scope>runtime</scope>
     </dependency>
     <dependency>
@@ -101,7 +112,7 @@
     <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
-      <version>2.27.0</version>
+      <version>4.1.0</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
@@ -111,21 +122,21 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>${groovyGroupId}</groupId>
           <artifactId>groovy</artifactId>
           <version>${groovyVersion}</version>
           <classifier>indy</classifier>
           <scope>test</scope>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>${groovyGroupId}</groupId>
           <artifactId>groovy-ant</artifactId>
           <version>${groovyVersion}</version>
           <classifier>indy</classifier>
           <scope>test</scope>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>${groovyGroupId}</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <version>${groovyVersion}</version>
           <classifier>indy</classifier>
@@ -150,19 +161,19 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>${groovyGroupId}</groupId>
           <artifactId>groovy</artifactId>
           <version>${groovyVersion}</version>
           <scope>test</scope>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>${groovyGroupId}</groupId>
           <artifactId>groovy-ant</artifactId>
           <version>${groovyVersion}</version>
           <scope>test</scope>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>${groovyGroupId}</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <version>${groovyVersion}</version>
           <scope>test</scope>
@@ -186,8 +197,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>${groovyGroupId}</groupId>
+          <artifactId>groovy</artifactId>
           <version>${groovyVersion}</version>
           <classifier>indy</classifier>
           <scope>test</scope>
@@ -211,8 +222,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>${groovyGroupId}</groupId>
+          <artifactId>groovy</artifactId>
           <version>${groovyVersion}</version>
           <scope>test</scope>
         </dependency>
@@ -244,10 +255,9 @@
           <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-gpg-plugin</artifactId>
-            <version>1.6</version>
+            <version>3.0.1</version>
             <executions>
               <execution>
-                <id>sign-artifacts</id>
                 <goals>
                   <goal>sign</goal>
                 </goals>
@@ -268,25 +278,40 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-enforcer-plugin</artifactId>
-        <version>1.4.1</version>
+        <version>3.0.0</version>
         <executions>
           <execution>
-            <id>enforce-versions</id>
             <goals>
               <goal>enforce</goal>
             </goals>
             <configuration>
               <rules>
                 <requireMavenVersion>
-                  <version>[3.0.1,)</version>
+                  <version>[3.3.9,)</version>
                 </requireMavenVersion>
                 <requireJavaVersion>
-                  <version>[1.8,)</version>
+                  <version>[1.11,)</version>
                 </requireJavaVersion>
+                <enforceBytecodeVersion>
+                  <maxJdkVersion>${javaVersion}</maxJdkVersion>
+                  <ignoredScopes>
+                    <ignoredScope>test</ignoredScope>
+                  </ignoredScopes>
+                  <excludes>
+                    <exclude>org.apache.ant:*</exclude>
+                  </excludes>
+                </enforceBytecodeVersion>
               </rules>
             </configuration>
           </execution>
         </executions>
+        <dependencies>
+          <dependency>
+            <groupId>org.codehaus.mojo</groupId>
+            <artifactId>extra-enforcer-rules</artifactId>
+            <version>1.4</version>
+          </dependency>
+        </dependencies>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -301,7 +326,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
-        <version>3.1.0</version>
+        <version>3.2.0</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -318,7 +343,7 @@
       <plugin>
         <groupId>org.codehaus.plexus</groupId>
         <artifactId>plexus-component-metadata</artifactId>
-        <version>2.0.0</version>
+        <version>2.1.0</version>
         <executions>
           <execution>
             <goals>
@@ -352,10 +377,9 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>animal-sniffer-maven-plugin</artifactId>
-        <version>1.17</version>
+        <version>1.20</version>
         <executions>
           <execution>
-            <id>sniffClasses</id>
             <goals>
               <goal>check</goal>
             </goals>
@@ -364,15 +388,15 @@
         <configuration>
           <signature>
             <groupId>org.codehaus.mojo.signature</groupId>
-            <artifactId>java16</artifactId>
+            <artifactId>java1${shortJavaVersion}</artifactId>
             <version>1.0</version>
           </signature>
           <ignoreDependencies>false</ignoreDependencies>
           <ignores>
-            <!-- these are ignored because they seem to be pulled in from Maven's bootstrap even though the bootstrap version may not match the compilation version -->
+            <!-- these are ignored because they seem to be pulled in from Maven's bootstrap even though the bootstrap
+            version may not match the compilation version -->
             <ignore>org/apache/maven/*</ignore>
             <ignore>org/codehaus/plexus/*</ignore>
-            <ignore>org/codehaus/classworlds/*</ignore>
           </ignores>
         </configuration>
       </plugin>
@@ -396,12 +420,12 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jar-plugin</artifactId>
-        <version>3.1.1</version>
+        <version>3.2.0</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-invoker-plugin</artifactId>
-        <version>3.2.0</version>
+        <version>3.2.2</version>
         <configuration>
           <projectsDirectory>src/it</projectsDirectory>
           <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
@@ -418,7 +442,6 @@
         <version>${sourcePluginVersion}</version>
         <executions>
           <execution>
-            <id>attach-sources</id>
             <goals>
               <goal>jar</goal>
             </goals>
@@ -430,12 +453,14 @@
         <artifactId>maven-javadoc-plugin</artifactId>
         <version>${javadocPluginVersion}</version>
         <configuration>
-          <source>6</source>
+          <source>${shortJavaVersion}</source>
           <failOnError>false</failOnError>
+          <links>
+            <link>https://docs.groovy-lang.org/latest/html/api/</link>
+          </links>
         </configuration>
         <executions>
           <execution>
-            <id>attach-javadocs</id>
             <goals>
               <goal>jar</goal>
             </goals>
@@ -445,22 +470,22 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-install-plugin</artifactId>
-        <version>2.5.2</version>
+        <version>3.0.0-M1</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-deploy-plugin</artifactId>
-        <version>2.8.2</version>
+        <version>3.0.0-M1</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-site-plugin</artifactId>
-        <version>3.7.1</version>
+        <version>3.9.1</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-release-plugin</artifactId>
-        <version>2.5.3</version>
+        <version>3.0.0-M4</version>
       </plugin>
     </plugins>
 
@@ -468,12 +493,12 @@
       <extension>
         <groupId>org.apache.maven.scm</groupId>
         <artifactId>maven-scm-provider-gitexe</artifactId>
-        <version>1.11.2</version>
+        <version>1.12.0</version>
       </extension>
       <extension>
         <groupId>org.apache.maven.scm</groupId>
         <artifactId>maven-scm-manager-plexus</artifactId>
-        <version>1.11.2</version>
+        <version>1.12.0</version>
       </extension>
       <extension>
         <groupId>com.github.stephenc.wagon</groupId>
@@ -499,21 +524,24 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-jxr-plugin</artifactId>
-        <version>3.0.0</version>
+        <version>3.1.1</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
         <version>${javadocPluginVersion}</version>
         <configuration>
-          <source>6</source>
+          <source>${javaVersion}</source>
           <failOnError>false</failOnError>
+          <links>
+            <link>https://docs.groovy-lang.org/latest/html/api/</link>
+          </links>
         </configuration>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-project-info-reports-plugin</artifactId>
-        <version>3.0.0</version>
+        <version>3.1.2</version>
       </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -561,7 +589,7 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-pmd-plugin</artifactId>
-        <version>3.12.0</version>
+        <version>3.15.0</version>
       </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
@@ -571,12 +599,12 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-checkstyle-plugin</artifactId>
-        <version>3.0.0</version>
+        <version>3.1.2</version>
       </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>versions-maven-plugin</artifactId>
-        <version>2.7</version>
+        <version>2.8.1</version>
         <reportSets>
           <reportSet>
             <reports>
@@ -590,7 +618,7 @@
       <!--<plugin>-->
         <!--<groupId>org.apache.maven.plugins</groupId>-->
         <!--<artifactId>maven-changes-plugin</artifactId>-->
-        <!--<version>2.11</version>-->
+        <!--<version>2.12.1</version>-->
         <!--<reportSets>-->
           <!--<reportSet>-->
             <!--<reports>-->
@@ -662,11 +690,11 @@
     <url>http://github.com/groovy/GMavenPlus</url>
     <connection>scm:git:git@github.com:groovy/GMavenPlus.git</connection>
     <developerConnection>scm:git:git@github.com:groovy/GMavenPlus.git</developerConnection>
-    <tag>1.8.1</tag>
+    <tag>HEAD</tag>
   </scm>
   <ciManagement>
-    <system>Travis</system>
-    <url>https://travis-ci.org/groovy/GMavenPlus</url>
+    <system>Github Actions</system>
+    <url>https://github.com/groovy/GMavenPlus/actions</url>
   </ciManagement>
 
 </project>
diff --git a/sonar-project.properties b/sonar-project.properties
index 80d376f..89691c5 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -2,4 +2,4 @@ sonar.projectKey=org.codehaus.gmavenplus:gmavenplus-plugin
 sonar.projectName=GMavenPlus Plugin
 sonar.projectVersion=master
 sonar.sources=src/main
-sonar.java.source=1.6
+sonar.java.source=1.8
diff --git a/src/it/advancedCompile/invoker.properties b/src/it/advancedCompile/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/advancedCompile/invoker.properties
+++ b/src/it/advancedCompile/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/advancedCompile/pom.xml b/src/it/advancedCompile/pom.xml
index ad03b11..7a8912b 100644
--- a/src/it/advancedCompile/pom.xml
+++ b/src/it/advancedCompile/pom.xml
@@ -31,7 +31,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -41,7 +41,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -50,8 +50,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -60,8 +60,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/advancedExecute/invoker.properties b/src/it/advancedExecute/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/advancedExecute/invoker.properties
+++ b/src/it/advancedExecute/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/advancedExecute/pom.xml b/src/it/advancedExecute/pom.xml
index 834ce3f..a8169da 100644
--- a/src/it/advancedExecute/pom.xml
+++ b/src/it/advancedExecute/pom.xml
@@ -14,7 +14,9 @@
   <artifactId>gmavenplus-plugin-it-advancedExecute</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Execute Test</name>
-  <description>The kitchen sink of script executions. Because this uses Grapes, it will fail for all versions of Groovy before 1.7-beta-1.</description>
+  <description>The kitchen sink of script executions. Because this uses Grapes, it will fail for all versions of
+    Groovy before 1.7-beta-1.
+  </description>
 
   <properties>
     <projectProp>yetAnotherValue</projectProp>
@@ -25,11 +27,6 @@
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
     </dependency>
-    <dependency>
-      <!-- this is only needed because the script uses it -->
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-classic</artifactId>
-    </dependency>
   </dependencies>
 
   <profiles>
@@ -42,13 +39,13 @@
             <artifactId>gmavenplus-plugin</artifactId>
             <dependencies>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
+                <groupId>@groovyGroupId@</groupId>
                 <artifactId>groovy</artifactId>
                 <version>@groovyVersion@</version>
                 <classifier>indy</classifier>
               </dependency>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
+                <groupId>@groovyGroupId@</groupId>
                 <artifactId>groovy-ant</artifactId>
                 <version>@groovyVersion@</version>
                 <classifier>indy</classifier>
@@ -67,12 +64,12 @@
             <artifactId>gmavenplus-plugin</artifactId>
             <dependencies>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
+                <groupId>@groovyGroupId@</groupId>
                 <artifactId>groovy</artifactId>
                 <version>@groovyVersion@</version>
               </dependency>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
+                <groupId>@groovyGroupId@</groupId>
                 <artifactId>groovy-ant</artifactId>
                 <version>@groovyVersion@</version>
               </dependency>
@@ -90,8 +87,8 @@
             <artifactId>gmavenplus-plugin</artifactId>
             <dependencies>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
-                <artifactId>groovy-all</artifactId>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
                 <version>@groovyVersion@</version>
                 <classifier>indy</classifier>
               </dependency>
@@ -109,8 +106,8 @@
             <artifactId>gmavenplus-plugin</artifactId>
             <dependencies>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
-                <artifactId>groovy-all</artifactId>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
                 <version>@groovyVersion@</version>
               </dependency>
             </dependencies>
diff --git a/src/it/advancedExecute/test.properties b/src/it/advancedExecute/test.properties
index 76ef258..6850600 100644
--- a/src/it/advancedExecute/test.properties
+++ b/src/it/advancedExecute/test.properties
@@ -1 +1 @@
-cliProp = someOtherValue
+cliProp=someOtherValue
diff --git a/src/it/advancedGenerateStubs/invoker.properties b/src/it/advancedGenerateStubs/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/advancedGenerateStubs/invoker.properties
+++ b/src/it/advancedGenerateStubs/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/advancedGenerateStubs/pom.xml b/src/it/advancedGenerateStubs/pom.xml
index cefb2b6..f34ce9e 100644
--- a/src/it/advancedGenerateStubs/pom.xml
+++ b/src/it/advancedGenerateStubs/pom.xml
@@ -13,7 +13,9 @@
 
   <artifactId>gmavenplus-plugin-it-advancedGenerateStubs</artifactId>
   <name>GMavenPlus Plugin Advanced Generate Stubs Test</name>
-  <description>The kitchen sink of stub generation use cases. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>The kitchen sink of stub generation use cases. This will fail for all versions of Groovy before
+    1.8.2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -27,7 +29,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -37,7 +39,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -46,8 +48,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -56,8 +58,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/advancedGroovydoc/invoker.properties b/src/it/advancedGroovydoc/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/advancedGroovydoc/invoker.properties
+++ b/src/it/advancedGroovydoc/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/advancedGroovydoc/pom.xml b/src/it/advancedGroovydoc/pom.xml
index 741951f..aa2d1fc 100644
--- a/src/it/advancedGroovydoc/pom.xml
+++ b/src/it/advancedGroovydoc/pom.xml
@@ -28,12 +28,12 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -43,11 +43,11 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
         </dependency>
       </dependencies>
@@ -56,8 +56,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -66,8 +66,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
@@ -102,15 +102,11 @@
           <links>
             <link>
               <packages>java,javax,org.ietf.jgss,org.omg,org.w3c,org.xml</packages>
-              <href>http://docs.oracle.com/javase/5/docs/api/</href>
+              <href>https://docs.oracle.com/en/java/javase/11/docs/api/</href>
             </link>
             <link>
               <packages>org.codehaus.groovy,groovy</packages>
-              <href>http://docs.groovy-lang.org/latest/html/api/</href>
-            </link>
-            <link>
-              <packages>junit,org.junit</packages>
-              <href>http://junit.org/javadoc/latest/</href>
+              <href>https://docs.groovy-lang.org/latest/html/api/</href>
             </link>
           </links>
         </configuration>
diff --git a/src/it/advancedGroovydoc/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy b/src/it/advancedGroovydoc/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
index 0204037..1445c7e 100644
--- a/src/it/advancedGroovydoc/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
+++ b/src/it/advancedGroovydoc/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
@@ -18,17 +18,17 @@ package org.codehaus.gmavenplus
 
 
 /**
-* Some Example Cass
-*
-* @author Keegan Witt
-* @version super awesome
-*/
+ * Some Example Cass
+ *
+ * @author Keegan Witt
+ * @version super awesome
+ */
 class SomeClass {
 
-   /**
-    * This method does absolutely nothing
-    * @param unusedParam a useless parameter
-    */
-   void doNothing(String unusedParam) { }
+    /**
+     * This method does absolutely nothing
+     * @param unusedParam a useless parameter
+     */
+    void doNothing(String unusedParam) {}
 
 }
diff --git a/src/it/advancedGroovydoc/src/test/java/org/codehaus/gmavenplus/TheTest.java b/src/it/advancedGroovydoc/src/test/java/org/codehaus/gmavenplus/TheTest.java
index a4ee077..5bd400b 100644
--- a/src/it/advancedGroovydoc/src/test/java/org/codehaus/gmavenplus/TheTest.java
+++ b/src/it/advancedGroovydoc/src/test/java/org/codehaus/gmavenplus/TheTest.java
@@ -32,7 +32,7 @@ public class TheTest {
         Assert.assertTrue(generatedGroovyDoc + " does not exist.", generatedGroovyDoc.exists());
         Assert.assertTrue(generatedGroovyDoc + " is empty.", generatedGroovyDoc.length() > 0);
         Assert.assertTrue(generatedGroovyDoc + " does not contain Java 5 links.", readFileToString(generatedGroovyDoc)
-                .contains("http://docs.oracle.com/javase/5/docs/api/"));
+                .contains("https://docs.oracle.com/en/java/javase/11/docs/api/"));
     }
 
     @Test
@@ -41,7 +41,7 @@ public class TheTest {
         Assert.assertTrue(generatedGroovyDoc + " does not exist.", generatedGroovyDoc.exists());
         Assert.assertTrue(generatedGroovyDoc + " is empty.", generatedGroovyDoc.length() > 0);
         Assert.assertTrue(generatedGroovyDoc + " does not contain Java 5 links.", readFileToString(generatedGroovyDoc)
-                .contains("http://docs.oracle.com/javase/5/docs/api/"));
+                .contains("https://docs.oracle.com/en/java/javase/11/docs/api/"));
     }
 
     @Test
diff --git a/src/it/astCompile/invoker.properties b/src/it/astCompile/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/astCompile/invoker.properties
+++ b/src/it/astCompile/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/astCompile/pom.xml b/src/it/astCompile/pom.xml
index 4512b1e..2ce549a 100644
--- a/src/it/astCompile/pom.xml
+++ b/src/it/astCompile/pom.xml
@@ -14,7 +14,8 @@
   <artifactId>gmavenplus-plugin-it-astCompile</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin AST Compile Test</name>
-  <description>A test of an AST transformation. This will fail for all Groovy versions before 1.6-beta-2.</description>
+  <description>A test of an AST transformation. This will fail for all Groovy versions before 1.6-beta-2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,7 +29,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -38,7 +39,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -47,8 +48,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -57,8 +58,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/astCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy b/src/it/astCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
index 570acbc..fe406b6 100644
--- a/src/it/astCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
+++ b/src/it/astCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
@@ -18,7 +18,8 @@ package org.codehaus.gmavenplus
 
 
 class SomeClass {
-    @Lazy def list = ["dog", "cat"]
+    @Lazy
+    def list = ["dog", "cat"]
 
     def someMethod() {
         return list.toString()
diff --git a/src/it/basicCompile/invoker.properties b/src/it/basicCompile/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/basicCompile/invoker.properties
+++ b/src/it/basicCompile/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/basicCompile/pom.xml b/src/it/basicCompile/pom.xml
index 6b0bb95..2e55220 100644
--- a/src/it/basicCompile/pom.xml
+++ b/src/it/basicCompile/pom.xml
@@ -28,7 +28,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -38,7 +38,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -47,8 +47,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -57,8 +57,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/basicCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy b/src/it/basicCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
index 03fc041..7bc56a3 100644
--- a/src/it/basicCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
+++ b/src/it/basicCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
@@ -16,7 +16,12 @@
 
 package org.codehaus.gmavenplus
 
+import groovy.transform.Canonical
+import groovy.transform.CompileStatic
 
+
+@Canonical
+@CompileStatic
 class SomeClass {
 
     String someMethod() {
diff --git a/src/it/basicExecute/invoker.properties b/src/it/basicExecute/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/basicExecute/invoker.properties
+++ b/src/it/basicExecute/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/basicExecute/pom.xml b/src/it/basicExecute/pom.xml
index 0a54453..8603a64 100644
--- a/src/it/basicExecute/pom.xml
+++ b/src/it/basicExecute/pom.xml
@@ -32,13 +32,13 @@
             <artifactId>gmavenplus-plugin</artifactId>
             <dependencies>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
+                <groupId>@groovyGroupId@</groupId>
                 <artifactId>groovy</artifactId>
                 <version>@groovyVersion@</version>
                 <classifier>indy</classifier>
               </dependency>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
+                <groupId>@groovyGroupId@</groupId>
                 <artifactId>groovy-ant</artifactId>
                 <version>@groovyVersion@</version>
                 <classifier>indy</classifier>
@@ -57,12 +57,12 @@
             <artifactId>gmavenplus-plugin</artifactId>
             <dependencies>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
+                <groupId>@groovyGroupId@</groupId>
                 <artifactId>groovy</artifactId>
                 <version>@groovyVersion@</version>
               </dependency>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
+                <groupId>@groovyGroupId@</groupId>
                 <artifactId>groovy-ant</artifactId>
                 <version>@groovyVersion@</version>
               </dependency>
@@ -80,8 +80,8 @@
             <artifactId>gmavenplus-plugin</artifactId>
             <dependencies>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
-                <artifactId>groovy-all</artifactId>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
                 <version>@groovyVersion@</version>
                 <classifier>indy</classifier>
               </dependency>
@@ -99,8 +99,8 @@
             <artifactId>gmavenplus-plugin</artifactId>
             <dependencies>
               <dependency>
-                <groupId>org.codehaus.groovy</groupId>
-                <artifactId>groovy-all</artifactId>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
                 <version>@groovyVersion@</version>
               </dependency>
             </dependencies>
diff --git a/src/it/basicGenerateStubs/invoker.properties b/src/it/basicGenerateStubs/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/basicGenerateStubs/invoker.properties
+++ b/src/it/basicGenerateStubs/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/basicGenerateStubs/pom.xml b/src/it/basicGenerateStubs/pom.xml
index 89e7497..5f03918 100644
--- a/src/it/basicGenerateStubs/pom.xml
+++ b/src/it/basicGenerateStubs/pom.xml
@@ -14,7 +14,8 @@
   <artifactId>gmavenplus-plugin-it-basicGenerateStubs</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Basic Generate Stubs Test</name>
-  <description>The simplest generate stubs use case. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>The simplest generate stubs use case. This will fail for all versions of Groovy before 1.8.2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,7 +29,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -38,7 +39,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -47,8 +48,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -57,8 +58,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/basicGroovydoc/invoker.properties b/src/it/basicGroovydoc/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/basicGroovydoc/invoker.properties
+++ b/src/it/basicGroovydoc/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/basicGroovydoc/pom.xml b/src/it/basicGroovydoc/pom.xml
index 426c0fd..6453577 100644
--- a/src/it/basicGroovydoc/pom.xml
+++ b/src/it/basicGroovydoc/pom.xml
@@ -28,12 +28,12 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -43,11 +43,11 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
         </dependency>
       </dependencies>
@@ -56,8 +56,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -66,8 +66,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/basicGroovydoc/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy b/src/it/basicGroovydoc/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
index 0204037..1445c7e 100644
--- a/src/it/basicGroovydoc/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
+++ b/src/it/basicGroovydoc/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
@@ -18,17 +18,17 @@ package org.codehaus.gmavenplus
 
 
 /**
-* Some Example Cass
-*
-* @author Keegan Witt
-* @version super awesome
-*/
+ * Some Example Cass
+ *
+ * @author Keegan Witt
+ * @version super awesome
+ */
 class SomeClass {
 
-   /**
-    * This method does absolutely nothing
-    * @param unusedParam a useless parameter
-    */
-   void doNothing(String unusedParam) { }
+    /**
+     * This method does absolutely nothing
+     * @param unusedParam a useless parameter
+     */
+    void doNothing(String unusedParam) {}
 
 }
diff --git a/src/it/basicGroovydocJar/invoker.properties b/src/it/basicGroovydocJar/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/basicGroovydocJar/invoker.properties
+++ b/src/it/basicGroovydocJar/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/basicGroovydocJar/pom.xml b/src/it/basicGroovydocJar/pom.xml
index d19f689..4314885 100644
--- a/src/it/basicGroovydocJar/pom.xml
+++ b/src/it/basicGroovydocJar/pom.xml
@@ -28,36 +28,45 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <classifier>indy</classifier>
         </dependency>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy-templates</artifactId>
+          <classifier>indy</classifier>
+        </dependency>
       </dependencies>
     </profile>
     <profile>
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
         </dependency>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy-templates</artifactId>
+        </dependency>
       </dependencies>
     </profile>
     <profile>
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -66,8 +75,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/basicGroovydocJar/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy b/src/it/basicGroovydocJar/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
index 11bb8fb..aa29472 100644
--- a/src/it/basicGroovydocJar/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
+++ b/src/it/basicGroovydocJar/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
@@ -18,17 +18,17 @@ package org.codehaus.gmavenplus
 
 
 /**
-* Some Example Cass
-*
-* @author Keegan Witt
-* @version super awesome
-*/
+ * Some Example Cass
+ *
+ * @author Keegan Witt
+ * @version super awesome
+ */
 class SomeClass {
 
-   /**
-    * This method does absolutely nothing
-    * @param unusedParam a useless parameter
-    */
-   void doNothing(String unusedParam) { }
+    /**
+     * This method does absolutely nothing
+     * @param unusedParam a useless parameter
+     */
+    void doNothing(String unusedParam) {}
 
 }
diff --git a/src/it/basicGroovydocJar/src/test/java/org/codehaus/gmavenplus/SomeClassTest.java b/src/it/basicGroovydocJar/src/test/java/org/codehaus/gmavenplus/SomeClassTest.java
index cf6ce57..40a8130 100644
--- a/src/it/basicGroovydocJar/src/test/java/org/codehaus/gmavenplus/SomeClassTest.java
+++ b/src/it/basicGroovydocJar/src/test/java/org/codehaus/gmavenplus/SomeClassTest.java
@@ -19,7 +19,6 @@ package org.codehaus.gmavenplus;
 import org.junit.Assert;
 import org.junit.Test;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.Enumeration;
 import java.util.zip.ZipEntry;
diff --git a/src/it/cleanClasspathCompile/invoker.properties b/src/it/cleanClasspathCompile/invoker.properties
index dbe2149..075fefd 100644
--- a/src/it/cleanClasspathCompile/invoker.properties
+++ b/src/it/cleanClasspathCompile/invoker.properties
@@ -1,3 +1,3 @@
-invoker.goals = clean compile
-invoker.buildResult = failure
+invoker.goals=clean compile
+invoker.buildResult=failure
 #invoker.debug = true
diff --git a/src/it/cleanClasspathCompile/pom.xml b/src/it/cleanClasspathCompile/pom.xml
index 1559847..ba729c1 100644
--- a/src/it/cleanClasspathCompile/pom.xml
+++ b/src/it/cleanClasspathCompile/pom.xml
@@ -14,7 +14,9 @@
   <artifactId>gmavenplus-plugin-it-cleanClasspathCompile</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Clean Classpath Compile Test</name>
-  <description>The simplest compile use case where it would fail if the classpath were polluted with the plugin classpath.</description>
+  <description>The simplest compile use case where it would fail if the classpath were polluted with the plugin
+    classpath.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,7 +30,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -38,7 +40,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -47,8 +49,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -57,8 +59,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/cleanClasspathGenerateStubs/invoker.properties b/src/it/cleanClasspathGenerateStubs/invoker.properties
index dbe2149..075fefd 100644
--- a/src/it/cleanClasspathGenerateStubs/invoker.properties
+++ b/src/it/cleanClasspathGenerateStubs/invoker.properties
@@ -1,3 +1,3 @@
-invoker.goals = clean compile
-invoker.buildResult = failure
+invoker.goals=clean compile
+invoker.buildResult=failure
 #invoker.debug = true
diff --git a/src/it/cleanClasspathGenerateStubs/pom.xml b/src/it/cleanClasspathGenerateStubs/pom.xml
index bdbbd33..538fd09 100644
--- a/src/it/cleanClasspathGenerateStubs/pom.xml
+++ b/src/it/cleanClasspathGenerateStubs/pom.xml
@@ -14,7 +14,9 @@
   <artifactId>gmavenplus-plugin-it-cleanClasspathGenerateStubs</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Clean Classpath Generate Stubs Test</name>
-  <description>The simplest generate stubs use case where it would fail if the classpath were polluted with the plugin classpath. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>The simplest generate stubs use case where it would fail if the classpath were polluted with the plugin
+    classpath. This will fail for all versions of Groovy before 1.8.2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,7 +30,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -38,7 +40,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -47,8 +49,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -57,8 +59,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/configScriptCompile/invoker.properties b/src/it/configScriptCompile/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/configScriptCompile/invoker.properties
+++ b/src/it/configScriptCompile/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/configScriptCompile/pom.xml b/src/it/configScriptCompile/pom.xml
index db78a65..4ef2d6a 100644
--- a/src/it/configScriptCompile/pom.xml
+++ b/src/it/configScriptCompile/pom.xml
@@ -14,7 +14,9 @@
   <artifactId>gmavenplus-plugin-it-configScriptCompile</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Configuration Script Compile Test</name>
-  <description>The simplest compile use case with a configuration script. This will fail for all Groovy versions before 2.1.0-rc-2.</description>
+  <description>The simplest compile use case with a configuration script. This will fail for all Groovy versions
+    before 2.1.0-rc-2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,7 +30,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -38,7 +40,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -47,8 +49,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -57,8 +59,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/mavenPlugin/invoker.properties b/src/it/mavenPlugin/invoker.properties
index 326eb21..d3ad374 100644
--- a/src/it/mavenPlugin/invoker.properties
+++ b/src/it/mavenPlugin/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean install
+invoker.goals=clean install
 #invoker.debug = true
diff --git a/src/it/mavenPlugin/mojo/pom.xml b/src/it/mavenPlugin/mojo/pom.xml
index 06136ab..dddb33f 100644
--- a/src/it/mavenPlugin/mojo/pom.xml
+++ b/src/it/mavenPlugin/mojo/pom.xml
@@ -20,7 +20,7 @@
 
   <dependencies>
     <dependency>
-      <groupId>org.codehaus.groovy</groupId>
+      <groupId>@groovyGroupId@</groupId>
       <artifactId>groovy</artifactId>
       <version>@groovyVersion@</version>
       <!-- note that indy versions don't work with the help mojo -->
@@ -33,10 +33,6 @@
       <groupId>org.apache.maven.plugin-tools</groupId>
       <artifactId>maven-plugin-annotations</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.codehaus.plexus</groupId>
-      <artifactId>plexus-utils</artifactId>
-    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
diff --git a/src/it/mavenPlugin/mojo/src/main/groovy/org/codehaus/gmavenplus/HelloWorldMojo.groovy b/src/it/mavenPlugin/mojo/src/main/groovy/org/codehaus/gmavenplus/HelloWorldMojo.groovy
index d553a11..61fa406 100644
--- a/src/it/mavenPlugin/mojo/src/main/groovy/org/codehaus/gmavenplus/HelloWorldMojo.groovy
+++ b/src/it/mavenPlugin/mojo/src/main/groovy/org/codehaus/gmavenplus/HelloWorldMojo.groovy
@@ -21,7 +21,7 @@ import org.apache.maven.plugins.annotations.LifecyclePhase
 import org.apache.maven.plugins.annotations.Mojo
 
 
-@Mojo(name="helloworld", defaultPhase=LifecyclePhase.INSTALL)
+@Mojo(name = "helloworld", defaultPhase = LifecyclePhase.INSTALL)
 class HelloWorldMojo extends AbstractMojo {
 
     void execute() {
diff --git a/src/it/mixedCompile/invoker.properties b/src/it/mixedCompile/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/mixedCompile/invoker.properties
+++ b/src/it/mixedCompile/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/mixedCompile/pom.xml b/src/it/mixedCompile/pom.xml
index 6e4f42d..6335b97 100644
--- a/src/it/mixedCompile/pom.xml
+++ b/src/it/mixedCompile/pom.xml
@@ -14,7 +14,8 @@
   <artifactId>gmavenplus-plugin-it-mixedCompile</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Mixed Compile Test</name>
-  <description>This tests mixed Java/Groovy compilation. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>This tests mixed Java/Groovy compilation. This will fail for all versions of Groovy before 1.8.2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,12 +29,12 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-ant</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -43,11 +44,11 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-ant</artifactId>
         </dependency>
       </dependencies>
@@ -56,8 +57,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -66,8 +67,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/mixedCompile2/invoker.properties b/src/it/mixedCompile2/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/mixedCompile2/invoker.properties
+++ b/src/it/mixedCompile2/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/mixedCompile2/pom.xml b/src/it/mixedCompile2/pom.xml
index 0435699..7c03eca 100644
--- a/src/it/mixedCompile2/pom.xml
+++ b/src/it/mixedCompile2/pom.xml
@@ -14,7 +14,8 @@
   <artifactId>gmavenplus-plugin-it-mixedCompile2</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Mixed Compile Test 2</name>
-  <description>This tests mixed Java/Groovy compilation. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>This tests mixed Java/Groovy compilation. This will fail for all versions of Groovy before 1.8.2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,12 +29,12 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-ant</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -43,11 +44,11 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-ant</artifactId>
         </dependency>
       </dependencies>
@@ -56,8 +57,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -66,8 +67,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/mixedCompileCircular/invoker.properties b/src/it/mixedCompileCircular/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/mixedCompileCircular/invoker.properties
+++ b/src/it/mixedCompileCircular/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/mixedCompileCircular/pom.xml b/src/it/mixedCompileCircular/pom.xml
index ade7ce5..864a089 100644
--- a/src/it/mixedCompileCircular/pom.xml
+++ b/src/it/mixedCompileCircular/pom.xml
@@ -14,7 +14,9 @@
   <artifactId>gmavenplus-plugin-it-mixedCompileCircular</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Mixed Circular Compile Test</name>
-  <description>This tests mixed Java/Groovy compilation with a circular dependency between Java and Groovy classes. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>This tests mixed Java/Groovy compilation with a circular dependency between Java and Groovy classes.
+    This will fail for all versions of Groovy before 1.8.2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,7 +30,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -38,7 +40,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -47,8 +49,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -57,8 +59,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/mixedCompileCircular/src/main/java/org/codehaus/gmavenplus/java/JClass.java b/src/it/mixedCompileCircular/src/main/java/org/codehaus/gmavenplus/java/JClass.java
index 47eb531..0663f7e 100644
--- a/src/it/mixedCompileCircular/src/main/java/org/codehaus/gmavenplus/java/JClass.java
+++ b/src/it/mixedCompileCircular/src/main/java/org/codehaus/gmavenplus/java/JClass.java
@@ -20,22 +20,22 @@ import org.codehaus.gmavenplus.groovy.GObject;
 
 
 public class JClass {
-  private GObject gObject = new GObject();
-  private JObject jObject = new JObject();
+    private GObject gObject = new GObject();
+    private JObject jObject = new JObject();
 
-  public GObject getgObject() {
-    return gObject;
-  }
+    public GObject getgObject() {
+        return gObject;
+    }
 
-  public void setgObject(GObject gObject) {
-    this.gObject = gObject;
-  }
+    public void setgObject(GObject gObject) {
+        this.gObject = gObject;
+    }
 
-  public JObject getjObject() {
-    return jObject;
-  }
+    public JObject getjObject() {
+        return jObject;
+    }
 
-  public void setjObject(JObject jObject) {
-    this.jObject = jObject;
-  }
+    public void setjObject(JObject jObject) {
+        this.jObject = jObject;
+    }
 }
diff --git a/src/it/mixedCompileCircular/src/main/java/org/codehaus/gmavenplus/java/JObject.java b/src/it/mixedCompileCircular/src/main/java/org/codehaus/gmavenplus/java/JObject.java
index 270736d..b3c4eb3 100644
--- a/src/it/mixedCompileCircular/src/main/java/org/codehaus/gmavenplus/java/JObject.java
+++ b/src/it/mixedCompileCircular/src/main/java/org/codehaus/gmavenplus/java/JObject.java
@@ -17,4 +17,5 @@
 package org.codehaus.gmavenplus.java;
 
 
-public class JObject { }
+public class JObject {
+}
diff --git a/src/it/mixedCompileMultiModule/groovyModule/pom.xml b/src/it/mixedCompileMultiModule/groovyModule/pom.xml
index debf36b..76b0b6d 100644
--- a/src/it/mixedCompileMultiModule/groovyModule/pom.xml
+++ b/src/it/mixedCompileMultiModule/groovyModule/pom.xml
@@ -27,12 +27,12 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-ant</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -42,11 +42,11 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-ant</artifactId>
         </dependency>
       </dependencies>
@@ -55,8 +55,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -65,8 +65,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/mixedCompileMultiModule/invoker.properties b/src/it/mixedCompileMultiModule/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/mixedCompileMultiModule/invoker.properties
+++ b/src/it/mixedCompileMultiModule/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/mixedCompileMultiModule/javaModule/pom.xml b/src/it/mixedCompileMultiModule/javaModule/pom.xml
index a7753de..16e8bd4 100644
--- a/src/it/mixedCompileMultiModule/javaModule/pom.xml
+++ b/src/it/mixedCompileMultiModule/javaModule/pom.xml
@@ -31,7 +31,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -41,7 +41,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -50,8 +50,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -60,8 +60,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/mixedCompileMultiModule/pom.xml b/src/it/mixedCompileMultiModule/pom.xml
index 2f3ea89..c8dd575 100644
--- a/src/it/mixedCompileMultiModule/pom.xml
+++ b/src/it/mixedCompileMultiModule/pom.xml
@@ -15,7 +15,9 @@
   <version>testing</version>
   <packaging>pom</packaging>
   <name>GMavenPlus Plugin Mixed Compile MultiModule Test</name>
-  <description>This tests mixed Java/Groovy compilation across modules. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>This tests mixed Java/Groovy compilation across modules. This will fail for all versions of Groovy
+    before 1.8.2.
+  </description>
 
   <dependencyManagement>
     <dependencies>
diff --git a/src/it/mixedCompileMultiModule2/groovyModule/pom.xml b/src/it/mixedCompileMultiModule2/groovyModule/pom.xml
index 44eb7bc..35a34f2 100644
--- a/src/it/mixedCompileMultiModule2/groovyModule/pom.xml
+++ b/src/it/mixedCompileMultiModule2/groovyModule/pom.xml
@@ -31,12 +31,12 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-ant</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -46,11 +46,11 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-ant</artifactId>
         </dependency>
       </dependencies>
@@ -59,8 +59,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -69,8 +69,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/mixedCompileMultiModule2/invoker.properties b/src/it/mixedCompileMultiModule2/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/mixedCompileMultiModule2/invoker.properties
+++ b/src/it/mixedCompileMultiModule2/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/mixedCompileMultiModule2/javaModule/pom.xml b/src/it/mixedCompileMultiModule2/javaModule/pom.xml
index ee04137..1df791b 100644
--- a/src/it/mixedCompileMultiModule2/javaModule/pom.xml
+++ b/src/it/mixedCompileMultiModule2/javaModule/pom.xml
@@ -27,7 +27,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -37,7 +37,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -46,8 +46,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -56,8 +56,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/mixedCompileMultiModule2/pom.xml b/src/it/mixedCompileMultiModule2/pom.xml
index 15c4a76..54bd81b 100644
--- a/src/it/mixedCompileMultiModule2/pom.xml
+++ b/src/it/mixedCompileMultiModule2/pom.xml
@@ -15,7 +15,9 @@
   <version>testing</version>
   <packaging>pom</packaging>
   <name>GMavenPlus Plugin Mixed Compile MultiModule Test 2</name>
-  <description>This tests mixed Java/Groovy compilation across modules. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>This tests mixed Java/Groovy compilation across modules. This will fail for all versions of Groovy
+    before 1.8.2.
+  </description>
 
   <dependencyManagement>
     <dependencies>
diff --git a/src/it/mixedGroovydoc/invoker.properties b/src/it/mixedGroovydoc/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/mixedGroovydoc/invoker.properties
+++ b/src/it/mixedGroovydoc/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/mixedGroovydoc/pom.xml b/src/it/mixedGroovydoc/pom.xml
index 60f42cd..d3301e4 100644
--- a/src/it/mixedGroovydoc/pom.xml
+++ b/src/it/mixedGroovydoc/pom.xml
@@ -14,7 +14,9 @@
   <artifactId>gmavenplus-plugin-it-mixedGroovyDoc</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Mixed GroovyDoc Test</name>
-  <description>This tests mixed Java/Groovy GroovyDoc generation. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>This tests mixed Java/Groovy GroovyDoc generation. This will fail for all versions of Groovy before
+    1.8.2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,12 +30,12 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -43,11 +45,11 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
         </dependency>
       </dependencies>
@@ -56,8 +58,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -66,8 +68,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/mixedGroovydoc2/invoker.properties b/src/it/mixedGroovydoc2/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/mixedGroovydoc2/invoker.properties
+++ b/src/it/mixedGroovydoc2/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/mixedGroovydoc2/pom.xml b/src/it/mixedGroovydoc2/pom.xml
index af19ea4..ebf8a5d 100644
--- a/src/it/mixedGroovydoc2/pom.xml
+++ b/src/it/mixedGroovydoc2/pom.xml
@@ -14,7 +14,9 @@
   <artifactId>gmavenplus-plugin-it-mixedGroovyDoc2</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Mixed GroovyDoc 2 Test</name>
-  <description>This tests mixed Java/Groovy GroovyDoc generation. This will fail for all versions of Groovy before 1.8.2.</description>
+  <description>This tests mixed Java/Groovy GroovyDoc generation. This will fail for all versions of Groovy before
+    1.8.2.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,12 +30,12 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -43,11 +45,11 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
         </dependency>
       </dependencies>
@@ -56,8 +58,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -66,8 +68,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
@@ -81,7 +83,9 @@
         <executions>
           <execution>
             <phase>generate-sources</phase>
-            <goals><goal>add-source</goal></goals>
+            <goals>
+              <goal>add-source</goal>
+            </goals>
             <configuration>
               <sources>
                 <source>${project.basedir}/src/main/java2</source>
diff --git a/src/it/multimodulePluginAndProjectClasspath/a/pom.xml b/src/it/multimodulePluginAndProjectClasspath/a/pom.xml
new file mode 100644
index 0000000..1492e41
--- /dev/null
+++ b/src/it/multimodulePluginAndProjectClasspath/a/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath-a</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Plugin and Project Classpath Test A Module</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.gmavenplus</groupId>
+        <artifactId>gmavenplus-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>test</phase>
+            <goals>
+              <goal>execute</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <scripts>
+            <script><![CDATA[
+              assert Class.forName('org.junit.Test') != null
+              try {
+                Class.forName('org.junit.jupiter.api.Test')
+                assert null != null  // should throw exception and never reach
+              } catch (ClassNotFoundException e) {
+                // do nothing, this is expected
+              }
+            ]]></script>
+          </scripts>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/multimodulePluginAndProjectClasspath/b/pom.xml b/src/it/multimodulePluginAndProjectClasspath/b/pom.xml
new file mode 100644
index 0000000..83d9a9c
--- /dev/null
+++ b/src/it/multimodulePluginAndProjectClasspath/b/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath-b</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Plugin and Project Classpath Test B Module</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.gmavenplus</groupId>
+        <artifactId>gmavenplus-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>test</phase>
+            <goals>
+              <goal>execute</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <scripts>
+            <script><![CDATA[
+              assert Class.forName('org.junit.jupiter.api.Test') != null
+              try {
+                Class.forName('org.junit.Test')
+                assert null != null  // should throw exception and never reach
+              } catch (ClassNotFoundException e) {
+                // do nothing, this is expected
+              }
+            ]]></script>
+          </scripts>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/multimodulePluginAndProjectClasspath/invoker.properties b/src/it/multimodulePluginAndProjectClasspath/invoker.properties
new file mode 100644
index 0000000..1bfdef1
--- /dev/null
+++ b/src/it/multimodulePluginAndProjectClasspath/invoker.properties
@@ -0,0 +1,2 @@
+invoker.goals=clean test
+#invoker.debug = true
diff --git a/src/it/multimodulePluginAndProjectClasspath/pom.xml b/src/it/multimodulePluginAndProjectClasspath/pom.xml
new file mode 100644
index 0000000..b07f77e
--- /dev/null
+++ b/src/it/multimodulePluginAndProjectClasspath/pom.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-root</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Plugin and Project Classpath Test</name>
+  <packaging>pom</packaging>
+
+  <profiles>
+    <profile>
+      <id>indy</id>
+      <dependencies>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
+          <classifier>indy</classifier>
+        </dependency>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy-ant</artifactId>
+          <classifier>indy</classifier>
+        </dependency>
+      </dependencies>
+    </profile>
+    <profile>
+      <id>nonindy</id>
+      <dependencies>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
+        </dependency>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy-ant</artifactId>
+        </dependency>
+      </dependencies>
+    </profile>
+    <profile>
+      <id>pre2.3-indy</id>
+      <dependencies>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
+          <classifier>indy</classifier>
+        </dependency>
+      </dependencies>
+    </profile>
+    <profile>
+      <id>pre2.3-nonindy</id>
+      <dependencies>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
+        </dependency>
+      </dependencies>
+    </profile>
+  </profiles>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <modules>
+    <module>a</module>
+    <module>b</module>
+  </modules>
+
+</project>
diff --git a/src/it/multimodulePluginAndProjectClasspath2/a/pom.xml b/src/it/multimodulePluginAndProjectClasspath2/a/pom.xml
new file mode 100644
index 0000000..27e1ee6
--- /dev/null
+++ b/src/it/multimodulePluginAndProjectClasspath2/a/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath2</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath2-a</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Plugin and Project Classpath Test 2 A Module</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.gmavenplus</groupId>
+        <artifactId>gmavenplus-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>test</phase>
+            <goals>
+              <goal>execute</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <scripts>
+            <script><![CDATA[
+              assert Class.forName('org.junit.Test') != null
+              try {
+                Class.forName('org.junit.jupiter.api.Test')
+                assert null != null  // should throw exception and never reach
+              } catch (ClassNotFoundException e) {
+                // do nothing, this is expected
+              }
+            ]]></script>
+          </scripts>
+        </configuration>
+        <dependencies>
+          <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>@junitVersion@</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/multimodulePluginAndProjectClasspath2/b/pom.xml b/src/it/multimodulePluginAndProjectClasspath2/b/pom.xml
new file mode 100644
index 0000000..24dd0d1
--- /dev/null
+++ b/src/it/multimodulePluginAndProjectClasspath2/b/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath2</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath2-b</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Plugin and Project Classpath Test 2 B Module</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.gmavenplus</groupId>
+        <artifactId>gmavenplus-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>test</phase>
+            <goals>
+              <goal>execute</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <scripts>
+            <script><![CDATA[
+              assert Class.forName('org.junit.jupiter.api.Test') != null
+              try {
+                Class.forName('org.junit.Test')
+                assert null != null  // should throw exception and never reach
+              } catch (ClassNotFoundException e) {
+                // do nothing, this is expected
+              }
+            ]]></script>
+          </scripts>
+        </configuration>
+        <dependencies>
+          <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>${junit5Version}</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/multimodulePluginAndProjectClasspath2/invoker.properties b/src/it/multimodulePluginAndProjectClasspath2/invoker.properties
new file mode 100644
index 0000000..1bfdef1
--- /dev/null
+++ b/src/it/multimodulePluginAndProjectClasspath2/invoker.properties
@@ -0,0 +1,2 @@
+invoker.goals=clean test
+#invoker.debug = true
diff --git a/src/it/multimodulePluginAndProjectClasspath2/pom.xml b/src/it/multimodulePluginAndProjectClasspath2/pom.xml
new file mode 100644
index 0000000..3963d0c
--- /dev/null
+++ b/src/it/multimodulePluginAndProjectClasspath2/pom.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-root</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimodulePluginAndProjectClasspath2</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Plugin and Project Classpath Test 2</name>
+  <packaging>pom</packaging>
+
+  <profiles>
+    <profile>
+      <id>indy</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.gmavenplus</groupId>
+            <artifactId>gmavenplus-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
+                <version>@groovyVersion@</version>
+                <classifier>indy</classifier>
+              </dependency>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy-ant</artifactId>
+                <version>@groovyVersion@</version>
+                <classifier>indy</classifier>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>nonindy</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.gmavenplus</groupId>
+            <artifactId>gmavenplus-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
+                <version>@groovyVersion@</version>
+              </dependency>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy-ant</artifactId>
+                <version>@groovyVersion@</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>pre2.3-indy</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.gmavenplus</groupId>
+            <artifactId>gmavenplus-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
+                <version>@groovyVersion@</version>
+                <classifier>indy</classifier>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>pre2.3-nonindy</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.gmavenplus</groupId>
+            <artifactId>gmavenplus-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
+                <version>@groovyVersion@</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <modules>
+    <module>a</module>
+    <module>b</module>
+  </modules>
+
+</project>
diff --git a/src/it/multimodulePluginClasspath/a/pom.xml b/src/it/multimodulePluginClasspath/a/pom.xml
new file mode 100644
index 0000000..5ae5971
--- /dev/null
+++ b/src/it/multimodulePluginClasspath/a/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-multimodulePluginClasspath</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimodulePluginClasspath-a</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Plugin Classpath Test A Module</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.gmavenplus</groupId>
+        <artifactId>gmavenplus-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>test</phase>
+            <goals>
+              <goal>execute</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <includeClasspath>PLUGIN_ONLY</includeClasspath>
+          <scripts>
+            <script><![CDATA[
+              assert Class.forName('org.junit.Test') != null
+              try {
+                Class.forName('org.junit.jupiter.api.Test')
+                assert null != null  // should throw exception and never reach
+              } catch (ClassNotFoundException e) {
+                // do nothing, this is expected
+              }
+            ]]></script>
+          </scripts>
+        </configuration>
+        <dependencies>
+          <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>@junitVersion@</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/multimodulePluginClasspath/b/pom.xml b/src/it/multimodulePluginClasspath/b/pom.xml
new file mode 100644
index 0000000..88a1087
--- /dev/null
+++ b/src/it/multimodulePluginClasspath/b/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-multimodulePluginClasspath</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimodulePluginClasspath-b</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Plugin Classpath Test B Module</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.gmavenplus</groupId>
+        <artifactId>gmavenplus-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>test</phase>
+            <goals>
+              <goal>execute</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <includeClasspath>PLUGIN_ONLY</includeClasspath>
+          <scripts>
+            <script><![CDATA[
+              assert Class.forName('org.junit.jupiter.api.Test') != null
+              try {
+                Class.forName('org.junit.Test')
+                assert null != null  // should throw exception and never reach
+              } catch (ClassNotFoundException e) {
+                // do nothing, this is expected
+              }
+            ]]></script>
+          </scripts>
+        </configuration>
+        <dependencies>
+          <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>${junit5Version}</version>
+          </dependency>
+        </dependencies>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/multimodulePluginClasspath/invoker.properties b/src/it/multimodulePluginClasspath/invoker.properties
new file mode 100644
index 0000000..1bfdef1
--- /dev/null
+++ b/src/it/multimodulePluginClasspath/invoker.properties
@@ -0,0 +1,2 @@
+invoker.goals=clean test
+#invoker.debug = true
diff --git a/src/it/multimodulePluginClasspath/pom.xml b/src/it/multimodulePluginClasspath/pom.xml
new file mode 100644
index 0000000..e336acd
--- /dev/null
+++ b/src/it/multimodulePluginClasspath/pom.xml
@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-root</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimodulePluginClasspath</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Plugin and Project Classpath Test</name>
+  <packaging>pom</packaging>
+
+  <profiles>
+    <profile>
+      <id>indy</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.gmavenplus</groupId>
+            <artifactId>gmavenplus-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
+                <version>@groovyVersion@</version>
+                <classifier>indy</classifier>
+              </dependency>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy-ant</artifactId>
+                <version>@groovyVersion@</version>
+                <classifier>indy</classifier>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>nonindy</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.gmavenplus</groupId>
+            <artifactId>gmavenplus-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
+                <version>@groovyVersion@</version>
+              </dependency>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy-ant</artifactId>
+                <version>@groovyVersion@</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>pre2.3-indy</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.gmavenplus</groupId>
+            <artifactId>gmavenplus-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
+                <version>@groovyVersion@</version>
+                <classifier>indy</classifier>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+    <profile>
+      <id>pre2.3-nonindy</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.codehaus.gmavenplus</groupId>
+            <artifactId>gmavenplus-plugin</artifactId>
+            <dependencies>
+              <dependency>
+                <groupId>@groovyGroupId@</groupId>
+                <artifactId>groovy</artifactId>
+                <version>@groovyVersion@</version>
+              </dependency>
+            </dependencies>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
+  </profiles>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <modules>
+    <module>a</module>
+    <module>b</module>
+  </modules>
+
+</project>
diff --git a/src/it/multimoduleProjectClasspath/a/pom.xml b/src/it/multimoduleProjectClasspath/a/pom.xml
new file mode 100644
index 0000000..3b9edab
--- /dev/null
+++ b/src/it/multimoduleProjectClasspath/a/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-multimoduleProjectClasspath</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimoduleProjectClasspath-a</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Project Classpath Test A Module</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.gmavenplus</groupId>
+        <artifactId>gmavenplus-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>test</phase>
+            <goals>
+              <goal>execute</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <includeClasspath>PROJECT_ONLY</includeClasspath>
+          <scripts>
+            <script><![CDATA[
+              assert Class.forName('org.junit.Test') != null
+              try {
+                Class.forName('org.junit.jupiter.api.Test')
+                assert null != null  // should throw exception and never reach
+              } catch (ClassNotFoundException e) {
+                // do nothing, this is expected
+              }
+            ]]></script>
+          </scripts>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/multimoduleProjectClasspath/b/pom.xml b/src/it/multimoduleProjectClasspath/b/pom.xml
new file mode 100644
index 0000000..56e2327
--- /dev/null
+++ b/src/it/multimoduleProjectClasspath/b/pom.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-multimoduleProjectClasspath</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimoduleProjectClasspath-b</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Project Classpath Test B Module</name>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter</artifactId>
+    </dependency>
+  </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.gmavenplus</groupId>
+        <artifactId>gmavenplus-plugin</artifactId>
+        <executions>
+          <execution>
+            <phase>test</phase>
+            <goals>
+              <goal>execute</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <includeClasspath>PROJECT_ONLY</includeClasspath>
+          <scripts>
+            <script><![CDATA[
+              assert Class.forName('org.junit.jupiter.api.Test') != null
+              try {
+                Class.forName('org.junit.Test')
+                assert null != null  // should throw exception and never reach
+              } catch (ClassNotFoundException e) {
+                // do nothing, this is expected
+              }
+            ]]></script>
+          </scripts>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/multimoduleProjectClasspath/invoker.properties b/src/it/multimoduleProjectClasspath/invoker.properties
new file mode 100644
index 0000000..1bfdef1
--- /dev/null
+++ b/src/it/multimoduleProjectClasspath/invoker.properties
@@ -0,0 +1,2 @@
+invoker.goals=clean test
+#invoker.debug = true
diff --git a/src/it/multimoduleProjectClasspath/pom.xml b/src/it/multimoduleProjectClasspath/pom.xml
new file mode 100644
index 0000000..d860977
--- /dev/null
+++ b/src/it/multimoduleProjectClasspath/pom.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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.codehaus.gmavenplus</groupId>
+    <artifactId>gmavenplus-plugin-it-root</artifactId>
+    <version>testing</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <artifactId>gmavenplus-plugin-it-multimoduleProjectClasspath</artifactId>
+  <version>testing</version>
+  <name>GMavenPlus Plugin Multi-Module Project Classpath Test</name>
+  <packaging>pom</packaging>
+
+  <profiles>
+    <profile>
+      <id>indy</id>
+      <dependencies>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
+          <classifier>indy</classifier>
+        </dependency>
+      </dependencies>
+    </profile>
+    <profile>
+      <id>nonindy</id>
+      <dependencies>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
+        </dependency>
+      </dependencies>
+    </profile>
+    <profile>
+      <id>pre2.3-indy</id>
+      <dependencies>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
+          <classifier>indy</classifier>
+        </dependency>
+      </dependencies>
+    </profile>
+    <profile>
+      <id>pre2.3-nonindy</id>
+      <dependencies>
+        <dependency>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
+        </dependency>
+      </dependencies>
+    </profile>
+  </profiles>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-surefire-plugin</artifactId>
+      </plugin>
+    </plugins>
+  </build>
+
+  <modules>
+    <module>a</module>
+    <module>b</module>
+  </modules>
+
+</project>
diff --git a/src/it/parametersCompile/invoker.properties b/src/it/parametersCompile/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/parametersCompile/invoker.properties
+++ b/src/it/parametersCompile/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/parametersCompile/pom.xml b/src/it/parametersCompile/pom.xml
index 3e1a29c..28dc5a4 100644
--- a/src/it/parametersCompile/pom.xml
+++ b/src/it/parametersCompile/pom.xml
@@ -14,7 +14,9 @@
   <artifactId>gmavenplus-plugin-it-parametersCompile</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Parameters Compile Test</name>
-  <description>The simplest compile with parameters use case. This will fail for all Groovy versions before 2.5.0-beta-1.</description>
+  <description>The simplest compile with parameters use case. This will fail for all Groovy versions before
+    2.5.0-beta-1.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,7 +30,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -38,7 +40,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -47,8 +49,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -57,8 +59,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/it/parametersCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy b/src/it/parametersCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
index d5a1f0c..6cc5dc9 100644
--- a/src/it/parametersCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
+++ b/src/it/parametersCompile/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
@@ -19,6 +19,6 @@ package org.codehaus.gmavenplus
 
 class SomeClass {
 
-    void someMethod(String param1, String param2) { }
+    void someMethod(String param1, String param2) {}
 
 }
diff --git a/src/it/parametersCompile/src/test/java/org/codehaus/gmavenplus/SomeClassTest.java b/src/it/parametersCompile/src/test/java/org/codehaus/gmavenplus/SomeClassTest.java
index d6a622d..9c933e9 100644
--- a/src/it/parametersCompile/src/test/java/org/codehaus/gmavenplus/SomeClassTest.java
+++ b/src/it/parametersCompile/src/test/java/org/codehaus/gmavenplus/SomeClassTest.java
@@ -34,8 +34,7 @@ public class SomeClassTest {
         List<Parameter> parameterNames = Arrays.asList(method.getParameters());
 
         Assert.assertEquals(2, parameterNames.size());
-        System.out.println(GroovySystem.getVersion());
-        if (GroovySystem.getVersion().startsWith("2.5")) {
+        if (GroovySystem.getVersion().startsWith("2.5") || GroovySystem.getVersion().startsWith("3.0")) {
             Assert.assertEquals("param1", parameterNames.get(0).getName());
             Assert.assertEquals("param2", parameterNames.get(1).getName());
         } else {
diff --git a/src/it/pluginAndProjectClasspath/invoker.properties b/src/it/pluginAndProjectClasspath/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/pluginAndProjectClasspath/invoker.properties
+++ b/src/it/pluginAndProjectClasspath/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/pluginAndProjectClasspath/pom.xml b/src/it/pluginAndProjectClasspath/pom.xml
index 3027bcf..b806280 100644
--- a/src/it/pluginAndProjectClasspath/pom.xml
+++ b/src/it/pluginAndProjectClasspath/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <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">
+         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>
@@ -14,7 +14,9 @@
   <artifactId>gmavenplus-plugin-it-pluginAndProjectClasspath</artifactId>
   <version>testing</version>
   <name>GMavenPlus Plugin Plugin and Project Classpath test</name>
-  <description>Compiling, generating stubs, and GroovyDoc, using Groovy as a plugin dependency, while also including project dependencies.</description>
+  <description>Compiling, generating stubs, and GroovyDoc, using Groovy as a plugin dependency, while also including
+    project dependencies.
+  </description>
 
   <dependencies>
     <dependency>
@@ -28,13 +30,13 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
           <scope>runtime</scope>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <classifier>indy</classifier>
           <scope>runtime</scope>
@@ -48,13 +50,13 @@
               <artifactId>gmavenplus-plugin</artifactId>
               <dependencies>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
+                  <groupId>@groovyGroupId@</groupId>
                   <artifactId>groovy</artifactId>
                   <version>@groovyVersion@</version>
                   <classifier>indy</classifier>
                 </dependency>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
+                  <groupId>@groovyGroupId@</groupId>
                   <artifactId>groovy-groovydoc</artifactId>
                   <version>@groovyVersion@</version>
                   <classifier>indy</classifier>
@@ -69,12 +71,12 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <scope>runtime</scope>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <scope>runtime</scope>
         </dependency>
@@ -87,12 +89,12 @@
               <artifactId>gmavenplus-plugin</artifactId>
               <dependencies>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
+                  <groupId>@groovyGroupId@</groupId>
                   <artifactId>groovy</artifactId>
                   <version>@groovyVersion@</version>
                 </dependency>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
+                  <groupId>@groovyGroupId@</groupId>
                   <artifactId>groovy-groovydoc</artifactId>
                   <version>@groovyVersion@</version>
                 </dependency>
@@ -106,8 +108,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
           <scope>runtime</scope>
         </dependency>
@@ -120,8 +122,8 @@
               <artifactId>gmavenplus-plugin</artifactId>
               <dependencies>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
-                  <artifactId>groovy-all</artifactId>
+                  <groupId>@groovyGroupId@</groupId>
+                  <artifactId>groovy</artifactId>
                   <version>@groovyVersion@</version>
                   <classifier>indy</classifier>
                 </dependency>
@@ -135,8 +137,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <scope>runtime</scope>
         </dependency>
       </dependencies>
@@ -148,8 +150,8 @@
               <artifactId>gmavenplus-plugin</artifactId>
               <dependencies>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
-                  <artifactId>groovy-all</artifactId>
+                  <groupId>@groovyGroupId@</groupId>
+                  <artifactId>groovy</artifactId>
                   <version>@groovyVersion@</version>
                 </dependency>
               </dependencies>
diff --git a/src/it/pluginAndProjectClasspath/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy b/src/it/pluginAndProjectClasspath/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
index 458b5f0..9d253a6 100644
--- a/src/it/pluginAndProjectClasspath/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
+++ b/src/it/pluginAndProjectClasspath/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
@@ -21,8 +21,8 @@ import org.apache.maven.project.MavenProject
 
 class SomeClass {
 
-   String someMethod(MavenProject project) {
-      return "Hello, world."
-   }
+    String someMethod(MavenProject project) {
+        return "Hello, world."
+    }
 
 }
diff --git a/src/it/pluginClasspath/invoker.properties b/src/it/pluginClasspath/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/pluginClasspath/invoker.properties
+++ b/src/it/pluginClasspath/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/pluginClasspath/pom.xml b/src/it/pluginClasspath/pom.xml
index 4282dc1..af01806 100644
--- a/src/it/pluginClasspath/pom.xml
+++ b/src/it/pluginClasspath/pom.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <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">
+         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>
@@ -28,13 +28,13 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
           <scope>runtime</scope>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <classifier>indy</classifier>
           <scope>runtime</scope>
@@ -48,13 +48,13 @@
               <artifactId>gmavenplus-plugin</artifactId>
               <dependencies>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
+                  <groupId>@groovyGroupId@</groupId>
                   <artifactId>groovy</artifactId>
                   <version>@groovyVersion@</version>
                   <classifier>indy</classifier>
                 </dependency>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
+                  <groupId>@groovyGroupId@</groupId>
                   <artifactId>groovy-groovydoc</artifactId>
                   <version>@groovyVersion@</version>
                   <classifier>indy</classifier>
@@ -69,12 +69,12 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <scope>runtime</scope>
         </dependency>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy-groovydoc</artifactId>
           <scope>runtime</scope>
         </dependency>
@@ -87,12 +87,12 @@
               <artifactId>gmavenplus-plugin</artifactId>
               <dependencies>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
+                  <groupId>@groovyGroupId@</groupId>
                   <artifactId>groovy</artifactId>
                   <version>@groovyVersion@</version>
                 </dependency>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
+                  <groupId>@groovyGroupId@</groupId>
                   <artifactId>groovy-groovydoc</artifactId>
                   <version>@groovyVersion@</version>
                 </dependency>
@@ -106,8 +106,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
           <scope>runtime</scope>
         </dependency>
@@ -120,8 +120,8 @@
               <artifactId>gmavenplus-plugin</artifactId>
               <dependencies>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
-                  <artifactId>groovy-all</artifactId>
+                  <groupId>@groovyGroupId@</groupId>
+                  <artifactId>groovy</artifactId>
                   <version>@groovyVersion@</version>
                   <classifier>indy</classifier>
                 </dependency>
@@ -135,8 +135,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <scope>runtime</scope>
         </dependency>
       </dependencies>
@@ -148,8 +148,8 @@
               <artifactId>gmavenplus-plugin</artifactId>
               <dependencies>
                 <dependency>
-                  <groupId>org.codehaus.groovy</groupId>
-                  <artifactId>groovy-all</artifactId>
+                  <groupId>@groovyGroupId@</groupId>
+                  <artifactId>groovy</artifactId>
                   <version>@groovyVersion@</version>
                 </dependency>
               </dependencies>
diff --git a/src/it/pluginClasspath/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy b/src/it/pluginClasspath/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
index 458b5f0..9d253a6 100644
--- a/src/it/pluginClasspath/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
+++ b/src/it/pluginClasspath/src/main/groovy/org/codehaus/gmavenplus/SomeClass.groovy
@@ -21,8 +21,8 @@ import org.apache.maven.project.MavenProject
 
 class SomeClass {
 
-   String someMethod(MavenProject project) {
-      return "Hello, world."
-   }
+    String someMethod(MavenProject project) {
+        return "Hello, world."
+    }
 
 }
diff --git a/src/it/pom.xml b/src/it/pom.xml
index 4cc9d64..2a6655b 100644
--- a/src/it/pom.xml
+++ b/src/it/pom.xml
@@ -11,8 +11,9 @@
 
   <properties>
     <project.build.sourceEncoding>@project.build.sourceEncoding@</project.build.sourceEncoding>
-    <commonsLang3Version>3.7</commonsLang3Version>
-    <mavenVersion>3.5.3</mavenVersion>
+    <commonsLang3Version>3.11</commonsLang3Version>
+    <mavenVersion>3.6.3</mavenVersion>
+    <junit5Version>5.7.0</junit5Version>
   </properties>
 
   <dependencyManagement>
@@ -24,9 +25,11 @@
         <scope>test</scope>
       </dependency>
       <dependency>
-        <groupId>ch.qos.logback</groupId>
-        <artifactId>logback-classic</artifactId>
-        <version>1.2.3</version>
+        <groupId>org.junit</groupId>
+        <artifactId>junit-bom</artifactId>
+        <version>${junit5Version}</version>
+        <type>pom</type>
+        <scope>import</scope>
       </dependency>
       <dependency>
         <groupId>org.apache.maven</groupId>
@@ -36,12 +39,7 @@
       <dependency>
         <groupId>org.apache.maven.plugin-tools</groupId>
         <artifactId>maven-plugin-annotations</artifactId>
-        <version>3.5.1</version>
-      </dependency>
-      <dependency>
-        <groupId>org.codehaus.plexus</groupId>
-        <artifactId>plexus-utils</artifactId>
-        <version>3.1.0</version>
+        <version>3.6.0</version>
       </dependency>
     </dependencies>
   </dependencyManagement>
@@ -52,23 +50,29 @@
       <dependencyManagement>
         <dependencies>
           <dependency>
-            <groupId>org.codehaus.groovy</groupId>
+            <groupId>@groovyGroupId@</groupId>
             <artifactId>groovy</artifactId>
             <version>@groovyVersion@</version>
             <classifier>indy</classifier>
           </dependency>
           <dependency>
-            <groupId>org.codehaus.groovy</groupId>
+            <groupId>@groovyGroupId@</groupId>
             <artifactId>groovy-ant</artifactId>
             <version>@groovyVersion@</version>
             <classifier>indy</classifier>
           </dependency>
           <dependency>
-            <groupId>org.codehaus.groovy</groupId>
+            <groupId>@groovyGroupId@</groupId>
             <artifactId>groovy-groovydoc</artifactId>
             <version>@groovyVersion@</version>
             <classifier>indy</classifier>
           </dependency>
+          <dependency>
+            <groupId>@groovyGroupId@</groupId>
+            <artifactId>groovy-templates</artifactId>
+            <version>@groovyVersion@</version>
+            <classifier>indy</classifier>
+          </dependency>
         </dependencies>
       </dependencyManagement>
       <build>
@@ -90,20 +94,25 @@
       <dependencyManagement>
         <dependencies>
           <dependency>
-            <groupId>org.codehaus.groovy</groupId>
+            <groupId>@groovyGroupId@</groupId>
             <artifactId>groovy</artifactId>
             <version>@groovyVersion@</version>
           </dependency>
           <dependency>
-            <groupId>org.codehaus.groovy</groupId>
+            <groupId>@groovyGroupId@</groupId>
             <artifactId>groovy-ant</artifactId>
             <version>@groovyVersion@</version>
           </dependency>
           <dependency>
-            <groupId>org.codehaus.groovy</groupId>
+            <groupId>@groovyGroupId@</groupId>
             <artifactId>groovy-groovydoc</artifactId>
             <version>@groovyVersion@</version>
           </dependency>
+          <dependency>
+            <groupId>@groovyGroupId@</groupId>
+            <artifactId>groovy-templates</artifactId>
+            <version>@groovyVersion@</version>
+          </dependency>
         </dependencies>
       </dependencyManagement>
     </profile>
@@ -112,8 +121,8 @@
       <dependencyManagement>
         <dependencies>
           <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy-all</artifactId>
+            <groupId>@groovyGroupId@</groupId>
+            <artifactId>groovy</artifactId>
             <version>@groovyVersion@</version>
             <classifier>indy</classifier>
           </dependency>
@@ -138,8 +147,8 @@
       <dependencyManagement>
         <dependencies>
           <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy-all</artifactId>
+            <groupId>@groovyGroupId@</groupId>
+            <artifactId>groovy</artifactId>
             <version>@groovyVersion@</version>
           </dependency>
         </dependencies>
diff --git a/src/it/shadedGroovy/invoker.properties b/src/it/shadedGroovy/invoker.properties
index 456c4b8..1bfdef1 100644
--- a/src/it/shadedGroovy/invoker.properties
+++ b/src/it/shadedGroovy/invoker.properties
@@ -1,2 +1,2 @@
-invoker.goals = clean test
+invoker.goals=clean test
 #invoker.debug = true
diff --git a/src/it/shadedGroovy/pom.xml b/src/it/shadedGroovy/pom.xml
index 5e68783..4e7d316 100644
--- a/src/it/shadedGroovy/pom.xml
+++ b/src/it/shadedGroovy/pom.xml
@@ -15,7 +15,9 @@
   <version>testing</version>
   <packaging>pom</packaging>
   <name>GMavenPlus Plugin Shaded Groovy Test</name>
-  <description>This tests Groovy on the classpath from an uber jar. This will fail with Groovy versions older than 1.6.6 and 1.7-beta-1 and 1.7-beta-2.</description>
+  <description>This tests Groovy on the classpath from an uber jar. This will fail with Groovy versions older than
+    1.6.6 and 1.7-beta-1 and 1.7-beta-2.
+  </description>
 
   <dependencyManagement>
     <dependencies>
diff --git a/src/it/shadedGroovy/uberModule/pom.xml b/src/it/shadedGroovy/uberModule/pom.xml
index 3987fa2..8600ba3 100644
--- a/src/it/shadedGroovy/uberModule/pom.xml
+++ b/src/it/shadedGroovy/uberModule/pom.xml
@@ -19,7 +19,7 @@
       <id>indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
@@ -29,7 +29,7 @@
       <id>nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
+          <groupId>@groovyGroupId@</groupId>
           <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
@@ -38,8 +38,8 @@
       <id>pre2.3-indy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
           <classifier>indy</classifier>
         </dependency>
       </dependencies>
@@ -48,8 +48,8 @@
       <id>pre2.3-nonindy</id>
       <dependencies>
         <dependency>
-          <groupId>org.codehaus.groovy</groupId>
-          <artifactId>groovy-all</artifactId>
+          <groupId>@groovyGroupId@</groupId>
+          <artifactId>groovy</artifactId>
         </dependency>
       </dependencies>
     </profile>
diff --git a/src/main/java/org/codehaus/gmavenplus/groovyworkarounds/DotGroovyFile.java b/src/main/java/org/codehaus/gmavenplus/groovyworkarounds/DotGroovyFile.java
index 07b193c..a709cab 100644
--- a/src/main/java/org/codehaus/gmavenplus/groovyworkarounds/DotGroovyFile.java
+++ b/src/main/java/org/codehaus/gmavenplus/groovyworkarounds/DotGroovyFile.java
@@ -39,7 +39,7 @@ public class DotGroovyFile extends File {
     /**
      * The file extensions to consider as Groovy files.
      */
-    private Set<String> scriptExtensions = new HashSet<String>();
+    private Set<String> scriptExtensions = new HashSet<>();
 
     /**
      * Constructs a new DotGroovyFile object with the specified parameters.
@@ -54,7 +54,7 @@ public class DotGroovyFile extends File {
      * Constructs a new DotGroovyFile object with the specified parameters.
      *
      * @param parent Parent pathname to use to create DotGroovyFile
-     * @param child Child pathname to use to create DotGroovyFile
+     * @param child  Child pathname to use to create DotGroovyFile
      */
     public DotGroovyFile(final String parent, final String child) {
         super(parent, child);
@@ -64,7 +64,7 @@ public class DotGroovyFile extends File {
      * Constructs a new DotGroovyFile object with the specified parameters.
      *
      * @param parent Parent file to use to create DotGroovyFile
-     * @param child Child pathname to use to create DotGroovyFile
+     * @param child  Child pathname to use to create DotGroovyFile
      */
     public DotGroovyFile(final File parent, final String child) {
         super(parent, child);
diff --git a/src/main/java/org/codehaus/gmavenplus/groovyworkarounds/GroovyDocTemplateInfo.java b/src/main/java/org/codehaus/gmavenplus/groovyworkarounds/GroovyDocTemplateInfo.java
index 99210b8..be0cd8c 100644
--- a/src/main/java/org/codehaus/gmavenplus/groovyworkarounds/GroovyDocTemplateInfo.java
+++ b/src/main/java/org/codehaus/gmavenplus/groovyworkarounds/GroovyDocTemplateInfo.java
@@ -16,7 +16,7 @@
 
 package org.codehaus.gmavenplus.groovyworkarounds;
 
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 
 import static org.codehaus.gmavenplus.util.ClassWrangler.groovyAtLeast;
 
@@ -51,12 +51,12 @@ public class GroovyDocTemplateInfo {
     /**
      * The version of Groovy whose locations to use for GroovyDoc templates.
      */
-    protected Version groovyVersion;
+    protected final Version groovyVersion;
 
     /**
      * Base directory of templates.
      */
-    protected String templateBaseDir;
+    protected final String templateBaseDir;
 
     /**
      * Constructs a new GroovyDocTemplateInfo using the specified Groovy version to determine templates location.
@@ -74,7 +74,7 @@ public class GroovyDocTemplateInfo {
 
     public String[] defaultDocTemplates() {
         if (groovyAtLeast(groovyVersion, GROOVY_2_5_0)) {
-            return new String[] {
+            return new String[]{
                     templateBaseDir + "topLevel/index.html",
                     templateBaseDir + "topLevel/overview-frame.html",
                     templateBaseDir + "topLevel/allclasses-frame.html",
@@ -87,7 +87,7 @@ public class GroovyDocTemplateInfo {
                     "org/apache/groovy/docgenerator/groovy.ico"
             };
         } else if (groovyAtLeast(groovyVersion, GROOVY_1_6_2)) {
-            return new String[] {
+            return new String[]{
                     templateBaseDir + "topLevel/index.html",
                     templateBaseDir + "topLevel/overview-frame.html",
                     templateBaseDir + "topLevel/allclasses-frame.html",
@@ -100,7 +100,7 @@ public class GroovyDocTemplateInfo {
                     "org/codehaus/groovy/tools/groovy.ico"
             };
         } else if (groovyAtLeast(groovyVersion, GROOVY_1_6_0)) {
-            return new String[] {
+            return new String[]{
                     templateBaseDir + "top-level/index.html",
                     templateBaseDir + "top-level/overview-frame.html",
                     templateBaseDir + "top-level/allclasses-frame.html",
@@ -112,7 +112,7 @@ public class GroovyDocTemplateInfo {
                     templateBaseDir + "top-level/inherit.gif"
             };
         } else if (groovyAtLeast(groovyVersion, GROOVY_1_6_0_RC2)) {
-            return new String[] {
+            return new String[]{
                     templateBaseDir + "top-level/index.html",
                     templateBaseDir + "top-level/overview-frame.html",
                     templateBaseDir + "top-level/allclasses-frame.html",
@@ -121,7 +121,7 @@ public class GroovyDocTemplateInfo {
                     templateBaseDir + "top-level/inherit.gif"
             };
         } else {
-            return new String[] {
+            return new String[]{
                     templateBaseDir + "top-level/index.html",
                     templateBaseDir + "top-level/overview-frame.html",
                     templateBaseDir + "top-level/allclasses-frame.html",
@@ -133,12 +133,12 @@ public class GroovyDocTemplateInfo {
 
     public String[] defaultPackageTemplates() {
         if (groovyAtLeast(groovyVersion, GROOVY_1_6_2)) {
-            return new String[] {
+            return new String[]{
                     templateBaseDir + "packageLevel/package-frame.html",
                     templateBaseDir + "packageLevel/package-summary.html"
             };
         } else {
-            return new String[] {
+            return new String[]{
                     templateBaseDir + "package-level/package-frame.html",
                     templateBaseDir + "package-level/package-summary.html"
             };
@@ -147,11 +147,11 @@ public class GroovyDocTemplateInfo {
 
     public String[] defaultClassTemplates() {
         if (groovyAtLeast(groovyVersion, GROOVY_1_6_2)) {
-            return new String[] {
+            return new String[]{
                     templateBaseDir + "classLevel/classDocName.html"
             };
         } else {
-            return new String[] {
+            return new String[]{
                     templateBaseDir + "class-level/classDocName.html"
             };
         }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/Link.java b/src/main/java/org/codehaus/gmavenplus/model/Link.java
similarity index 83%
rename from src/main/java/org/codehaus/gmavenplus/mojo/Link.java
rename to src/main/java/org/codehaus/gmavenplus/model/Link.java
index f01f8cd..bfa38e9 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/Link.java
+++ b/src/main/java/org/codehaus/gmavenplus/model/Link.java
@@ -15,14 +15,12 @@
  */
 
 // note that this won't be properly consumed by mojo unless it's in the same package as the mojo
-package org.codehaus.gmavenplus.mojo;
+package org.codehaus.gmavenplus.model;
 
 
 /**
  * This class was taken from the Groovy project, so that GroovyDoc links can be
- * added as mojo parameters without a compile dependency on Groovy.
- *
- * Represents a link pair (href, packages).
+ * added as mojo parameters without a compile dependency on Groovy. Represents a link pair (href, packages).
  * The packages are comma separated.
  */
 public class Link {
@@ -50,11 +48,9 @@ public class Link {
      * Set the packages attribute.
      *
      * @param newPackages the comma separated package prefixes corresponding to this link
-     * @return this object (for fluent invocation)
      */
-    public Link setPackages(final String newPackages) {
+    public void setPackages(final String newPackages) {
         packages = newPackages;
-        return this;
     }
 
     /**
@@ -70,11 +66,9 @@ public class Link {
      * Set the href attribute.
      *
      * @param newHref a <code>String</code> value representing the URL to use for this link
-     * @return this object (for fluent invocation)
      */
-    public Link setHref(final String newHref) {
+    public void setHref(final String newHref) {
         href = newHref;
-        return this;
     }
 
 }
diff --git a/src/main/java/org/codehaus/gmavenplus/model/Version.java b/src/main/java/org/codehaus/gmavenplus/model/internal/Version.java
similarity index 91%
rename from src/main/java/org/codehaus/gmavenplus/model/Version.java
rename to src/main/java/org/codehaus/gmavenplus/model/internal/Version.java
index 250954a..3a252ee 100644
--- a/src/main/java/org/codehaus/gmavenplus/model/Version.java
+++ b/src/main/java/org/codehaus/gmavenplus/model/internal/Version.java
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package org.codehaus.gmavenplus.model;
+package org.codehaus.gmavenplus.model.internal;
 
 import java.util.Arrays;
 
@@ -51,10 +51,10 @@ public class Version implements Comparable<Version> {
     /**
      * Constructs a new version object with the specified parameters.
      *
-     * @param newMajor The version major number
-     * @param newMinor The version minor number
+     * @param newMajor    The version major number
+     * @param newMinor    The version minor number
      * @param newRevision The version revision number
-     * @param newTag The version tag string
+     * @param newTag      The version tag string
      */
     public Version(final int newMajor, final int newMinor, final int newRevision, final String newTag) {
         if (newMajor < 0 || newMinor < 0 || newRevision < 0) {
@@ -75,8 +75,8 @@ public class Version implements Comparable<Version> {
     /**
      * Constructs a new Version object with the specified parameters.
      *
-     * @param newMajor The version major number
-     * @param newMinor The version minor number
+     * @param newMajor    The version major number
+     * @param newMinor    The version minor number
      * @param newRevision The version revision number
      */
     public Version(final int newMajor, final int newMinor, final int newRevision) {
@@ -161,7 +161,7 @@ public class Version implements Comparable<Version> {
      */
     @Override
     public final int hashCode() {
-        return Arrays.hashCode(new Object[] {major, minor, revision, tag});
+        return Arrays.hashCode(new Object[]{major, minor, revision, tag});
     }
 
     /**
@@ -211,7 +211,7 @@ public class Version implements Comparable<Version> {
      *
      * @param version The version to compare this version to
      * @return <code>0</code> if the version is equal to this version, <code>1</code> if the version is greater than
-     *         this version, or <code>-1</code> if the version is lower than this version.
+     * this version, or <code>-1</code> if the version is lower than this version.
      */
     @Override
     public final int compareTo(final Version version) {
@@ -222,19 +222,19 @@ public class Version implements Comparable<Version> {
      * Compares two versions objects. Note that if the major, minor, and revision are all the same, tags are compared with
      * {@link java.lang.String#compareTo(String) String.compareTo()}.
      *
-     * @param version The version to compare this version to
+     * @param version        The version to compare this version to
      * @param noTagsAreNewer Whether versions with no tag are considered newer than those that have tags
      * @return <code>0</code> if the version is equal to this version, <code>1</code> if the version is greater than
-     *         this version, or <code>-1</code> if the version is lower than this version.
+     * this version, or <code>-1</code> if the version is lower than this version.
      */
     public final int compareTo(final Version version, final boolean noTagsAreNewer) {
         // "beta" is replaced with " beta" to make sure RCs are considered newer than betas (by moving beta to back of order)
-        int comp = major < version.major ? -1 : (major == version.major ? 0 : 1);
+        int comp = Integer.compare(major, version.major);
         if (comp == 0) {
-            comp = minor < version.minor ? -1 : (minor == version.minor ? 0 : 1);
+            comp = Integer.compare(minor, version.minor);
         }
         if (comp == 0) {
-            comp = revision < version.revision ? -1 : (revision == version.revision ? 0 : 1);
+            comp = Integer.compare(revision, version.revision);
         }
         if (comp == 0) {
             if (tag != null && version.tag != null) {
diff --git a/src/main/java/org/codehaus/gmavenplus/plexus/package-info.java b/src/main/java/org/codehaus/gmavenplus/model/internal/package-info.java
similarity index 80%
rename from src/main/java/org/codehaus/gmavenplus/plexus/package-info.java
rename to src/main/java/org/codehaus/gmavenplus/model/internal/package-info.java
index d9f0687..5b63ebc 100644
--- a/src/main/java/org/codehaus/gmavenplus/plexus/package-info.java
+++ b/src/main/java/org/codehaus/gmavenplus/model/internal/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 the original author or authors.
+ * Copyright (C) 2020 the original author or authors.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,6 +15,6 @@
  */
 
 /**
- * Classes to work with the Plexus container.
+ * Classes to model supporting data.
  */
-package org.codehaus.gmavenplus.plexus;
+package org.codehaus.gmavenplus.model.internal;
diff --git a/src/main/java/org/codehaus/gmavenplus/model/package-info.java b/src/main/java/org/codehaus/gmavenplus/model/package-info.java
index f38051b..86840bb 100644
--- a/src/main/java/org/codehaus/gmavenplus/model/package-info.java
+++ b/src/main/java/org/codehaus/gmavenplus/model/package-info.java
@@ -15,6 +15,6 @@
  */
 
 /**
- * Classes to model supporting data.
+ * Classes to model Maven parameters.
  */
 package org.codehaus.gmavenplus.model;
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojo.java
index 8ad6e8f..02da407 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojo.java
@@ -18,7 +18,7 @@ package org.codehaus.gmavenplus.mojo;
 
 import org.apache.maven.plugins.annotations.Parameter;
 import org.codehaus.gmavenplus.model.IncludeClasspath;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 
 import java.io.File;
 import java.lang.reflect.InvocationTargetException;
@@ -40,6 +40,46 @@ import static org.codehaus.gmavenplus.util.ReflectionUtils.*;
  */
 public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
 
+    /**
+     * Groovy 4.0.0 beta-1 version.
+     */
+    protected static final Version GROOVY_4_0_0_BETA1 = new Version(4, 0, 0, "beta-1");
+
+    /**
+     * Groovy 4.0.0 alpha-3 version.
+     */
+    protected static final Version GROOVY_4_0_0_ALPHA3 = new Version(4, 0, 0, "alpha-3");
+
+    /**
+     * Groovy 4.0.0 alpha-1 version.
+     */
+    protected static final Version GROOVY_4_0_0_ALPHA1 = new Version(4, 0, 0, "alpha-1");
+
+    /**
+     * Groovy 3.0.8 version.
+     */
+    protected static final Version GROOVY_3_0_8 = new Version(3, 0, 8);
+
+    /**
+     * Groovy 3.0.6 version.
+     */
+    protected static final Version GROOVY_3_0_6 = new Version(3, 0, 6);
+
+    /**
+     * Groovy 3.0.5 version.
+     */
+    protected static final Version GROOVY_3_0_5 = new Version(3, 0, 5);
+
+    /**
+     * Groovy 3.0.3 version.
+     */
+    protected static final Version GROOVY_3_0_3 = new Version(3, 0, 3);
+
+    /**
+     * Groovy 3.0.0 beta-2 version.
+     */
+    protected static final Version GROOVY_3_0_0_BETA2 = new Version(3, 0, 0, "beta-2");
+
     /**
      * Groovy 3.0.0 beta-1 version.
      */
@@ -129,6 +169,11 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
      *   <li>11</li>
      *   <li>12</li>
      *   <li>13</li>
+     *   <li>14</li>
+     *   <li>15</li>
+     *   <li>16</li>
+     *   <li>17</li>
+     *   <li>18</li>
      * </ul>
      * Using 1.6 or 1.7 requires Groovy &gt;= 2.1.3.
      * Using 1.8 requires Groovy &gt;= 2.3.3.
@@ -136,10 +181,23 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
      * Using 9 with invokedynamic requires Groovy &gt;= 2.5.3, or Groovy &gt;= 3.0.0 alpha 2, but not any 2.6 versions.
      * Using 10, 11, or 12 requires Groovy &gt;= 2.5.3, or Groovy &gt;= 3.0.0 alpha 4, but not any 2.6 versions.
      * Using 13 requires Groovy &gt;= 2.5.7, or Groovy &gt;= 3.0.0-beta-1, but not any 2.6 versions.
+     * Using 14 requires Groovy &gt;= 3.0.0 beta-2.
+     * Using 15 requires Groovy &gt;= 3.0.3.
+     * Using 16 requires Groovy &gt;= 3.0.6.
+     * Using 17 requires Groovy &gt;= 3.0.8 or Groovy &gt; 4.0.0-alpha-3.
+     * Using 18 requires Groovy &gt; 4.0.0-beta-1.
      */
     @Parameter(property = "maven.compiler.target", defaultValue = "1.8")
     protected String targetBytecode;
 
+    /**
+     * Whether to check that the version of Groovy used is able to use the requested <code>targetBytecode</code>.
+     *
+     * @since 1.9.0
+     */
+    @Parameter(property = "skipBytecodeCheck", defaultValue = "false")
+    protected boolean skipBytecodeCheck;
+
     /**
      * Whether Groovy compiler should be set to debug.
      */
@@ -176,10 +234,20 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
 
     /**
      * Whether to support invokeDynamic (requires Java 7 or greater and Groovy indy 2.0.0-beta-3 or greater).
+     * Has no effect for Groovy 4, as it is always enabled.
      */
     @Parameter(defaultValue = "false")
     protected boolean invokeDynamic;
 
+    /**
+     * Whether to enable Groovy's parallel parsing. Requires Groovy 3.0.5.
+     * Is enabled by default for Groovy 4.0.0-alpha-1 or newer.
+     *
+     * @since 1.11.0
+     */
+    @Parameter
+    protected Boolean parallelParsing = null;
+
     /**
      * A <a href="http://groovy-lang.org/dsls.html#compilation-customizers">script</a> for tweaking the configuration options
      * (requires Groovy 2.1.0-beta-1 or greater). Note that its encoding must match your source encoding.
@@ -220,14 +288,14 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
     /**
      * Performs compilation of compile mojos.
      *
-     * @param sources the sources to compile
-     * @param classpath the classpath to use for compilation
+     * @param sources                the sources to compile
+     * @param classpath              the classpath to use for compilation
      * @param compileOutputDirectory the directory to write the compiled class files to
-     * @throws ClassNotFoundException when a class needed for compilation cannot be found
-     * @throws InstantiationException when a class needed for compilation cannot be instantiated
-     * @throws IllegalAccessException when a method needed for compilation cannot be accessed
+     * @throws ClassNotFoundException    when a class needed for compilation cannot be found
+     * @throws InstantiationException    when a class needed for compilation cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for compilation cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for compilation cannot be completed
-     * @throws MalformedURLException when a classpath element provides a malformed URL
+     * @throws MalformedURLException     when a classpath element provides a malformed URL
      */
     @SuppressWarnings({"rawtypes"})
     protected synchronized void doCompile(final Set<File> sources, final List classpath, final File compileOutputDirectory)
@@ -242,7 +310,7 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
         logPluginClasspath();
         classWrangler.logGroovyVersion(mojoExecution.getMojoDescriptor().getGoal());
 
-        if (groovyVersionSupportsAction()) {
+        if (groovyVersionSupportsAction() && !skipBytecodeCheck) {
             verifyGroovyVersionSupportsTargetBytecode();
         } else {
             getLog().error("Your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support compilation. The minimum version of Groovy required is " + minGroovyVersion + ". Skipping compiling.");
@@ -267,22 +335,24 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
 
         // log compiled classes
         List classes = (List) invokeMethod(findMethod(compilationUnitClass, "getClasses"), compilationUnit);
-        getLog().info("Compiled " + classes.size() + " file" + (classes.size() > 1 || classes.size() == 0 ? "s" : "") + ".");
+        if (getLog().isInfoEnabled()) {
+            getLog().info("Compiled " + classes.size() + " file" + (classes.size() != 1 ? "s" : "") + ".");
+        }
     }
 
     /**
      * Sets up the CompilationUnit to use for compilation.
      *
-     * @param sources the sources to compile
+     * @param sources                    the sources to compile
      * @param compilerConfigurationClass the CompilerConfiguration class
-     * @param compilationUnitClass the CompilationUnit class
-     * @param groovyClassLoaderClass the GroovyClassLoader class
-     * @param compilerConfiguration the CompilerConfiguration
-     * @param groovyClassLoader the GroovyClassLoader
-     * @param transformLoader the GroovyClassLoader to use for transformation
+     * @param compilationUnitClass       the CompilationUnit class
+     * @param groovyClassLoaderClass     the GroovyClassLoader class
+     * @param compilerConfiguration      the CompilerConfiguration
+     * @param groovyClassLoader          the GroovyClassLoader
+     * @param transformLoader            the GroovyClassLoader to use for transformation
      * @return the CompilationUnit
-     * @throws InstantiationException when a class needed for setting up compilation unit cannot be instantiated
-     * @throws IllegalAccessException when a method needed for setting up compilation unit cannot be accessed
+     * @throws InstantiationException    when a class needed for setting up compilation unit cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for setting up compilation unit cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for setting up compilation unit cannot be completed
      */
     protected Object setupCompilationUnit(final Set<File> sources, final Class<?> compilerConfigurationClass, final Class<?> compilationUnitClass, final Class<?> groovyClassLoaderClass, final Object compilerConfiguration, final Object groovyClassLoader, final Object transformLoader) throws InvocationTargetException, IllegalAccessException, InstantiationException {
@@ -295,7 +365,9 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
         getLog().debug("Adding Groovy to compile:");
         Method addSourceMethod = findMethod(compilationUnitClass, "addSource", File.class);
         for (File source : sources) {
-            getLog().debug("    " + source);
+            if (getLog().isDebugEnabled()) {
+                getLog().debug("    " + source);
+            }
             invokeMethod(addSourceMethod, compilationUnit, source);
         }
 
@@ -305,12 +377,12 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
     /**
      * Sets up the CompilationConfiguration to use for compilation.
      *
-     * @param compileOutputDirectory the directory to write the compiled classes to
+     * @param compileOutputDirectory     the directory to write the compiled classes to
      * @param compilerConfigurationClass the CompilerConfiguration class
      * @return the CompilerConfiguration
-     * @throws ClassNotFoundException when a class needed for setting up CompilerConfiguration cannot be found
-     * @throws InstantiationException when a class needed for setting up CompilerConfiguration cannot be instantiated
-     * @throws IllegalAccessException when a method needed for setting up CompilerConfiguration cannot be accessed
+     * @throws ClassNotFoundException    when a class needed for setting up CompilerConfiguration cannot be found
+     * @throws InstantiationException    when a class needed for setting up CompilerConfiguration cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for setting up CompilerConfiguration cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for setting up CompilerConfiguration cannot be completed
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
@@ -318,9 +390,13 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
         Object compilerConfiguration = invokeConstructor(findConstructor(compilerConfigurationClass));
         if (configScript != null) {
             if (!configScript.exists()) {
-                getLog().warn("Configuration script file (" + configScript.getAbsolutePath() + ") doesn't exist. Ignoring configScript parameter.");
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Configuration script file (" + configScript.getAbsolutePath() + ") doesn't exist. Ignoring configScript parameter.");
+                }
             } else if (groovyOlderThan(GROOVY_2_1_0_BETA1)) {
-                getLog().warn("Requested to use configScript, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_2_1_0_BETA1 + " or newer). Ignoring configScript parameter.");
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Requested to use configScript, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_2_1_0_BETA1 + " or newer). Ignoring configScript parameter.");
+                }
             } else {
                 Class<?> bindingClass = classWrangler.getClass("groovy.lang.Binding");
                 Class<?> importCustomizerClass = classWrangler.getClass("org.codehaus.groovy.control.customizers.ImportCustomizer");
@@ -333,8 +409,10 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
                 invokeMethod(findMethod(importCustomizerClass, "addStaticStar", String.class), importCustomizer, "org.codehaus.groovy.control.customizers.builder.CompilerCustomizationBuilder");
                 List compilationCustomizers = (List) invokeMethod(findMethod(compilerConfigurationClass, "getCompilationCustomizers"), shellCompilerConfiguration);
                 compilationCustomizers.add(importCustomizer);
-                Object shell = invokeConstructor(findConstructor(groovyShellClass, bindingClass, compilerConfigurationClass), binding, shellCompilerConfiguration);
-                getLog().debug("Using configuration script " + configScript + " for compilation.");
+                Object shell = invokeConstructor(findConstructor(groovyShellClass, ClassLoader.class, bindingClass, compilerConfigurationClass), classWrangler.getClassLoader(), binding, shellCompilerConfiguration);
+                if (getLog().isDebugEnabled()) {
+                    getLog().debug("Using configuration script " + configScript + " for compilation.");
+                }
                 invokeMethod(findMethod(groovyShellClass, "evaluate", File.class), shell, configScript);
             }
         }
@@ -346,33 +424,42 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
         if (previewFeatures) {
             if (isJavaSupportPreviewFeatures()) {
                 if (groovyOlderThan(GROOVY_2_5_7) || (groovyAtLeast(GROOVY_2_6_0_ALPHA1) && groovyOlderThan(GROOVY_3_0_0_BETA1))) {
-                    getLog().warn("Requested to use preview features, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_2_5_7 + "/" + GROOVY_3_0_0_BETA1 + " or newer. No 2.6 version is supported. Ignoring previewFeatures parameter.");
+                    if (getLog().isWarnEnabled()) {
+                        getLog().warn("Requested to use preview features, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_2_5_7 + "/" + GROOVY_3_0_0_BETA1 + " or newer. No 2.6 version is supported. Ignoring previewFeatures parameter.");
+                    }
                 } else {
                     invokeMethod(findMethod(compilerConfigurationClass, "setPreviewFeatures", boolean.class), compilerConfiguration, previewFeatures);
                 }
             } else {
-                getLog().warn("Requested to use to use preview features, but your Java version (" + getJavaVersionString() + ") doesn't support it. Ignoring previewFeatures parameter.");
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Requested to use to use preview features, but your Java version (" + getJavaVersionString() + ") doesn't support it. Ignoring previewFeatures parameter.");
+                }
             }
         }
         if (sourceEncoding != null) {
             invokeMethod(findMethod(compilerConfigurationClass, "setSourceEncoding", String.class), compilerConfiguration, sourceEncoding);
         }
         invokeMethod(findMethod(compilerConfigurationClass, "setTargetDirectory", String.class), compilerConfiguration, compileOutputDirectory.getAbsolutePath());
-        if (invokeDynamic) {
+        if (invokeDynamic || groovyAtLeast(GROOVY_4_0_0_ALPHA1)) {
             if (groovyAtLeast(GROOVY_2_0_0_BETA3)) {
                 if (classWrangler.isGroovyIndy()) {
                     if (isJavaSupportIndy()) {
                         Map<String, Boolean> optimizationOptions = (Map<String, Boolean>) invokeMethod(findMethod(compilerConfigurationClass, "getOptimizationOptions"), compilerConfiguration);
                         optimizationOptions.put("indy", true);
                         optimizationOptions.put("int", false);
+                        getLog().info("invokedynamic enabled.");
                     } else {
-                        getLog().warn("Requested to use to use invokedynamic, but your Java version (" + getJavaVersionString() + ") doesn't support it. Ignoring invokeDynamic parameter.");
+                        if (getLog().isWarnEnabled()) {
+                            getLog().warn("Requested to use to use invokedynamic, but your Java version (" + getJavaVersionString() + ") doesn't support it. Ignoring invokeDynamic parameter.");
+                        }
                     }
                 } else {
                     getLog().warn("Requested to use invokedynamic, but your Groovy version doesn't support it (must use have indy classifier). Ignoring invokeDynamic parameter.");
                 }
             } else {
-                getLog().warn("Requested to use invokeDynamic, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_2_0_0_BETA3 + " or newer). Ignoring invokeDynamic parameter.");
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Requested to use invokeDynamic, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_2_0_0_BETA3 + " or newer). Ignoring invokeDynamic parameter.");
+                }
             }
         }
         if (parameters) {
@@ -380,10 +467,23 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
                 if (isJavaSupportParameters()) {
                     invokeMethod(findMethod(compilerConfigurationClass, "setParameters", boolean.class), compilerConfiguration, parameters);
                 } else {
-                    getLog().warn("Requested to use to use parameters, but your Java version (" + getJavaVersionString() + ") doesn't support it. Ignoring parameters parameter.");
+                    if (getLog().isWarnEnabled()) {
+                        getLog().warn("Requested to use to use parameters, but your Java version (" + getJavaVersionString() + ") doesn't support it. Ignoring parameters parameter.");
+                    }
                 }
             } else {
-                getLog().warn("Requested to use parameters, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_2_5_0_ALPHA1 + " or newer). Ignoring parameters parameter.");
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Requested to use parameters, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_2_5_0_ALPHA1 + " or newer). Ignoring parameters parameter.");
+                }
+            }
+        }
+        if (groovyAtLeast(GROOVY_3_0_5)) {
+            if ((parallelParsing == null && groovyAtLeast(GROOVY_4_0_0_ALPHA1)) || (parallelParsing != null && parallelParsing)) {
+                Map<String, Boolean> optimizationOptions = (Map<String, Boolean>) invokeMethod(findMethod(compilerConfigurationClass, "getOptimizationOptions"), compilerConfiguration);
+                optimizationOptions.put("parallelParse", true);
+                getLog().info("Parallel parsing enabled.");
+            } else {
+                getLog().info("Parallel parsing disabled.");
             }
         }
 
@@ -396,7 +496,27 @@ public abstract class AbstractCompileMojo extends AbstractGroovySourcesMojo {
      * org.codehaus.groovy.classgen.asm.WriterController.
      */
     protected void verifyGroovyVersionSupportsTargetBytecode() {
-        if ("13".equals(targetBytecode)) {
+        if ("18".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_4_0_0_BETA1)) {
+                throw new IllegalArgumentException("Target bytecode 18 requires Groovy " + GROOVY_4_0_0_BETA1 + " or newer.");
+            }
+        } else if ("17".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_3_0_8) || (groovyAtLeast(GROOVY_4_0_0_ALPHA1) && groovyOlderThan(GROOVY_4_0_0_ALPHA3))) {
+                throw new IllegalArgumentException("Target bytecode 17 requires Groovy " + GROOVY_3_0_8 + "/" + GROOVY_4_0_0_ALPHA3 + " or newer.");
+            }
+        } else if ("16".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_3_0_6)) {
+                throw new IllegalArgumentException("Target bytecode 16 requires Groovy " + GROOVY_3_0_6 + " or newer.");
+            }
+        } else if ("15".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_3_0_3)) {
+                throw new IllegalArgumentException("Target bytecode 15 requires Groovy " + GROOVY_3_0_3 + " or newer.");
+            }
+        } else if ("14".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_3_0_0_BETA2)) {
+                throw new IllegalArgumentException("Target bytecode 14 requires Groovy " + GROOVY_3_0_0_BETA2 + " or newer.");
+            }
+        } else if ("13".equals(targetBytecode)) {
             if (groovyOlderThan(GROOVY_2_5_7) || (groovyAtLeast(GROOVY_2_6_0_ALPHA1) && groovyOlderThan(GROOVY_3_0_0_BETA1))) {
                 throw new IllegalArgumentException("Target bytecode 13 requires Groovy " + GROOVY_2_5_7 + "/" + GROOVY_3_0_0_BETA1 + " or newer. No 2.6 version is supported.");
             }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojo.java
index 225816f..5c4713d 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojo.java
@@ -19,7 +19,7 @@ package org.codehaus.gmavenplus.mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.codehaus.gmavenplus.groovyworkarounds.DotGroovyFile;
 import org.codehaus.gmavenplus.model.IncludeClasspath;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.FileUtils;
 
 import java.io.File;
@@ -44,6 +44,41 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
      * (although it does create the target directory) when I use other versions.
      */
 
+    /**
+     * Groovy 4.0.0 beta-1 version.
+     */
+    protected static final Version GROOVY_4_0_0_BETA1 = new Version(4, 0, 0, "beta-1");
+
+    /**
+     * Groovy 4.0.0 alpha-3 version.
+     */
+    protected static final Version GROOVY_4_0_0_ALPHA3 = new Version(4, 0, 0, "alpha-3");
+
+    /**
+     * Groovy 4.0.0 alpha-1 version.
+     */
+    protected static final Version GROOVY_4_0_0_ALPHA1 = new Version(4, 0, 0, "alpha-1");
+
+    /**
+     * Groovy 3.0.8 version.
+     */
+    protected static final Version GROOVY_3_0_8 = new Version(3, 0, 8);
+
+    /**
+     * Groovy 3.0.6 version.
+     */
+    protected static final Version GROOVY_3_0_6 = new Version(3, 0, 6);
+
+    /**
+     * Groovy 3.0.3 version.
+     */
+    protected static final Version GROOVY_3_0_3 = new Version(3, 0, 3);
+
+    /**
+     * Groovy 3.0.0 beta-2 version.
+     */
+    protected static final Version GROOVY_3_0_0_BETA2 = new Version(3, 0, 0, "beta-2");
+
     /**
      * Groovy 3.0.0 beta-1 version.
      */
@@ -133,6 +168,11 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
      *   <li>11</li>
      *   <li>12</li>
      *   <li>13</li>
+     *   <li>14</li>
+     *   <li>15</li>
+     *   <li>16</li>
+     *   <li>17</li>
+     *   <li>18</li>
      * </ul>
      * Using 1.6 or 1.7 requires Groovy &gt;= 2.1.3.
      * Using 1.8 requires Groovy &gt;= 2.3.3.
@@ -140,12 +180,25 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
      * Using 9 with invokedynamic requires Groovy &gt;= 2.5.3, or Groovy &gt;= 3.0.0 alpha 2, but not any 2.6 versions.
      * Using 10, 11, or 12 requires Groovy &gt;= 2.5.3, or Groovy &gt;= 3.0.0 alpha 4, but not any 2.6 versions.
      * Using 13 requires Groovy &gt;= 2.5.7, or Groovy &gt;= 3.0.0-beta-1, but not any 2.6 versions.
+     * Using 14 requires Groovy &gt;= 3.0.0 beta-2.
+     * Using 15 requires Groovy &gt;= 3.0.3.
+     * Using 16 requires Groovy &gt;= 3.0.6.
+     * Using 17 requires Groovy &gt;= 3.0.8 or Groovy &gt; 4.0.0-alpha-3.
+     * Using 18 requires Groovy &gt; 4.0.0-beta-1.
      *
      * @since 1.0-beta-3
      */
     @Parameter(property = "maven.compiler.target", defaultValue = "1.8")
     protected String targetBytecode;
 
+    /**
+     * Whether to check that the version of Groovy used is able to use the requested <code>targetBytecode</code>.
+     *
+     * @since 1.9.0
+     */
+    @Parameter(property = "skipBytecodeCheck", defaultValue = "false")
+    protected boolean skipBytecodeCheck;
+
     /**
      * Whether Groovy compiler should be set to debug.
      */
@@ -194,26 +247,17 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
     @Parameter(defaultValue = "PROJECT_ONLY")
     protected IncludeClasspath includeClasspath;
 
-    /**
-     * Whether the bytecode version has preview features enabled (JEP 12).
-     * Requires Groovy &gt;= 3.0.0-beta-1 or Groovy &gt;= 2.5.7, but not any 2.6 versions and Java &gt;= 12.
-     *
-     * @since 1.7.1
-     */
-    @Parameter(defaultValue = "false")
-    protected boolean previewFeatures;
-
     /**
      * Performs the stub generation on the specified source files.
      *
-     * @param stubSources the sources to perform stub generation on
-     * @param classpath The classpath to use for compilation
+     * @param stubSources     the sources to perform stub generation on
+     * @param classpath       The classpath to use for compilation
      * @param outputDirectory the directory to write the stub files to
-     * @throws ClassNotFoundException when a class needed for stub generation cannot be found
-     * @throws InstantiationException when a class needed for stub generation cannot be instantiated
-     * @throws IllegalAccessException when a method needed for stub generation cannot be accessed
+     * @throws ClassNotFoundException    when a class needed for stub generation cannot be found
+     * @throws InstantiationException    when a class needed for stub generation cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for stub generation cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for stub generation cannot be completed
-     * @throws MalformedURLException when a classpath element provides a malformed URL
+     * @throws MalformedURLException     when a classpath element provides a malformed URL
      */
     protected synchronized void doStubGeneration(final Set<File> stubSources, final List<?> classpath, final File outputDirectory) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, MalformedURLException {
         if (stubSources == null || stubSources.isEmpty()) {
@@ -226,7 +270,7 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
         logPluginClasspath();
         classWrangler.logGroovyVersion(mojoExecution.getMojoDescriptor().getGoal());
 
-        if (groovyVersionSupportsAction()) {
+        if (groovyVersionSupportsAction() && !skipBytecodeCheck) {
             verifyGroovyVersionSupportsTargetBytecode();
         } else {
             getLog().error("Your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support stub generation. The minimum version of Groovy required is " + minGroovyVersion + ". Skipping stub generation.");
@@ -253,11 +297,11 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
     /**
      * Sets up the CompilerConfiguration to use for stub generation.
      *
-     * @param outputDirectory the directory to write the stub files to
+     * @param outputDirectory            the directory to write the stub files to
      * @param compilerConfigurationClass the CompilerConfiguration class
      * @return the CompilerConfiguration to use for stub generation
-     * @throws InstantiationException when a class needed for stub generation cannot be instantiated
-     * @throws IllegalAccessException when a method needed for stub generation cannot be accessed
+     * @throws InstantiationException    when a class needed for stub generation cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for stub generation cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for stub generation cannot be completed
      */
     protected Object setupCompilerConfiguration(final File outputDirectory, final Class<?> compilerConfigurationClass) throws InvocationTargetException, IllegalAccessException, InstantiationException {
@@ -267,21 +311,10 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
         invokeMethod(findMethod(compilerConfigurationClass, "setWarningLevel", int.class), compilerConfiguration, warningLevel);
         invokeMethod(findMethod(compilerConfigurationClass, "setTolerance", int.class), compilerConfiguration, tolerance);
         invokeMethod(findMethod(compilerConfigurationClass, "setTargetBytecode", String.class), compilerConfiguration, targetBytecode);
-        if (previewFeatures) {
-            if (isJavaSupportPreviewFeatures()) {
-                if (groovyOlderThan(GROOVY_2_5_7) || (groovyAtLeast(GROOVY_2_6_0_ALPHA1) && groovyOlderThan(GROOVY_3_0_0_BETA1))) {
-                    getLog().warn("Requested to use preview features, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_2_5_7 + "/" + GROOVY_3_0_0_BETA1 + " or newer. No 2.6 version is supported. Ignoring previewFeatures parameter.");
-                } else {
-                    invokeMethod(findMethod(compilerConfigurationClass, "setPreviewFeatures", boolean.class), compilerConfiguration, previewFeatures);
-                }
-            } else {
-                getLog().warn("Requested to use to use preview features, but your Java version (" + getJavaVersionString() + ") doesn't support it. Ignoring previewFeatures parameter.");
-            }
-        }
         if (sourceEncoding != null) {
             invokeMethod(findMethod(compilerConfigurationClass, "setSourceEncoding", String.class), compilerConfiguration, sourceEncoding);
         }
-        Map<String, Object> options = new HashMap<String, Object>();
+        Map<String, Object> options = new HashMap<>();
         options.put("stubDir", outputDirectory);
         options.put("keepStubs", Boolean.TRUE);
         invokeMethod(findMethod(compilerConfigurationClass, "setJointCompilationOptions", Map.class), compilerConfiguration, options);
@@ -292,27 +325,31 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
     /**
      * Adds the Groovy sources to the CompilationUnit.
      *
-     * @param stubSources the sources to perform stub generation on
-     * @param compilerConfigurationClass the CompilerConfiguration class
+     * @param stubSources                  the sources to perform stub generation on
+     * @param compilerConfigurationClass   the CompilerConfiguration class
      * @param javaStubCompilationUnitClass the JavaStubCompilationUnit class
-     * @param compilerConfiguration the CompilerConfiguration to use for stub generation
-     * @param javaStubCompilationUnit the JavaStubCompilationUnit to use for stub generation
-     * @throws IllegalAccessException when a method needed for stub generation cannot be accessed
+     * @param compilerConfiguration        the CompilerConfiguration to use for stub generation
+     * @param javaStubCompilationUnit      the JavaStubCompilationUnit to use for stub generation
+     * @throws IllegalAccessException    when a method needed for stub generation cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for stub generation cannot be completed
      */
     protected void addGroovySources(final Set<File> stubSources, final Class<?> compilerConfigurationClass, final Class<?> javaStubCompilationUnitClass, final Object compilerConfiguration, final Object javaStubCompilationUnit) throws InvocationTargetException, IllegalAccessException {
-        Set<String> scriptExtensions = new HashSet<String>();
+        Set<String> scriptExtensions = new HashSet<>();
         for (File stubSource : stubSources) {
             scriptExtensions.add(FileUtils.getFileExtension(stubSource));
         }
-        getLog().debug("Detected Groovy file extensions: "+ scriptExtensions + ".");
+        if (getLog().isDebugEnabled()) {
+            getLog().debug("Detected Groovy file extensions: " + scriptExtensions + ".");
+        }
         if (supportsSettingExtensions()) {
             invokeMethod(findMethod(compilerConfigurationClass, "setScriptExtensions", Set.class), compilerConfiguration, scriptExtensions);
         }
         getLog().debug("Adding Groovy to generate stubs for:");
         Method addSource = findMethod(javaStubCompilationUnitClass, "addSource", File.class);
         for (File stubSource : stubSources) {
-            getLog().debug("    " + stubSource);
+            if (getLog().isDebugEnabled()) {
+                getLog().debug("    " + stubSource);
+            }
             if (supportsSettingExtensions()) {
                 invokeMethod(addSource, javaStubCompilationUnit, stubSource);
             } else {
@@ -338,7 +375,9 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
      */
     protected void logGeneratedStubs(File outputDirectory) {
         Set<File> stubs = getStubs(outputDirectory);
-        getLog().info("Generated " + stubs.size() + " stub" + (stubs.size() > 1 || stubs.size() == 0 ? "s" : "") + ".");
+        if (getLog().isInfoEnabled()) {
+            getLog().info("Generated " + stubs.size() + " stub" + (stubs.size() != 1 ? "s" : "") + ".");
+        }
     }
 
     /**
@@ -353,7 +392,9 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
         for (File stub : stubs) {
             boolean success = stub.setLastModified(0L);
             if (!success) {
-                getLog().warn("Unable to set modified time on stub " + stub.getAbsolutePath() + ".");
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Unable to set modified time on stub " + stub.getAbsolutePath() + ".");
+                }
             }
         }
     }
@@ -364,7 +405,27 @@ public abstract class AbstractGenerateStubsMojo extends AbstractGroovyStubSource
      * org.codehaus.groovy.classgen.asm.WriterController.
      */
     protected void verifyGroovyVersionSupportsTargetBytecode() {
-        if ("13".equals(targetBytecode)) {
+        if ("18".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_4_0_0_BETA1)) {
+                throw new IllegalArgumentException("Target bytecode 18 requires Groovy " + GROOVY_4_0_0_BETA1 + " or newer.");
+            }
+        } else if ("17".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_3_0_8) || (groovyAtLeast(GROOVY_4_0_0_ALPHA1) && groovyOlderThan(GROOVY_4_0_0_ALPHA3))) {
+                throw new IllegalArgumentException("Target bytecode 17 requires Groovy " + GROOVY_3_0_8 + "/" + GROOVY_4_0_0_ALPHA3 + " or newer.");
+            }
+        } else if ("16".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_3_0_6)) {
+                throw new IllegalArgumentException("Target bytecode 16 requires Groovy " + GROOVY_3_0_6 + " or newer.");
+            }
+        } else if ("15".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_3_0_3)) {
+                throw new IllegalArgumentException("Target bytecode 15 requires Groovy " + GROOVY_3_0_3 + " or newer.");
+            }
+        } else if ("14".equals(targetBytecode)) {
+            if (groovyOlderThan(GROOVY_3_0_0_BETA2)) {
+                throw new IllegalArgumentException("Target bytecode 14 requires Groovy " + GROOVY_3_0_0_BETA2 + " or newer.");
+            }
+        } else if ("13".equals(targetBytecode)) {
             if (groovyOlderThan(GROOVY_2_5_7) || (groovyAtLeast(GROOVY_2_6_0_ALPHA1) && groovyOlderThan(GROOVY_3_0_0_BETA1))) {
                 throw new IllegalArgumentException("Target bytecode 13 requires Groovy " + GROOVY_2_5_7 + "/" + GROOVY_3_0_0_BETA1 + " or newer. No 2.6 version is supported.");
             }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyDocMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyDocMojo.java
index 049fae3..0233c04 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyDocMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyDocMojo.java
@@ -21,8 +21,9 @@ import org.apache.maven.shared.model.fileset.FileSet;
 import org.apache.maven.shared.model.fileset.util.FileSetManager;
 import org.codehaus.gmavenplus.groovyworkarounds.GroovyDocTemplateInfo;
 import org.codehaus.gmavenplus.model.IncludeClasspath;
+import org.codehaus.gmavenplus.model.Link;
 import org.codehaus.gmavenplus.model.Scopes;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.FileUtils;
 
 import java.io.*;
@@ -44,6 +45,11 @@ import static org.codehaus.gmavenplus.util.ReflectionUtils.*;
  */
 public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
 
+    /**
+     * Groovy 3.0.0 alpha-4 version.
+     */
+    protected static final Version GROOVY_3_0_0_ALPHA_4 = new Version(3, 0, 0, "alpha-4");
+
     /**
      * Groovy 1.6.0 RC-2 version.
      */
@@ -137,7 +143,7 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
      *
      * @since 1.6
      */
-    @Parameter(property = "maven.groovydoc.skip", defaultValue = "false")
+    @Parameter(property = "skipGroovydoc", defaultValue = "false")
     protected boolean skipGroovyDoc;
 
     /**
@@ -154,21 +160,108 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
     @Parameter(defaultValue = "PROJECT_ONLY")
     protected IncludeClasspath includeClasspath;
 
+    /**
+     * Override the default Groovydoc default top-level templates. Uses Groovy's standard templates by default.
+     *
+     * @since 1.10.1
+     */
+    @Parameter
+    protected String[] defaultDocTemplates = null;
+
+    /**
+     * Override the default Groovydoc package-level templates. Uses Groovy's standard templates by default.
+     *
+     * @since 1.10.1
+     */
+    @Parameter
+    protected String[] defaultPackageTemplates = null;
+
+    /**
+     * Override the default Groovydoc class-level templates. Uses Groovy's standard templates by default.
+     *
+     * @since 1.10.1
+     */
+    @Parameter
+    protected String[] defaultClassTemplates = null;
+
+    /**
+     * Allows you to override the class that is normally org.codehaus.groovy.tools.groovydoc.GroovyDocTool, for use when
+     * creating custom GroovyDoc implementations.
+     *
+     * @since 1.10.1
+     */
+    @Parameter
+    protected String groovyDocToolClass = null;
+
+    /**
+     * Allows you to override the class that is normally org.codehaus.groovy.tools.groovydoc.OutputTool, for use when
+     * creating custom GroovyDoc implementations.
+     *
+     * @since 1.10.1
+     */
+    @Parameter
+    protected String outputToolClass = null;
+
+    /**
+     * Allows you to override the class that is normally org.codehaus.groovy.tools.groovydoc.FileOutputTool, for use
+     * when creating custom GroovyDoc implementations.
+     *
+     * @since 1.10.1
+     */
+    @Parameter
+    protected String fileOutputToolClass = null;
+
+    /**
+     * Allows you to override the class that is normally org.codehaus.groovy.tools.groovydoc.ResourceManager, for use
+     * when creating custom GroovyDoc implementations.
+     *
+     * @since 1.10.1
+     */
+    @Parameter
+    protected String resourceManagerClass = null;
+
+    /**
+     * Allows you to override the class that is normally org.codehaus.groovy.tools.groovydoc.ClasspathResourceManager,
+     * for use when creating custom GroovyDoc implementations.
+     *
+     * @since 1.10.1
+     */
+    @Parameter
+    protected String classpathResourceManagerClass = null;
+
+    /**
+     * Allows you to override the class that is normally org.codehaus.groovy.tools.groovydoc.LinkArgument (or
+     * org.codehaus.groovy.ant.Groovydoc$LinkArgument for Groovy older than 1.6-RC-2), for use when creating custom
+     * GroovyDoc implementations.
+     *
+     * @since 1.10.1
+     */
+    @Parameter
+    protected String linkArgumentClass = null;
+
+    /**
+     * Enable attaching GroovyDoc annotation. Requires Groovy 3.0.0 alpha-4 or newer.
+     *
+     * @since 1.11.0
+     */
+    @Parameter(defaultValue = "false")
+    protected boolean attachGroovyDocAnnotation;
+
     /**
      * Generates the GroovyDoc for the specified sources.
      *
      * @param sourceDirectories The source directories to generate GroovyDoc for
-     * @param classpath The classpath to use for compilation
-     * @param outputDirectory The directory to save the generated GroovyDoc in
-     * @throws ClassNotFoundException when a class needed for GroovyDoc generation cannot be found
-     * @throws InstantiationException when a class needed for GroovyDoc generation cannot be instantiated
-     * @throws IllegalAccessException when a method needed for GroovyDoc generation cannot be accessed
+     * @param classpath         The classpath to use for compilation
+     * @param outputDirectory   The directory to save the generated GroovyDoc in
+     * @throws ClassNotFoundException    when a class needed for GroovyDoc generation cannot be found
+     * @throws InstantiationException    when a class needed for GroovyDoc generation cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for GroovyDoc generation cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for GroovyDoc generation cannot be completed
-     * @throws MalformedURLException when a classpath element provides a malformed URL
+     * @throws MalformedURLException     when a classpath element provides a malformed URL
      */
     protected synchronized void doGroovyDocGeneration(final FileSet[] sourceDirectories, final List<?> classpath, final File outputDirectory) throws ClassNotFoundException, InvocationTargetException, IllegalAccessException, InstantiationException, MalformedURLException {
         if (skipGroovyDoc) {
-            getLog().info("Skipping generation of GroovyDoc because ${maven.groovydoc.skip} was set to true.");
+            getLog().info("Skipping generation of GroovyDoc because ${skipGroovydoc} was set to true.");
             return;
         }
 
@@ -188,30 +281,43 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
         }
         if (groovyIs(GROOVY_1_6_0_RC1) || groovyIs(GROOVY_1_5_8)) {
             // Groovy 1.5.8 and 1.6-RC-1 are blacklisted because of their dependency on org.apache.tools.ant.types.Path in GroovyDocTool constructor
-            getLog().warn("Groovy " + GROOVY_1_5_8 + " and " + GROOVY_1_6_0_RC1 + " are blacklisted from the supported GroovyDoc versions because of their dependency on Ant. Skipping GroovyDoc generation.");
+            if (getLog().isWarnEnabled()) {
+                getLog().warn("Groovy " + GROOVY_1_5_8 + " and " + GROOVY_1_6_0_RC1 + " are blacklisted from the supported GroovyDoc versions because of their dependency on Ant. Skipping GroovyDoc generation.");
+            }
             return;
         }
 
         // get classes we need with reflection
-        Class<?> groovyDocToolClass = classWrangler.getClass("org.codehaus.groovy.tools.groovydoc.GroovyDocTool");
-        Class<?> outputToolClass = classWrangler.getClass("org.codehaus.groovy.tools.groovydoc.OutputTool");
-        Class<?> fileOutputToolClass = classWrangler.getClass("org.codehaus.groovy.tools.groovydoc.FileOutputTool");
-        Class<?> resourceManagerClass = classWrangler.getClass("org.codehaus.groovy.tools.groovydoc.ResourceManager");
-        Class<?> classpathResourceManagerClass = classWrangler.getClass("org.codehaus.groovy.tools.groovydoc.ClasspathResourceManager");
+        Class<?> groovyDocToolClass = classWrangler.getClass(this.groovyDocToolClass == null ? "org.codehaus.groovy.tools.groovydoc.GroovyDocTool" : this.groovyDocToolClass);
+        Class<?> outputToolClass = classWrangler.getClass(this.outputToolClass == null ? "org.codehaus.groovy.tools.groovydoc.OutputTool" : this.outputToolClass);
+        Class<?> fileOutputToolClass = classWrangler.getClass(this.fileOutputToolClass == null ? "org.codehaus.groovy.tools.groovydoc.FileOutputTool" : this.fileOutputToolClass);
+        Class<?> resourceManagerClass = classWrangler.getClass(this.resourceManagerClass == null ? "org.codehaus.groovy.tools.groovydoc.ResourceManager" : this.resourceManagerClass);
+        Class<?> classpathResourceManagerClass = classWrangler.getClass(this.classpathResourceManagerClass == null ? "org.codehaus.groovy.tools.groovydoc.ClasspathResourceManager" : this.classpathResourceManagerClass);
 
         // set up GroovyDoc options
+        if (attachGroovyDocAnnotation) {
+            if (groovyAtLeast(GROOVY_3_0_0_ALPHA_4)) {
+                System.setProperty("runtimeGroovydoc", "true");
+            } else {
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Requested to enable attaching GroovyDoc annotation, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be " + GROOVY_3_0_0_ALPHA_4 + " or newer). Ignoring enableGroovyDocAnnotation parameter.");
+                }
+            }
+        }
         Properties docProperties = setupProperties();
         Object fileOutputTool = invokeConstructor(findConstructor(fileOutputToolClass));
         Object classpathResourceManager = invokeConstructor(findConstructor(classpathResourceManagerClass));
         FileSetManager fileSetManager = new FileSetManager(getLog());
-        List<String> sourceDirectoriesStrings = new ArrayList<String>();
+        List<String> sourceDirectoriesStrings = new ArrayList<>();
         for (FileSet sourceDirectory : sourceDirectories) {
             sourceDirectoriesStrings.add(sourceDirectory.getDirectory());
         }
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(classWrangler.getGroovyVersion());
         List<?> groovyDocLinks = setupLinks();
         if (groovyOlderThan(GROOVY_1_6_0_RC2)) {
-            getLog().warn("Your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support GroovyDoc documentation properties (docTitle, footer, header, displayAuthor, overviewFile, and scope). You need Groovy 1.6-RC-2 or newer to support this. Ignoring properties.");
+            if (getLog().isWarnEnabled()) {
+                getLog().warn("Your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support GroovyDoc documentation properties (docTitle, footer, header, displayAuthor, overviewFile, and scope). You need Groovy 1.6-RC-2 or newer to support this. Ignoring properties.");
+            }
         }
 
         // prevent Java stubs (which lack Javadoc) from overwriting GroovyDoc by removing Java sources
@@ -254,7 +360,9 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
                 properties.setProperty("privateScope", "true");
             }
         } catch (IllegalArgumentException e) {
-            getLog().warn("Scope (" + scope + ") was not recognized. Skipping argument.");
+            if (getLog().isWarnEnabled()) {
+                getLog().warn("Scope (" + scope + ") was not recognized. Skipping argument.");
+            }
         }
 
         return properties;
@@ -264,9 +372,9 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
      * Sets up the GroovyDoc links.
      *
      * @return the GroovyDoc links
-     * @throws ClassNotFoundException when a class needed for setting up GroovyDoc links cannot be found
-     * @throws InstantiationException when a class needed for setting up GroovyDoc links cannot be instantiated
-     * @throws IllegalAccessException when a method needed for setting up GroovyDoc links cannot be accessed
+     * @throws ClassNotFoundException    when a class needed for setting up GroovyDoc links cannot be found
+     * @throws InstantiationException    when a class needed for setting up GroovyDoc links cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for setting up GroovyDoc links cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for setting up GroovyDoc links cannot be completed
      */
     @SuppressWarnings({"rawtypes", "unchecked"})
@@ -274,10 +382,14 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
         List linksList = new ArrayList();
         if (links != null && links.size() > 0) {
             Class<?> linkArgumentClass = null;
-            if (groovyAtLeast(GROOVY_1_6_0_RC2)) {
-                linkArgumentClass = classWrangler.getClass("org.codehaus.groovy.tools.groovydoc.LinkArgument");
-            } else if (groovyAtLeast(GROOVY_1_5_2)) {
-                linkArgumentClass = classWrangler.getClass("org.codehaus.groovy.ant.Groovydoc$LinkArgument");
+            if (this.linkArgumentClass == null) {
+                if (groovyAtLeast(GROOVY_1_6_0_RC2)) {
+                    linkArgumentClass = classWrangler.getClass("org.codehaus.groovy.tools.groovydoc.LinkArgument");
+                } else if (groovyAtLeast(GROOVY_1_5_2)) {
+                    linkArgumentClass = classWrangler.getClass("org.codehaus.groovy.ant.Groovydoc$LinkArgument");
+                }
+            } else {
+                linkArgumentClass = classWrangler.getClass(this.linkArgumentClass);
             }
             if (linkArgumentClass != null) {
                 Method setHref = findMethod(linkArgumentClass, "setHref", String.class);
@@ -289,7 +401,9 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
                     linksList.add(linkArgument);
                 }
             } else {
-                getLog().warn("Requested to use GroovyDoc links, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be 1.5.2 or newer). Ignoring links parameter.");
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Requested to use GroovyDoc links, but your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support it (must be 1.5.2 or newer). Ignoring links parameter.");
+                }
             }
         }
 
@@ -299,16 +413,16 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
     /**
      * Instantiates a new GroovyDocTool.
      *
-     * @param groovyDocToolClass the GroovyDocTool class
-     * @param resourceManagerClass the ResourceManager lass
-     * @param docProperties the documentation properties
+     * @param groovyDocToolClass       the GroovyDocTool class
+     * @param resourceManagerClass     the ResourceManager lass
+     * @param docProperties            the documentation properties
      * @param classpathResourceManager the ClasspathResourceManager for the GroovyDocTool
-     * @param sourceDirectories the source directories for the GroovyDocTool
-     * @param groovyDocTemplateInfo the GroovyDocTemplateInfo for the GroovyDocTool
-     * @param groovyDocLinks the GroovyDoc links
+     * @param sourceDirectories        the source directories for the GroovyDocTool
+     * @param groovyDocTemplateInfo    the GroovyDocTemplateInfo for the GroovyDocTool
+     * @param groovyDocLinks           the GroovyDoc links
      * @return the GroovyDocTool to use in GroovyDoc generation
-     * @throws InstantiationException when a class needed for setting up GroovyDoc tool cannot be instantiated
-     * @throws IllegalAccessException when a method needed for setting up GroovyDoc tool cannot be accessed
+     * @throws InstantiationException    when a class needed for setting up GroovyDoc tool cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for setting up GroovyDoc tool cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for setting up GroovyDoc tool cannot be completed
      */
     protected Object createGroovyDocTool(final Class<?> groovyDocToolClass, final Class<?> resourceManagerClass, final Properties docProperties, final Object classpathResourceManager, final List<String> sourceDirectories, final GroovyDocTemplateInfo groovyDocTemplateInfo, final List<?> groovyDocLinks) throws InvocationTargetException, IllegalAccessException, InstantiationException {
@@ -317,9 +431,9 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
             groovyDocTool = invokeConstructor(findConstructor(groovyDocToolClass, resourceManagerClass, String[].class, String[].class, String[].class, String[].class, List.class, Properties.class),
                     classpathResourceManager,
                     sourceDirectories.toArray(new String[0]),
-                    groovyDocTemplateInfo.defaultDocTemplates(),
-                    groovyDocTemplateInfo.defaultPackageTemplates(),
-                    groovyDocTemplateInfo.defaultClassTemplates(),
+                    defaultDocTemplates == null ? groovyDocTemplateInfo.defaultDocTemplates() : defaultDocTemplates,
+                    defaultPackageTemplates == null ? groovyDocTemplateInfo.defaultPackageTemplates() : defaultPackageTemplates,
+                    defaultClassTemplates == null ? groovyDocTemplateInfo.defaultClassTemplates() : defaultClassTemplates,
                     groovyDocLinks,
                     docProperties
             );
@@ -327,24 +441,28 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
             groovyDocTool = invokeConstructor(findConstructor(groovyDocToolClass, resourceManagerClass, String.class, String[].class, String[].class, String[].class, List.class),
                     classpathResourceManager,
                     sourceDirectories.get(0),
-                    groovyDocTemplateInfo.defaultDocTemplates(),
-                    groovyDocTemplateInfo.defaultPackageTemplates(),
-                    groovyDocTemplateInfo.defaultClassTemplates(),
+                    defaultDocTemplates == null ? groovyDocTemplateInfo.defaultDocTemplates() : defaultDocTemplates,
+                    defaultPackageTemplates == null ? groovyDocTemplateInfo.defaultPackageTemplates() : defaultPackageTemplates,
+                    defaultClassTemplates == null ? groovyDocTemplateInfo.defaultClassTemplates() : defaultClassTemplates,
                     groovyDocLinks
             );
             if (sourceDirectories.size() > 1) {
-                getLog().warn("Your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support more than one GroovyDoc source directory (must be 1.6-RC-2 or newer). Only using first source directory (" + sourceDirectories.get(0) + ").");
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support more than one GroovyDoc source directory (must be 1.6-RC-2 or newer). Only using first source directory (" + sourceDirectories.get(0) + ").");
+                }
             }
         } else {
             groovyDocTool = invokeConstructor(findConstructor(groovyDocToolClass, resourceManagerClass, String.class, String[].class, String[].class, String[].class),
                     classpathResourceManager,
                     sourceDirectories.get(0),
-                    groovyDocTemplateInfo.defaultDocTemplates(),
-                    groovyDocTemplateInfo.defaultPackageTemplates(),
-                    groovyDocTemplateInfo.defaultClassTemplates()
+                    defaultDocTemplates == null ? groovyDocTemplateInfo.defaultDocTemplates() : defaultDocTemplates,
+                    defaultPackageTemplates == null ? groovyDocTemplateInfo.defaultPackageTemplates() : defaultPackageTemplates,
+                    defaultClassTemplates == null ? groovyDocTemplateInfo.defaultClassTemplates() : defaultClassTemplates
             );
             if (sourceDirectories.size() > 1) {
-                getLog().warn("Your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support more than one GroovyDoc source directory (must be 1.6-RC-2 or newer). Only using first source directory (" + sourceDirectories.get(0) + ").");
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("Your Groovy version (" + classWrangler.getGroovyVersionString() + ") doesn't support more than one GroovyDoc source directory (must be 1.6-RC-2 or newer). Only using first source directory (" + sourceDirectories.get(0) + ").");
+                }
             }
         }
 
@@ -355,13 +473,13 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
      * Gets the Groovy sources without the Java sources (since the Java sources don't have Javadoc).
      *
      * @param sourceDirectories the source directories to get the Groovy sources from
-     * @param fileSetManager the FileSetmanager to use to get the included files
+     * @param fileSetManager    the FileSetmanager to use to get the included files
      * @return the groovy sources
      */
     protected List<String> setupGroovyDocSources(final FileSet[] sourceDirectories, final FileSetManager fileSetManager) {
-        List<String> javaSources = new ArrayList<String>();
-        List<String> groovySources = new ArrayList<String>();
-        List<String> possibleGroovyStubs = new ArrayList<String>();
+        List<String> javaSources = new ArrayList<>();
+        List<String> groovySources = new ArrayList<>();
+        List<String> possibleGroovyStubs = new ArrayList<>();
         for (FileSet sourceDirectory : sourceDirectories) {
             String[] sources = fileSetManager.getIncludedFiles(sourceDirectory);
             for (String source : sources) {
@@ -374,7 +492,7 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
             }
         }
         javaSources.removeAll(possibleGroovyStubs);
-        List<String> groovyDocSources = new ArrayList<String>();
+        List<String> groovyDocSources = new ArrayList<>();
         groovyDocSources.addAll(javaSources);
         groovyDocSources.addAll(groovySources);
 
@@ -384,20 +502,22 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
     /**
      * Performs the GroovyDoc generation.
      *
-     * @param outputDirectory the directory to output the GroovyDoc to
+     * @param outputDirectory    the directory to output the GroovyDoc to
      * @param groovyDocToolClass the GroovyDocTool class
-     * @param outputToolClass the OutputTool class
-     * @param fileOutputTool the FileOutputTool to use for GroovyDoc generation
-     * @param groovyDocSources the sources to
-     * @param groovyDocTool the GroovyDocTool to use for GroovyDoc generation
-     * @throws IllegalAccessException when a method needed for GroovyDoc generation cannot be accessed
+     * @param outputToolClass    the OutputTool class
+     * @param fileOutputTool     the FileOutputTool to use for GroovyDoc generation
+     * @param groovyDocSources   the sources to
+     * @param groovyDocTool      the GroovyDocTool to use for GroovyDoc generation
+     * @throws IllegalAccessException    when a method needed for GroovyDoc generation cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for GroovyDoc generation cannot be completed
      */
     protected void generateGroovyDoc(final File outputDirectory, final Class<?> groovyDocToolClass, final Class<?> outputToolClass, final Object fileOutputTool, final List<String> groovyDocSources, final Object groovyDocTool) throws InvocationTargetException, IllegalAccessException {
         getLog().debug("Adding sources to generate GroovyDoc for:");
         if (getLog().isDebugEnabled()) {
             for (String groovyDocSource : groovyDocSources) {
-                getLog().debug("    " + groovyDocSource);
+                if (getLog().isDebugEnabled()) {
+                    getLog().debug("    " + groovyDocSource);
+                }
             }
         }
         if (groovyAtLeast(GROOVY_1_6_0_RC2)) {
@@ -417,7 +537,9 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
      * @param outputDirectory The output directory to copy the stylesheet to
      */
     protected void copyStylesheet(final File outputDirectory) {
-        getLog().info("Using stylesheet from " + stylesheetFile.getAbsolutePath() + ".");
+        if (getLog().isInfoEnabled()) {
+            getLog().info("Using stylesheet from " + stylesheetFile.getAbsolutePath() + ".");
+        }
         try {
             BufferedReader bufferedReader = null;
             BufferedWriter bufferedWriter = null;
@@ -444,7 +566,9 @@ public abstract class AbstractGroovyDocMojo extends AbstractGroovySourcesMojo {
                 FileUtils.closeQuietly(bufferedWriter);
             }
         } catch (IOException e) {
-            getLog().warn("Unable to copy specified stylesheet (" + stylesheetFile.getAbsolutePath() + ").");
+            if (getLog().isWarnEnabled()) {
+                getLog().warn("Unable to copy specified stylesheet (" + stylesheetFile.getAbsolutePath() + ").");
+            }
         }
     }
 
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojo.java
index 8bf8136..ae59157 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojo.java
@@ -23,13 +23,15 @@ import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.gmavenplus.model.IncludeClasspath;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 
 import java.io.File;
 import java.net.MalformedURLException;
 import java.util.List;
 
+import static java.util.Collections.emptyList;
+
 
 /**
  * The base mojo class, which all other mojos extend.
@@ -112,10 +114,15 @@ public abstract class AbstractGroovyMojo extends AbstractMojo {
     protected void logPluginClasspath() {
         if (getLog().isDebugEnabled()) {
             StringBuilder sb = new StringBuilder();
-            for (Artifact artifact : pluginArtifacts) {
-                sb.append(artifact.getFile());
+            for (int i = 0; i < pluginArtifacts.size(); i++) {
+                sb.append(pluginArtifacts.get(i).getFile());
+                if (i < pluginArtifacts.size() - 1) {
+                    sb.append(", ");
+                }
+            }
+            if (getLog().isDebugEnabled()) {
+                getLog().debug("Plugin classpath:\n" + sb);
             }
-            getLog().debug("Plugin classpath:\n" + sb.toString());
         }
     }
 
@@ -217,7 +224,7 @@ public abstract class AbstractGroovyMojo extends AbstractMojo {
      * Gets whether the version of Groovy on the classpath supports invokedynamic.
      *
      * @return <code>true</code> if the version of Groovy uses invokedynamic,
-     *         <code>false</code> if not or Groovy dependency cannot be found
+     * <code>false</code> if not or Groovy dependency cannot be found
      */
     protected boolean isGroovyIndy() {
         return classWrangler.isGroovyIndy();
@@ -226,17 +233,20 @@ public abstract class AbstractGroovyMojo extends AbstractMojo {
     /**
      * Instantiate a ClassWrangler.
      *
-     * @param classpath the classpath to load onto a new classloader (if includeClasspath is <code>PROJECT_ONLY</code>)
+     * @param classpath        the classpath to load onto a new classloader (if includeClasspath is <code>PROJECT_ONLY</code>)
      * @param includeClasspath whether to use a shared classloader that includes both the project classpath and plugin classpath.
      * @throws MalformedURLException when a classpath element provides a malformed URL
      */
     protected void setupClassWrangler(List<?> classpath, IncludeClasspath includeClasspath) throws MalformedURLException {
         if (IncludeClasspath.PROJECT_ONLY.equals(includeClasspath)) {
             getLog().info("Using isolated classloader, without GMavenPlus classpath.");
-            classWrangler = new ClassWrangler(classpath, getLog());
+            classWrangler = new ClassWrangler(classpath, ClassLoader.getSystemClassLoader(), getLog());
+        } else if (IncludeClasspath.PROJECT_AND_PLUGIN.equals(includeClasspath)) {
+            getLog().info("Using plugin classloader, includes GMavenPlus and project classpath.");
+            classWrangler = new ClassWrangler(classpath, getClass().getClassLoader(), getLog());
         } else {
-            getLog().info("Using plugin classloader, includes GMavenPlus classpath.");
-            classWrangler = new ClassWrangler(Thread.currentThread().getContextClassLoader(), getLog());
+            getLog().info("Using plugin classloader, includes GMavenPlus classpath, but not project classpath.");
+            classWrangler = new ClassWrangler(emptyList(), getClass().getClassLoader(), getLog());
         }
     }
 }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovySourcesMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovySourcesMojo.java
index a1c377b..9464db1 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovySourcesMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovySourcesMojo.java
@@ -46,12 +46,12 @@ public abstract class AbstractGroovySourcesMojo extends AbstractGroovyMojo {
     /**
      * Gets the set of included files from the specified source files or source directory (if sources are null).
      *
-     * @param fromSources The sources to get the included files from
+     * @param fromSources        The sources to get the included files from
      * @param includeJavaSources Whether to include Java sources
      * @return The included files from the specified sources
      */
     protected SortedSet<File> getFiles(final FileSet[] fromSources, final boolean includeJavaSources) {
-        SortedSet<File> files = new TreeSet<File>();
+        SortedSet<File> files = new TreeSet<>();
         FileSetManager fileSetManager = new FileSetManager(getLog());
 
         for (FileSet fileSet : getFilesets(fromSources, includeJavaSources)) {
@@ -66,12 +66,12 @@ public abstract class AbstractGroovySourcesMojo extends AbstractGroovyMojo {
     /**
      * Gets the set of included files from the specified source files or source directory (if sources are null).
      *
-     * @param fromSources The sources to get the included files from
+     * @param fromSources        The sources to get the included files from
      * @param includeJavaSources Whether to include Java sources
      * @return The included files from the specified sources
      */
     protected SortedSet<File> getTestFiles(final FileSet[] fromSources, final boolean includeJavaSources) {
-        SortedSet<File> files = new TreeSet<File>();
+        SortedSet<File> files = new TreeSet<>();
         FileSetManager fileSetManager = new FileSetManager(getLog());
 
         for (FileSet fileSet : getTestFilesets(fromSources, includeJavaSources)) {
@@ -86,7 +86,7 @@ public abstract class AbstractGroovySourcesMojo extends AbstractGroovyMojo {
     /**
      * Gets the set of included filesets from the specified source files or source directory (if sources are null).
      *
-     * @param fromSources The sources to get the included files from
+     * @param fromSources        The sources to get the included files from
      * @param includeJavaSources Whether to include Java sources
      * @return The included filesets from the specified sources
      */
@@ -101,14 +101,14 @@ public abstract class AbstractGroovySourcesMojo extends AbstractGroovyMojo {
             String groovyDirectory = "src" + File.separator + MAIN + File.separator + "groovy";
             groovyFileSet.setDirectory(project.getBasedir() + File.separator + groovyDirectory);
             groovyFileSet.setIncludes(singletonList(GROOVY_SOURCES_PATTERN));
-            groovyFileSets = new FileSet[] {groovyFileSet};
+            groovyFileSets = new FileSet[]{groovyFileSet};
         }
 
         if (includeJavaSources) {
-            List<FileSet> javaFileSets = new ArrayList<FileSet>();
-            for (Object sourceRoot : project.getCompileSourceRoots()) {
+            List<FileSet> javaFileSets = new ArrayList<>();
+            for (String sourceRoot : project.getCompileSourceRoots()) {
                 FileSet javaFileSet = new FileSet();
-                javaFileSet.setDirectory((String) sourceRoot);
+                javaFileSet.setDirectory(sourceRoot);
                 javaFileSet.setIncludes(singletonList(JAVA_SOURCES_PATTERN));
                 javaFileSets.add(javaFileSet);
             }
@@ -125,7 +125,7 @@ public abstract class AbstractGroovySourcesMojo extends AbstractGroovyMojo {
     /**
      * Gets the set of included filesets from the specified source files or source directory (if sources are null).
      *
-     * @param fromSources The sources to get the included files from
+     * @param fromSources        The sources to get the included files from
      * @param includeJavaSources Whether to include Java sources
      * @return The included filesets from the specified sources
      */
@@ -140,14 +140,14 @@ public abstract class AbstractGroovySourcesMojo extends AbstractGroovyMojo {
             String groovyDirectory = "src" + File.separator + TEST + File.separator + "groovy";
             groovyFileSet.setDirectory(project.getBasedir() + File.separator + groovyDirectory);
             groovyFileSet.setIncludes(singletonList(GROOVY_SOURCES_PATTERN));
-            groovyFileSets = new FileSet[] {groovyFileSet};
+            groovyFileSets = new FileSet[]{groovyFileSet};
         }
 
         if (includeJavaSources) {
-            List<FileSet> javaFileSets = new ArrayList<FileSet>();
-            for (Object sourceRoot : project.getTestCompileSourceRoots()) {
+            List<FileSet> javaFileSets = new ArrayList<>();
+            for (String sourceRoot : project.getTestCompileSourceRoots()) {
                 FileSet javaFileSet = new FileSet();
-                javaFileSet.setDirectory((String) sourceRoot);
+                javaFileSet.setDirectory(sourceRoot);
                 javaFileSet.setIncludes(singletonList(JAVA_SOURCES_PATTERN));
                 javaFileSets.add(javaFileSet);
             }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyStubSourcesMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyStubSourcesMojo.java
index 408654b..be98b77 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyStubSourcesMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractGroovyStubSourcesMojo.java
@@ -36,12 +36,12 @@ public abstract class AbstractGroovyStubSourcesMojo extends AbstractGroovySource
 
     /**
      * Gets the set of stub files in specified directory.
-     * @param outputDirectory the directory to write stubs to
      *
+     * @param outputDirectory the directory to write stubs to
      * @return The set of stub files in specified directory
      */
     protected Set<File> getStubs(File outputDirectory) {
-        Set<File> files = new HashSet<File>();
+        Set<File> files = new HashSet<>();
         FileSetManager fileSetManager = new FileSetManager(getLog());
 
         FileSet fileSet = new FileSet();
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractToolsMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractToolsMojo.java
index 58b4ab9..8eaa0cf 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AbstractToolsMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AbstractToolsMojo.java
@@ -32,6 +32,7 @@ import static org.codehaus.gmavenplus.util.ReflectionUtils.invokeConstructor;
  * The base tools mojo, which all tool mojos extend.
  * Note that it references the plugin classloader to pull in dependencies
  * Groovy didn't include (for things like Ant for AntBuilder, Ivy for @grab, and Jansi for Groovysh).
+ * Note that using the <code>ant</code> property requires Java 8, as the included Ant version was compiled for Java 8.
  *
  * @author Keegan Witt
  * @since 1.1
@@ -60,7 +61,7 @@ public abstract class AbstractToolsMojo extends AbstractGroovyMojo {
      *   <dt>log</dt>
      *     <dd>A org.apache.maven.plugin.logging.Log object of Maven's log.</dd>
      *   <dt>ant</dt>
-     *     <dd>A groovy.util.AntBuilder object (if groovy.util.AntBuilder is available).</dd>
+     *     <dd>A groovy.util.AntBuilder object (if groovy.ant.AntBuilder or groovy.util.AntBuilder is available).</dd>
      * </dl>
      * These can be overridden.
      *
@@ -100,6 +101,36 @@ public abstract class AbstractToolsMojo extends AbstractGroovyMojo {
     @Parameter(defaultValue = "PROJECT_AND_PLUGIN")
     protected IncludeClasspath includeClasspath;
 
+    /**
+     * Whether to add all properties from <code>project.properties</code> into properties.
+     *
+     * @since 1.10.1
+     */
+    @Parameter(defaultValue = "false")
+    protected boolean bindAllProjectProperties;
+
+    /**
+     * Whether to add user session properties from <code>session.userProperties</code> that override project properties
+     * into properties. <code>bindAllSessionUserProperties</code> takes priority over this property if present. Has no
+     * effect if <code>bindAllProjectProperties</code> is <code>false</code>.
+     *
+     * @since 1.10.1
+     */
+    @Parameter(defaultValue = "false")
+    protected boolean bindSessionUserOverrideProperties;
+
+    /**
+     * Whether to add all properties from <code>session.userProperties</code> into properties. If both
+     * <code>bindAllProjectProperties</code> and <code>bindAllSessionUserProperties</code> are specified, the session
+     * properties will override the project properties, but it will also include properties not present in project
+     * properties. To only include user session properties that are also in project properties, use
+     * <code>bindSessionUserOverrideProperties</code>.
+     *
+     * @since 1.10.1
+     */
+    @Parameter(defaultValue = "false")
+    protected boolean bindAllSessionUserProperties;
+
     /**
      * Initializes the properties field.
      */
@@ -123,18 +154,42 @@ public abstract class AbstractToolsMojo extends AbstractGroovyMojo {
             properties.put("projectHelper", projectHelper);
         }
         if (!properties.containsKey("ant")) {
+            Object antBuilder = null;
             try {
-                Object antBuilder = invokeConstructor(findConstructor(classWrangler.getClass("groovy.util.AntBuilder")));
-                properties.put("ant", antBuilder);
-            } catch (InvocationTargetException e) {
-                logUnableToInitializeAntBuilder(e);
-            } catch (IllegalAccessException e) {
-                logUnableToInitializeAntBuilder(e);
-            } catch (InstantiationException e) {
-                logUnableToInitializeAntBuilder(e);
-            } catch (ClassNotFoundException e) {
+                antBuilder = invokeConstructor(findConstructor(classWrangler.getClass("groovy.ant.AntBuilder")));
+            } catch (ClassNotFoundException e1) {
+                getLog().debug("groovy.ant.AntBuilder not available, trying groovy.util.AntBuilder.");
+                try {
+                    antBuilder = invokeConstructor(findConstructor(classWrangler.getClass("groovy.util.AntBuilder")));
+                } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | InvocationTargetException e2) {
+                    logUnableToInitializeAntBuilder(e2);
+                }
+            } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
                 logUnableToInitializeAntBuilder(e);
             }
+            if (antBuilder != null) {
+                properties.put("ant", antBuilder);
+            }
+        }
+        if (bindSessionUserOverrideProperties && !bindAllProjectProperties) {
+            getLog().warn("bindSessionUserOverrideProperties set without bindAllProjectProperties, ignoring.");
+        }
+        if (bindAllSessionUserProperties && bindSessionUserOverrideProperties) {
+            getLog().warn("bindAllSessionUserProperties and bindSessionUserOverrideProperties both set, bindAllSessionUserProperties will take precedence.");
+        }
+        if (bindAllProjectProperties && project != null) {
+            properties.putAll(project.getProperties());
+        }
+        if (session != null) {
+            if (bindAllSessionUserProperties) {
+                properties.putAll(session.getUserProperties());
+            } else if (bindAllProjectProperties && bindSessionUserOverrideProperties && project != null) {
+                for (Object key : project.getProperties().keySet()) {
+                    if (session.getUserProperties().get(key) != null) {
+                        properties.put(key, session.getUserProperties().get(key));
+                    }
+                }
+            }
         }
     }
 
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AddSourcesMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AddSourcesMojo.java
index 2f35c90..a436c60 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AddSourcesMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AddSourcesMojo.java
@@ -55,7 +55,9 @@ public class AddSourcesMojo extends AbstractGroovySourcesMojo {
      */
     protected void addSourcePath(final String path) {
         if (!project.getCompileSourceRoots().contains(path)) {
-            getLog().debug("Added source directory: " + path);
+            if (getLog().isDebugEnabled()) {
+                getLog().debug("Added source directory: " + path);
+            }
             project.addCompileSourceRoot(path);
         }
     }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AddStubSourcesMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AddStubSourcesMojo.java
index 1bd1f33..6cc4063 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AddStubSourcesMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AddStubSourcesMojo.java
@@ -42,7 +42,9 @@ public class AddStubSourcesMojo extends AbstractGroovyStubSourcesMojo {
      */
     @Override
     public void execute() {
-        getLog().debug("Added stub directory " + stubsOutputDirectory.getAbsolutePath() + " to project sources.");
+        if (getLog().isDebugEnabled()) {
+            getLog().debug("Added stub directory " + stubsOutputDirectory.getAbsolutePath() + " to project sources.");
+        }
         project.addCompileSourceRoot(stubsOutputDirectory.getAbsolutePath());
     }
 
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AddTestSourcesMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AddTestSourcesMojo.java
index a700b36..3684961 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AddTestSourcesMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AddTestSourcesMojo.java
@@ -55,7 +55,9 @@ public class AddTestSourcesMojo extends AbstractGroovySourcesMojo {
      */
     protected void addTestSourcePath(final String path) {
         if (!project.getTestCompileSourceRoots().contains(path)) {
-            getLog().debug("Added test source directory: " + path);
+            if (getLog().isDebugEnabled()) {
+                getLog().debug("Added test source directory: " + path);
+            }
             project.addTestCompileSourceRoot(path);
         }
     }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/AddTestStubSourcesMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/AddTestStubSourcesMojo.java
index fa2960e..7221a87 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/AddTestStubSourcesMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/AddTestStubSourcesMojo.java
@@ -49,7 +49,9 @@ public class AddTestStubSourcesMojo extends AbstractGroovyStubSourcesMojo {
     @Override
     public void execute() {
         if (!skipTests) {
-            getLog().debug("Added test stub directory " + testStubsOutputDirectory.getAbsolutePath() + " to project test sources.");
+            if (getLog().isDebugEnabled()) {
+                getLog().debug("Added test stub directory " + testStubsOutputDirectory.getAbsolutePath() + " to project test sources.");
+            }
             project.addTestCompileSourceRoot(testStubsOutputDirectory.getAbsolutePath());
         }
     }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/CompileMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/CompileMojo.java
index 21f702a..f8eb3f9 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/CompileMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/CompileMojo.java
@@ -36,8 +36,7 @@ import java.net.MalformedURLException;
  * @author Keegan Witt
  * @since 1.0-beta-1
  */
-@Mojo(name = "compile", defaultPhase = LifecyclePhase.COMPILE, requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true,
-        configurator = "include-project-compile-dependencies")
+@Mojo(name = "compile", defaultPhase = LifecyclePhase.COMPILE, requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true)
 public class CompileMojo extends AbstractCompileMojo {
 
     /**
@@ -62,7 +61,9 @@ public class CompileMojo extends AbstractCompileMojo {
     public void execute() throws MojoExecutionException {
         try {
             try {
-                getLog().debug("Project compile classpath:\n" + project.getCompileClasspathElements());
+                if (getLog().isDebugEnabled()) {
+                    getLog().debug("Project compile classpath:\n" + project.getCompileClasspathElements());
+                }
             } catch (DependencyResolutionRequiredException e) {
                 getLog().debug("Unable to log project compile classpath");
             }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/CompileTestsMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/CompileTestsMojo.java
index 5644260..3c9106a 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/CompileTestsMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/CompileTestsMojo.java
@@ -36,8 +36,7 @@ import java.net.MalformedURLException;
  * @author Keegan Witt
  * @since 1.0-beta-1
  */
-@Mojo(name = "compileTests", defaultPhase = LifecyclePhase.TEST_COMPILE, requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true,
-        configurator = "include-project-test-dependencies")
+@Mojo(name = "compileTests", defaultPhase = LifecyclePhase.TEST_COMPILE, requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true)
 public class CompileTestsMojo extends AbstractCompileMojo {
 
     /**
@@ -69,7 +68,9 @@ public class CompileTestsMojo extends AbstractCompileMojo {
         if (!skipTests) {
             try {
                 try {
-                    getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+                    if (getLog().isDebugEnabled()) {
+                        getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+                    }
                 } catch (DependencyResolutionRequiredException e) {
                     getLog().debug("Unable to log project test classpath");
                 }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/ConsoleMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/ConsoleMojo.java
index 19ec3fe..4631b46 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/ConsoleMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/ConsoleMojo.java
@@ -20,9 +20,11 @@ import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
 import org.apache.maven.plugins.annotations.Mojo;
+import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
 import org.codehaus.gmavenplus.util.NoExitSecurityManager;
 
+import java.io.File;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.MalformedURLException;
@@ -36,18 +38,27 @@ import static org.codehaus.gmavenplus.util.ReflectionUtils.*;
  * Note that this mojo requires Groovy &gt;= 1.5.0.
  * Note that it references the plugin classloader to pull in dependencies Groovy didn't include
  * (for things like Ant for AntBuilder, Ivy for @grab, and Jansi for Groovysh).
+ * Note that using the <code>ant</code> property requires Java 8, as the included Ant version was compiled for Java 8.
  *
  * @author Keegan Witt
  * @since 1.1
  */
-@Mojo(name = "console", requiresDependencyResolution = ResolutionScope.TEST, configurator = "include-project-test-dependencies")
+@Mojo(name = "console", requiresDependencyResolution = ResolutionScope.TEST)
 public class ConsoleMojo extends AbstractToolsMojo {
 
+    /**
+     * Script file to load into console. Can also be a project property referring to a file.
+     *
+     * @since 1.10.1
+     */
+    @Parameter(property = "consoleScript")
+    protected String consoleScript;
+
     /**
      * Executes this mojo.
      *
      * @throws MojoExecutionException If an unexpected problem occurs (causes a "BUILD ERROR" message to be displayed)
-     * @throws MojoFailureException If unable to await console exit
+     * @throws MojoFailureException   If unable to await console exit
      */
     @Override
     public void execute() throws MojoExecutionException, MojoFailureException {
@@ -63,7 +74,9 @@ public class ConsoleMojo extends AbstractToolsMojo {
         classWrangler.logGroovyVersion(mojoExecution.getMojoDescriptor().getGoal());
 
         try {
-            getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+            if (getLog().isDebugEnabled()) {
+                getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+            }
         } catch (DependencyResolutionRequiredException e) {
             getLog().debug("Unable to log project test classpath");
         }
@@ -93,6 +106,9 @@ public class ConsoleMojo extends AbstractToolsMojo {
                 // TODO: for some reason instantiating AntBuilder before calling run() causes its stdout and stderr streams to not be captured by the Console
                 bindAntBuilder(consoleClass, bindingClass, console);
 
+                // open script file
+                loadScript(consoleClass, console);
+
                 // wait for console to be closed
                 waitForConsoleClose();
             } catch (ClassNotFoundException e) {
@@ -117,6 +133,29 @@ public class ConsoleMojo extends AbstractToolsMojo {
         }
     }
 
+    protected void loadScript(Class<?> consoleClass, Object console) throws InvocationTargetException, IllegalAccessException {
+        if (consoleScript != null) {
+            Method loadScriptFile = findMethod(consoleClass, "loadScriptFile", File.class);
+            File consoleScriptFile = new File(consoleScript);
+            if (consoleScriptFile.isFile()) {
+                invokeMethod(loadScriptFile, console, consoleScriptFile);
+            } else if (project.getProperties().containsKey(consoleScript)) {
+                consoleScriptFile = new File(project.getProperties().getProperty(consoleScript));
+                if (consoleScriptFile.isFile()) {
+                    invokeMethod(loadScriptFile, console, consoleScriptFile);
+                } else {
+                    if (getLog().isWarnEnabled()) {
+                        getLog().warn("consoleScript ('" + consoleScript + "') doesn't exist in project properties or as a file.");
+                    }
+                }
+            } else {
+                if (getLog().isWarnEnabled()) {
+                    getLog().warn("consoleScript ('" + consoleScript + "') doesn't exist in project properties or as a file.");
+                }
+            }
+        }
+    }
+
     /**
      * Instantiates a groovy.ui.Console object.
      *
@@ -124,8 +163,8 @@ public class ConsoleMojo extends AbstractToolsMojo {
      * @param bindingClass the groovy.lang.Binding class to use
      * @return a new groovy.ui.Console object
      * @throws InvocationTargetException when a reflection invocation needed for instantiating a console object cannot be completed
-     * @throws IllegalAccessException when a method needed for instantiating a console object cannot be accessed
-     * @throws InstantiationException when a class needed for instantiating a console object cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for instantiating a console object cannot be accessed
+     * @throws InstantiationException    when a class needed for instantiating a console object cannot be instantiated
      */
     protected Object setupConsole(final Class<?> consoleClass, final Class<?> bindingClass) throws InvocationTargetException, IllegalAccessException, InstantiationException {
         Object binding = invokeConstructor(findConstructor(bindingClass));
@@ -139,7 +178,7 @@ public class ConsoleMojo extends AbstractToolsMojo {
             invokeMethod(setVariable, binding, "properties", properties);
         }
 
-        return invokeConstructor(findConstructor(consoleClass, ClassLoader.class, bindingClass), Thread.currentThread().getContextClassLoader(), binding);
+        return invokeConstructor(findConstructor(consoleClass, ClassLoader.class, bindingClass), classWrangler.getClassLoader(), binding);
     }
 
     /**
@@ -147,32 +186,35 @@ public class ConsoleMojo extends AbstractToolsMojo {
      *
      * @param consoleClass the groovy.ui.Console class to use
      * @param bindingClass the groovy.lang.Binding class to use
-     * @param console the groovy.ui.Console object to use
-     * @throws ClassNotFoundException when a class needed for binding an AntBuilder object cannot be found
-     * @throws IllegalAccessException when a method needed for binding an AntBuilder object cannot be accessed
+     * @param console      the groovy.ui.Console object to use
+     * @throws ClassNotFoundException    when a class needed for binding an AntBuilder object cannot be found
+     * @throws IllegalAccessException    when a method needed for binding an AntBuilder object cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for binding an AntBuilder object cannot be completed
-     * @throws InstantiationException when a class needed for binding an AntBuilder object cannot be instantiated
      */
-    protected void bindAntBuilder(Class<?> consoleClass, Class<?> bindingClass, Object console) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {
+    protected void bindAntBuilder(Class<?> consoleClass, Class<?> bindingClass, Object console) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException {
         if (properties.containsKey("ant")) {
             Class<?> groovyShellClass = classWrangler.getClass("groovy.lang.GroovyShell");
             Object shell = getField(findField(consoleClass, "shell", groovyShellClass), console);
             Object binding = invokeMethod(findMethod(groovyShellClass, "getContext"), shell);
+            Object antBuilder = null;
             try {
-                Object antBuilder = invokeConstructor(findConstructor(classWrangler.getClass("groovy.util.AntBuilder")));
+                antBuilder = invokeConstructor(findConstructor(classWrangler.getClass("groovy.ant.AntBuilder")));
+            } catch (ClassNotFoundException e1) {
+                getLog().debug("groovy.ant.AntBuilder not available, trying groovy.util.AntBuilder.");
+                try {
+                    antBuilder = invokeConstructor(findConstructor(classWrangler.getClass("groovy.util.AntBuilder")));
+                } catch (ClassNotFoundException | IllegalAccessException | InvocationTargetException | InstantiationException e2) {
+                    logUnableToInitializeAntBuilder(e2);
+                }
+            } catch (IllegalAccessException | InstantiationException | InvocationTargetException e) {
+                logUnableToInitializeAntBuilder(e);
+            }
+            if (antBuilder != null) {
                 if (bindPropertiesToSeparateVariables) {
                     invokeMethod(findMethod(bindingClass, "setVariable", String.class, Object.class), binding, "ant", antBuilder);
                 } else {
                     properties.put("ant", antBuilder);
                 }
-            } catch (InvocationTargetException e) {
-                logUnableToInitializeAntBuilder(e);
-            } catch (IllegalAccessException e) {
-                logUnableToInitializeAntBuilder(e);
-            } catch (InstantiationException e) {
-                logUnableToInitializeAntBuilder(e);
-            } catch (ClassNotFoundException e) {
-                logUnableToInitializeAntBuilder(e);
             }
         }
     }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/ExecuteMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/ExecuteMojo.java
index be8c7fc..9c195de 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/ExecuteMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/ExecuteMojo.java
@@ -21,7 +21,7 @@ import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.FileUtils;
 import org.codehaus.gmavenplus.util.NoExitSecurityManager;
 
@@ -43,7 +43,7 @@ import static org.codehaus.gmavenplus.util.ReflectionUtils.*;
  * @author Keegan Witt
  * @since 1.0-beta-1
  */
-@Mojo(name = "execute", requiresDependencyResolution = ResolutionScope.TEST, configurator = "include-project-test-dependencies", threadSafe = true)
+@Mojo(name = "execute", requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true)
 public class ExecuteMojo extends AbstractToolsMojo {
 
     /**
@@ -52,7 +52,8 @@ public class ExecuteMojo extends AbstractToolsMojo {
     protected static final Version GROOVY_1_7_0 = new Version(1, 7, 0);
 
     /**
-     * Groovy scripts to run (in order). Can be an actual Groovy script or a {@link java.net.URL URL} to a Groovy script (local or remote).
+     * Groovy scripts to run (in order). Can be a script body, a {@link java.net.URL URL} to a script
+     * (local or remote), or a filename.
      */
     @Parameter(required = true)
     protected String[] scripts;
@@ -71,6 +72,14 @@ public class ExecuteMojo extends AbstractToolsMojo {
     @Parameter(defaultValue = "${project.build.sourceEncoding}")
     protected String sourceEncoding;
 
+    /**
+     * Flag to allow script execution to be skipped.
+     *
+     * @since 1.9.1
+     */
+    @Parameter(defaultValue = "false")
+    protected boolean skipScriptExecution;
+
     /**
      * Executes this mojo.
      *
@@ -87,6 +96,11 @@ public class ExecuteMojo extends AbstractToolsMojo {
      * @throws MojoExecutionException If an unexpected problem occurs (causes a "BUILD ERROR" message to be displayed)
      */
     protected synchronized void doExecute() throws MojoExecutionException {
+        if (skipScriptExecution) {
+            getLog().info("Skipping script execution because ${skipScriptExecution} was set to true.");
+            return;
+        }
+
         if (scripts == null || scripts.length == 0) {
             getLog().info("No scripts specified for execution. Skipping.");
             return;
@@ -104,7 +118,9 @@ public class ExecuteMojo extends AbstractToolsMojo {
         classWrangler.logGroovyVersion(mojoExecution.getMojoDescriptor().getGoal());
 
         try {
-            getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+            if (getLog().isDebugEnabled()) {
+                getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+            }
         } catch (DependencyResolutionRequiredException e) {
             getLog().debug("Unable to log project test classpath");
         }
@@ -148,9 +164,9 @@ public class ExecuteMojo extends AbstractToolsMojo {
      * @param groovyShellClass the groovy.lang.GroovyShell class
      * @return a new groovy.lang.GroovyShell object
      * @throws InvocationTargetException when a reflection invocation needed for shell configuration cannot be completed
-     * @throws IllegalAccessException when a method needed for shell configuration cannot be accessed
-     * @throws InstantiationException when a class needed for shell configuration cannot be instantiated
-     * @throws ClassNotFoundException when a class needed for shell configuration cannot be found
+     * @throws IllegalAccessException    when a method needed for shell configuration cannot be accessed
+     * @throws InstantiationException    when a class needed for shell configuration cannot be instantiated
+     * @throws ClassNotFoundException    when a class needed for shell configuration cannot be found
      */
     protected Object setupShell(final Class<?> groovyShellClass) throws InvocationTargetException, IllegalAccessException, InstantiationException, ClassNotFoundException {
         Object shell;
@@ -158,9 +174,9 @@ public class ExecuteMojo extends AbstractToolsMojo {
             Class<?> compilerConfigurationClass = classWrangler.getClass("org.codehaus.groovy.control.CompilerConfiguration");
             Object compilerConfiguration = invokeConstructor(findConstructor(compilerConfigurationClass));
             invokeMethod(findMethod(compilerConfigurationClass, "setSourceEncoding", String.class), compilerConfiguration, sourceEncoding);
-            shell = invokeConstructor(findConstructor(groovyShellClass, compilerConfigurationClass), compilerConfiguration);
+            shell = invokeConstructor(findConstructor(groovyShellClass, ClassLoader.class, compilerConfigurationClass), classWrangler.getClassLoader(), compilerConfiguration);
         } else {
-            shell = invokeConstructor(findConstructor(groovyShellClass));
+            shell = invokeConstructor(findConstructor(groovyShellClass, ClassLoader.class), classWrangler.getClassLoader());
         }
         initializeProperties();
         Method setProperty = findMethod(groovyShellClass, "setProperty", String.class, Object.class);
@@ -179,10 +195,10 @@ public class ExecuteMojo extends AbstractToolsMojo {
      * Executes the configured scripts.
      *
      * @param groovyShellClass the groovy.lang.GroovyShell class
-     * @param shell a groovy.lag.GroovyShell object
+     * @param shell            a groovy.lag.GroovyShell object
      * @throws InvocationTargetException when a reflection invocation needed for script execution cannot be completed
-     * @throws IllegalAccessException when a method needed for script execution cannot be accessed
-     * @throws MojoExecutionException when an exception occurred during script execution (causes a "BUILD ERROR" message to be displayed)
+     * @throws IllegalAccessException    when a method needed for script execution cannot be accessed
+     * @throws MojoExecutionException    when an exception occurred during script execution (causes a "BUILD ERROR" message to be displayed)
      */
     protected void executeScripts(final Class<?> groovyShellClass, final Object shell) throws InvocationTargetException, IllegalAccessException, MojoExecutionException {
         int scriptNum = 1;
@@ -196,7 +212,9 @@ public class ExecuteMojo extends AbstractToolsMojo {
                     // it's not a URL to a script, try as a filename
                     File scriptFile = new File(script);
                     if (scriptFile.isFile()) {
-                        getLog().info("Running Groovy script from " + scriptFile.getCanonicalPath() + ".");
+                        if (getLog().isInfoEnabled()) {
+                            getLog().info("Running Groovy script from " + scriptFile.getCanonicalPath() + ".");
+                        }
                         Method evaluateFile = findMethod(groovyShellClass, "evaluate", File.class);
                         invokeMethod(evaluateFile, shell, scriptFile);
                     } else {
@@ -220,15 +238,17 @@ public class ExecuteMojo extends AbstractToolsMojo {
      * Executes a script at a URL location.
      *
      * @param groovyShellClass the GroovyShell class
-     * @param shell a groovy.lag.GroovyShell object
-     * @param script the script URL to execute
-     * @throws IOException when the stream can't be opened on the URL
+     * @param shell            a groovy.lag.GroovyShell object
+     * @param script           the script URL to execute
+     * @throws IOException               when the stream can't be opened on the URL
      * @throws InvocationTargetException when a reflection invocation needed for script execution cannot be completed
-     * @throws IllegalAccessException when a method needed for script execution cannot be accessed
+     * @throws IllegalAccessException    when a method needed for script execution cannot be accessed
      */
     protected void executeScriptFromUrl(Class<?> groovyShellClass, Object shell, String script) throws IOException, InvocationTargetException, IllegalAccessException {
         URL url = new URL(script);
-        getLog().info("Running Groovy script from " + url + ".");
+        if (getLog().isInfoEnabled()) {
+            getLog().info("Running Groovy script from " + url + ".");
+        }
         if (groovyAtLeast(GROOVY_1_7_0)) {
             Method evaluateUrlWithReader = findMethod(groovyShellClass, "evaluate", Reader.class);
             BufferedReader reader = null;
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojo.java
index 22d7dc5..2ee2f24 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojo.java
@@ -36,8 +36,7 @@ import java.net.MalformedURLException;
  * @author Keegan Witt
  * @since 1.0-beta-1
  */
-@Mojo(name = "generateStubs", defaultPhase = LifecyclePhase.GENERATE_SOURCES, requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true,
-        configurator = "include-project-compile-dependencies")
+@Mojo(name = "generateStubs", defaultPhase = LifecyclePhase.GENERATE_SOURCES, requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true)
 public class GenerateStubsMojo extends AbstractGenerateStubsMojo {
 
     /**
@@ -64,7 +63,9 @@ public class GenerateStubsMojo extends AbstractGenerateStubsMojo {
 
         try {
             try {
-                getLog().debug("Project compile classpath:\n" + project.getCompileClasspathElements());
+                if (getLog().isDebugEnabled()) {
+                    getLog().debug("Project compile classpath:\n" + project.getCompileClasspathElements());
+                }
             } catch (DependencyResolutionRequiredException e) {
                 getLog().debug("Unable to log project compile classpath");
             }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/GenerateTestStubsMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/GenerateTestStubsMojo.java
index 87dae0d..6677a98 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/GenerateTestStubsMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/GenerateTestStubsMojo.java
@@ -36,8 +36,7 @@ import java.net.MalformedURLException;
  * @author Keegan Witt
  * @since 1.0-beta-1
  */
-@Mojo(name = "generateTestStubs", defaultPhase = LifecyclePhase.GENERATE_TEST_SOURCES, requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true,
-        configurator = "include-project-test-dependencies")
+@Mojo(name = "generateTestStubs", defaultPhase = LifecyclePhase.GENERATE_TEST_SOURCES, requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true)
 public class GenerateTestStubsMojo extends AbstractGenerateStubsMojo {
 
     /**
@@ -70,7 +69,9 @@ public class GenerateTestStubsMojo extends AbstractGenerateStubsMojo {
             minGroovyVersion = GROOVY_1_8_2;
             try {
                 try {
-                    getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+                    if (getLog().isDebugEnabled()) {
+                        getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+                    }
                 } catch (DependencyResolutionRequiredException e) {
                     getLog().debug("Unable to log project test classpath");
                 }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocJarMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocJarMojo.java
index f1d129f..7baeb1d 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocJarMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocJarMojo.java
@@ -38,8 +38,7 @@ import java.io.IOException;
  * @author Keegan Witt
  * @since 1.7.1
  */
-@Mojo(name = "groovydoc-jar", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true,
-        configurator = "include-project-compile-dependencies")
+@Mojo(name = "groovydoc-jar", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true)
 public class GroovyDocJarMojo extends GroovyDocMojo {
 
     /**
@@ -66,7 +65,7 @@ public class GroovyDocJarMojo extends GroovyDocMojo {
      * See <a href="http://maven.apache.org/shared/maven-archiver/index.html">Maven Archiver Reference</a>.
      */
     @Parameter
-    protected MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+    protected final MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
 
     /**
      * Specifies whether to attach the generated artifact to the project helper.
@@ -96,9 +95,17 @@ public class GroovyDocJarMojo extends GroovyDocMojo {
     /**
      * The classifier for the GroovyDoc jar.
      */
-    @Parameter(defaultValue = "groovydoc", required = true)
+    @Parameter(defaultValue = "groovydoc")
     private String classifier;
 
+    /**
+     * The artifact type for the GroovyDoc jar.
+     *
+     * @since 1.10.0
+     */
+    @Parameter(defaultValue = "javadoc")
+    private String artifactType;
+
     /**
      * Whether to invoke the <code>groovydoc</code> goal before creating jar.
      */
@@ -111,17 +118,17 @@ public class GroovyDocJarMojo extends GroovyDocMojo {
     @Override
     public void execute() throws MojoExecutionException {
         if (invokeGroovyDoc) {
-            // generate the GroovyDoc
+            // invoke the GroovyDoc mojo
             super.execute();
         }
 
         try {
             File outputFile = generateArchive(groovyDocOutputDirectory, finalName + "-" + classifier + ".jar");
 
-            if (!attach) {
-                getLog().info("NOT adding GroovyDoc to attached artifacts list.");
+            if (attach) {
+                projectHelper.attachArtifact(project, artifactType, classifier, outputFile);
             } else {
-                projectHelper.attachArtifact(project, "groovydoc", classifier, outputFile);
+                getLog().info("Not adding GroovyDoc jar to attached artifacts list.");
             }
         } catch (ArchiverException e) {
             throw new MojoExecutionException("ArchiverException: Error while creating archive", e);
@@ -136,10 +143,10 @@ public class GroovyDocJarMojo extends GroovyDocMojo {
      * Method that creates the jar file
      *
      * @param groovydocFiles the directory where the generated jar file will be put
-     * @param jarFileName the filename of the generated jar file
+     * @param jarFileName    the filename of the generated jar file
      * @return a File object that contains the generated jar file
-     * @throws ArchiverException {@link ArchiverException}
-     * @throws IOException {@link IOException}
+     * @throws ArchiverException When an issue occurs preventing Maven Archiver from creating the jar file
+     * @throws IOException       When an IO issue occurs preventing Maven Archiver from creating the jar file
      */
     protected File generateArchive(File groovydocFiles, String jarFileName) throws ArchiverException, IOException {
         File groovydocJar = new File(jarOutputDirectory, jarFileName);
@@ -159,7 +166,9 @@ public class GroovyDocJarMojo extends GroovyDocMojo {
         }
 
         if (useDefaultManifestFile && defaultManifestFile.exists() && archive.getManifestFile() == null) {
-            getLog().info("Adding existing MANIFEST to archive. Found under: " + defaultManifestFile.getPath());
+            if (getLog().isInfoEnabled()) {
+                getLog().info("Adding existing MANIFEST to archive. Found under: " + defaultManifestFile.getPath());
+            }
             archive.setManifestFile(defaultManifestFile);
         }
 
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocMojo.java
index 2d18e0d..bd3dc8d 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocMojo.java
@@ -34,7 +34,7 @@ import java.net.MalformedURLException;
  * @author Keegan Witt
  * @since 1.0-beta-1
  */
-@Mojo(name = "groovydoc", requiresDependencyResolution = ResolutionScope.RUNTIME, threadSafe = true, configurator = "include-project-compile-dependencies")
+@Mojo(name = "groovydoc", requiresDependencyResolution = ResolutionScope.RUNTIME, threadSafe = true)
 public class GroovyDocMojo extends AbstractGroovyDocMojo {
 
     /**
@@ -67,7 +67,9 @@ public class GroovyDocMojo extends AbstractGroovyDocMojo {
     public void execute() throws MojoExecutionException {
         try {
             try {
-                getLog().debug("Project compile classpath:\n" + project.getCompileClasspathElements());
+                if (getLog().isDebugEnabled()) {
+                    getLog().debug("Project compile classpath:\n" + project.getCompileClasspathElements());
+                }
             } catch (DependencyResolutionRequiredException e) {
                 getLog().debug("Unable to log project compile classpath");
             }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsJarMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsJarMojo.java
index eb1178b..9a9031b 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsJarMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsJarMojo.java
@@ -38,8 +38,7 @@ import java.io.IOException;
  * @author Keegan Witt
  * @since 1.7.1
  */
-@Mojo(name = "groovydocTests-jar", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true,
-        configurator = "include-project-test-dependencies")
+@Mojo(name = "groovydocTests-jar", defaultPhase = LifecyclePhase.PACKAGE, requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true)
 public class GroovyDocTestsJarMojo extends GroovyDocTestsMojo {
 
     /**
@@ -66,7 +65,7 @@ public class GroovyDocTestsJarMojo extends GroovyDocTestsMojo {
      * See <a href="http://maven.apache.org/shared/maven-archiver/index.html">Maven Archiver Reference</a>.
      */
     @Parameter
-    protected MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
+    protected final MavenArchiveConfiguration archive = new MavenArchiveConfiguration();
 
     /**
      * Specifies whether to attach the generated artifact to the project helper.
@@ -96,9 +95,17 @@ public class GroovyDocTestsJarMojo extends GroovyDocTestsMojo {
     /**
      * The classifier for the test GroovyDoc jar.
      */
-    @Parameter(defaultValue = "test-groovydoc", required = true)
+    @Parameter(defaultValue = "test-groovydoc")
     private String testClassifier;
 
+    /**
+     * The artifact type for the test GroovyDoc jar.
+     *
+     * @since 1.10.0
+     */
+    @Parameter(defaultValue = "javadoc")
+    private String testArtifactType;
+
     /**
      * Whether to invoke the <code>groovydocTests</code> goal before creating jar.
      */
@@ -111,17 +118,17 @@ public class GroovyDocTestsJarMojo extends GroovyDocTestsMojo {
     @Override
     public void execute() throws MojoExecutionException {
         if (invokeGroovyDoc) {
-            // generate the test GroovyDoc
+            // invoke the test GroovyDoc mojo
             super.execute();
         }
 
         try {
             File outputFile = generateArchive(testGroovyDocOutputDirectory, finalName + "-" + testClassifier + ".jar");
 
-            if (!attach) {
-                getLog().info("NOT adding GroovyDoc to attached artifacts list.");
+            if (attach) {
+                projectHelper.attachArtifact(project, testArtifactType, testClassifier, outputFile);
             } else {
-                projectHelper.attachArtifact(project, "groovydoc", testClassifier, outputFile);
+                getLog().info("Not adding test GroovyDoc jar to attached artifacts list.");
             }
         } catch (ArchiverException e) {
             throw new MojoExecutionException("ArchiverException: Error while creating archive", e);
@@ -136,10 +143,10 @@ public class GroovyDocTestsJarMojo extends GroovyDocTestsMojo {
      * Method that creates the jar file
      *
      * @param groovydocFiles the directory where the generated jar file will be put
-     * @param jarFileName the filename of the generated jar file
+     * @param jarFileName    the filename of the generated jar file
      * @return a File object that contains the generated jar file
-     * @throws ArchiverException {@link ArchiverException}
-     * @throws IOException {@link IOException}
+     * @throws ArchiverException When an issue occurs preventing Maven Archiver from creating the jar file
+     * @throws IOException       When an IO issue occurs preventing Maven Archiver from creating the jar file
      */
     protected File generateArchive(File groovydocFiles, String jarFileName) throws ArchiverException, IOException {
         File groovydocJar = new File(jarOutputDirectory, jarFileName);
@@ -159,7 +166,9 @@ public class GroovyDocTestsJarMojo extends GroovyDocTestsMojo {
         }
 
         if (useDefaultManifestFile && defaultManifestFile.exists() && archive.getManifestFile() == null) {
-            getLog().info("Adding existing MANIFEST to archive. Found under: " + defaultManifestFile.getPath());
+            if (getLog().isInfoEnabled()) {
+                getLog().info("Adding existing MANIFEST to archive. Found under: " + defaultManifestFile.getPath());
+            }
             archive.setManifestFile(defaultManifestFile);
         }
 
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsMojo.java
index 8b89253..4502874 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsMojo.java
@@ -34,7 +34,7 @@ import java.net.MalformedURLException;
  * @author Keegan Witt
  * @since 1.0-beta-1
  */
-@Mojo(name = "groovydocTests", requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true, configurator = "include-project-test-dependencies")
+@Mojo(name = "groovydocTests", requiresDependencyResolution = ResolutionScope.TEST, threadSafe = true)
 public class GroovyDocTestsMojo extends AbstractGroovyDocMojo {
 
     /**
@@ -67,7 +67,9 @@ public class GroovyDocTestsMojo extends AbstractGroovyDocMojo {
     public void execute() throws MojoExecutionException {
         try {
             try {
-                getLog().debug("Project test classpath:\n" + project.getCompileClasspathElements());
+                if (getLog().isDebugEnabled()) {
+                    getLog().debug("Project test classpath:\n" + project.getCompileClasspathElements());
+                }
             } catch (DependencyResolutionRequiredException e) {
                 getLog().debug("Unable to log project tset classpath");
             }
diff --git a/src/main/java/org/codehaus/gmavenplus/mojo/ShellMojo.java b/src/main/java/org/codehaus/gmavenplus/mojo/ShellMojo.java
index 870a282..173aefa 100644
--- a/src/main/java/org/codehaus/gmavenplus/mojo/ShellMojo.java
+++ b/src/main/java/org/codehaus/gmavenplus/mojo/ShellMojo.java
@@ -21,6 +21,7 @@ import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.NoExitSecurityManager;
 
 import java.lang.reflect.InvocationTargetException;
@@ -39,9 +40,14 @@ import static org.codehaus.gmavenplus.util.ReflectionUtils.*;
  * @author Keegan Witt
  * @since 1.1
  */
-@Mojo(name = "shell", requiresDependencyResolution = ResolutionScope.TEST, configurator = "include-project-test-dependencies")
+@Mojo(name = "shell", requiresDependencyResolution = ResolutionScope.TEST)
 public class ShellMojo extends AbstractToolsMojo {
 
+    /**
+     * Groovy 4.0.0 alpha-1 version.
+     */
+    protected static final Version GROOVY_4_0_0_ALPHA1 = new Version(4, 0, 0, "alpha-1");
+
     /**
      * Groovy shell verbosity level. Should be one of:
      * <ul>
@@ -73,7 +79,9 @@ public class ShellMojo extends AbstractToolsMojo {
         classWrangler.logGroovyVersion(mojoExecution.getMojoDescriptor().getGoal());
 
         try {
-            getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+            if (getLog().isDebugEnabled()) {
+                getLog().debug("Project test classpath:\n" + project.getTestClasspathElements());
+            }
         } catch (DependencyResolutionRequiredException e) {
             getLog().debug("Unable to log project test classpath");
         }
@@ -86,7 +94,7 @@ public class ShellMojo extends AbstractToolsMojo {
                 }
 
                 // get classes we need with reflection
-                Class<?> shellClass = classWrangler.getClass("org.codehaus.groovy.tools.shell.Groovysh");
+                Class<?> shellClass = classWrangler.getClass(groovyAtLeast(GROOVY_4_0_0_ALPHA1) ? "org.apache.groovy.groovysh.Groovysh" : "org.codehaus.groovy.tools.shell.Groovysh");
                 Class<?> bindingClass = classWrangler.getClass("groovy.lang.Binding");
                 Class<?> ioClass = classWrangler.getClass("org.codehaus.groovy.tools.shell.IO");
                 Class<?> verbosityClass = classWrangler.getClass("org.codehaus.groovy.tools.shell.IO$Verbosity");
@@ -122,14 +130,14 @@ public class ShellMojo extends AbstractToolsMojo {
     /**
      * Creates the Groovysh to run.
      *
-     * @param shellClass the Groovysh class
-     * @param bindingClass the Binding class
-     * @param ioClass the IO class
+     * @param shellClass     the Groovysh class
+     * @param bindingClass   the Binding class
+     * @param ioClass        the IO class
      * @param verbosityClass the Verbosity
-     * @param loggerClass the Logger class
+     * @param loggerClass    the Logger class
      * @return the Groovysh shell to run
-     * @throws InstantiationException when a class needed for setting up a shell cannot be instantiated
-     * @throws IllegalAccessException when a method needed for setting up a shell cannot be accessed
+     * @throws InstantiationException    when a class needed for setting up a shell cannot be instantiated
+     * @throws IllegalAccessException    when a method needed for setting up a shell cannot be accessed
      * @throws InvocationTargetException when a reflection invocation needed for setting up a shell cannot be completed
      */
     protected Object setupShell(final Class<?> shellClass, final Class<?> bindingClass, final Class<?> ioClass, final Class<?> verbosityClass, final Class<?> loggerClass) throws InvocationTargetException, IllegalAccessException, InstantiationException {
@@ -147,7 +155,7 @@ public class ShellMojo extends AbstractToolsMojo {
         invokeMethod(findMethod(ioClass, "setVerbosity", verbosityClass), io, invokeStaticMethod(findMethod(verbosityClass, "forName", String.class), verbosity));
         findField(loggerClass, "io", ioClass).set(null, io);
 
-        return invokeConstructor(findConstructor(shellClass, ClassLoader.class, bindingClass, ioClass), Thread.currentThread().getContextClassLoader(), binding, io);
+        return invokeConstructor(findConstructor(shellClass, ClassLoader.class, bindingClass, ioClass), classWrangler.getClassLoader(), binding, io);
     }
 
 }
diff --git a/src/main/java/org/codehaus/gmavenplus/plexus/AbstractIncludeProjectDependenciesComponentConfigurator.java b/src/main/java/org/codehaus/gmavenplus/plexus/AbstractIncludeProjectDependenciesComponentConfigurator.java
deleted file mode 100644
index 238c8db..0000000
--- a/src/main/java/org/codehaus/gmavenplus/plexus/AbstractIncludeProjectDependenciesComponentConfigurator.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) 2011 the original author or authors.
- *
- * 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.
- */
-
-package org.codehaus.gmavenplus.plexus;
-
-//import org.apache.maven.plugin.logging.Log;
-//import org.apache.maven.plugin.logging.SystemStreamLog;
-
-import org.codehaus.gmavenplus.model.IncludeClasspath;
-import org.codehaus.plexus.component.configurator.AbstractComponentConfigurator;
-import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.configuration.PlexusConfiguration;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-
-/**
- * A custom ComponentConfigurator which adds the project's classpath elements to the plugin's ClassRealm.
- * Note that there are two method signatures for addDependenciesToClassRealm, since different versions of Maven have different expectations.
- *
- * @author <a href="http://stackoverflow.com/a/2659324/160256">Brian Jackson</a>
- * @author Keegan Witt
- * @since 1.0-beta-3
- */
-public abstract class AbstractIncludeProjectDependenciesComponentConfigurator extends AbstractComponentConfigurator {
-
-//    private static final Log LOG = new SystemStreamLog();
-
-    /**
-     * Adds the project's compile dependencies to the specified ClassRealm.
-     *
-     * @param expressionEvaluator The expression evaluator to use to get project elements
-     * @param classpath The classpath to load into the container realm
-     * @param containerRealm The ClassRealm to add dependencies to
-     * @throws ComponentConfigurationException when parsing components configuration fails
-     */
-    protected void addDependenciesToClassRealm(final ExpressionEvaluator expressionEvaluator, final Classpath classpath,
-                                               final org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm) throws ComponentConfigurationException {
-        List<?> classpathElements;
-
-        try {
-            classpathElements = (List<?>) expressionEvaluator.evaluate("${project." + classpath.toString().toLowerCase() + "ClasspathElements}");
-        } catch (ExpressionEvaluationException e) {
-            throw new ComponentConfigurationException("There was a problem evaluating: ${project." + classpath.toString().toLowerCase() + "ClasspathElements}.", e);
-        }
-
-        // add the project dependencies to the ClassRealm
-        final URL[] urls = buildURLs(classpathElements);
-        for (URL url : urls) {
-            containerRealm.addURL(url);
-        }
-    }
-
-    /**
-     * Adds the project's compile dependencies to the specified ClassRealm.
-     *
-     * @param expressionEvaluator The expression evaluator to use to get project elements
-     * @param classpath The classpath to load into the container realm
-     * @param containerRealm The ClassRealm to add dependencies to
-     * @throws ComponentConfigurationException when parsing components configuration fails
-     */
-    @SuppressWarnings("deprecation")
-    protected void addDependenciesToClassRealm(final ExpressionEvaluator expressionEvaluator, final Classpath classpath,
-                                               final org.codehaus.classworlds.ClassRealm containerRealm) throws ComponentConfigurationException {
-        List<?> classpathElements;
-
-        try {
-            classpathElements = (List<?>) expressionEvaluator.evaluate("${project." + classpath.toString().toLowerCase() + "ClasspathElements}");
-        } catch (ExpressionEvaluationException e) {
-            throw new ComponentConfigurationException("There was a problem evaluating: ${project." + classpath.toString().toLowerCase() + "ClasspathElements}.", e);
-        }
-
-        // add the project dependencies to the ClassRealm
-        final URL[] urls = buildURLs(classpathElements);
-        for (URL url : urls) {
-            containerRealm.addConstituent(url);
-        }
-    }
-
-    /**
-     * Create an array of URLs for all the elements in the classpath.
-     *
-     * @param classpathElements The classpath elements to create URLs for
-     * @return URLs for all the classpath elements
-     * @throws ComponentConfigurationException when parsing components configuration fails
-     */
-    protected URL[] buildURLs(final List<?> classpathElements) throws ComponentConfigurationException {
-        List<URL> urls = new ArrayList<URL>(classpathElements.size());
-        for (Object element : classpathElements) {
-            try {
-                final URL url = new File((String) element).toURI().toURL();
-                if (!urls.contains(url)) {
-                    urls.add(url);
-                }
-                // commented out because debug seems to be on all the time
-//                LOG.debug("Added to project class loader: " + url);
-            } catch (MalformedURLException e) {
-                throw new ComponentConfigurationException("Unable to access project dependency: " + element + ".", e);
-            }
-        }
-
-        return urls.toArray(new URL[0]);
-    }
-
-    /**
-     * Enum of the various possible classpaths.
-     */
-    protected enum Classpath {
-
-        /**
-         * Compile classpath.
-         */
-        COMPILE,
-
-        /**
-         * Runtime classpath.
-         */
-        RUNTIME,
-
-        /**
-         * Test classpath.
-         */
-        TEST,
-
-        /**
-         * System classpath.
-         */
-        SYSTEM
-    }
-
-    /**
-     * Determines whether to add project dependencies to the plugin classpath.
-     *
-     * @param configuration the PlexusConfiguration to check for the specified <code>IncludeClasspath</code> option.
-     * @return <code>true</code> if the project dependencies should be added to the plugin classpath, <code>false</code> otherwise.
-     */
-    protected boolean shouldIncludeProjectDependencies(PlexusConfiguration configuration) {
-        PlexusConfiguration includeClasspathConfig = configuration.getChild("includeClasspath");
-        String includeClasspath = includeClasspathConfig.getValue();
-        if (includeClasspath == null) {
-            includeClasspath = includeClasspathConfig.getAttribute("default-value");
-        }
-        return IncludeClasspath.PROJECT_AND_PLUGIN.equals(IncludeClasspath.valueOf(includeClasspath));
-    }
-}
diff --git a/src/main/java/org/codehaus/gmavenplus/plexus/IncludeProjectCompileDependenciesComponentConfigurator.java b/src/main/java/org/codehaus/gmavenplus/plexus/IncludeProjectCompileDependenciesComponentConfigurator.java
deleted file mode 100644
index 7cd2a0c..0000000
--- a/src/main/java/org/codehaus/gmavenplus/plexus/IncludeProjectCompileDependenciesComponentConfigurator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2013 the original author or authors.
- *
- * 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.
- */
-
-/*
- * Originally from http://stackoverflow.com/questions/2659048/add-maven-build-classpath-to-plugin-execution-classpath
- */
-
-package org.codehaus.gmavenplus.plexus;
-
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
-import org.codehaus.plexus.component.configurator.ComponentConfigurator;
-import org.codehaus.plexus.component.configurator.ConfigurationListener;
-import org.codehaus.plexus.component.configurator.converters.composite.ObjectWithFieldsConverter;
-import org.codehaus.plexus.component.configurator.converters.special.ClassRealmConverter;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.configuration.PlexusConfiguration;
-
-
-/**
- * A custom ComponentConfigurator which adds the project's compile classpath
- * elements.
- *
- * @author Brian Jackson
- * @author Keegan Witt
- * @since 1.0-beta-3
- */
-@Component(role = ComponentConfigurator.class, hint = "include-project-compile-dependencies")
-public class IncludeProjectCompileDependenciesComponentConfigurator extends AbstractIncludeProjectDependenciesComponentConfigurator {
-
-    /**
-     * Configures the specified component.
-     *
-     * @param component the Component to configure
-     * @param configuration the Configuration to use to configure the component
-     * @param expressionEvaluator the ExpressionEvaluator
-     * @param containerRealm the Classrealm to use to configure the component
-     * @param listener the component's Listener
-     * @throws ComponentConfigurationException when an exception occurs in component configuration
-     */
-    public void configureComponent(final Object component, final PlexusConfiguration configuration, final ExpressionEvaluator expressionEvaluator,
-                                   final org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm, final ConfigurationListener listener) throws ComponentConfigurationException {
-        if (shouldIncludeProjectDependencies(configuration)) {
-            addDependenciesToClassRealm(expressionEvaluator, Classpath.COMPILE, containerRealm);
-        }
-        converterLookup.registerConverter(new ClassRealmConverter(containerRealm));
-        new ObjectWithFieldsConverter().processConfiguration(converterLookup, component, containerRealm.getParentClassLoader(), configuration, expressionEvaluator, listener);
-    }
-
-    /**
-     * Configures the specified component.
-     *
-     * @param component the Component to configure
-     * @param configuration the Configuration to use to configure the component
-     * @param expressionEvaluator the ExpressionEvaluator
-     * @param containerRealm the Classrealm to use to configure the component
-     * @param listener the component's Listener
-     * @throws ComponentConfigurationException when an exception occurs in component configuration
-     */
-    @SuppressWarnings("deprecation")
-    public void configureComponent(final Object component, final PlexusConfiguration configuration, final ExpressionEvaluator expressionEvaluator,
-                                   final org.codehaus.classworlds.ClassRealm containerRealm, final ConfigurationListener listener) throws ComponentConfigurationException {
-        if (shouldIncludeProjectDependencies(configuration)) {
-            addDependenciesToClassRealm(expressionEvaluator, Classpath.COMPILE, containerRealm);
-        }
-        converterLookup.registerConverter(new ClassRealmConverter(containerRealm));
-        new ObjectWithFieldsConverter().processConfiguration(converterLookup, component, containerRealm.getClassLoader(), configuration, expressionEvaluator, listener);
-    }
-
-}
diff --git a/src/main/java/org/codehaus/gmavenplus/plexus/IncludeProjectRuntimeDependenciesComponentConfigurator.java b/src/main/java/org/codehaus/gmavenplus/plexus/IncludeProjectRuntimeDependenciesComponentConfigurator.java
deleted file mode 100644
index 7f21072..0000000
--- a/src/main/java/org/codehaus/gmavenplus/plexus/IncludeProjectRuntimeDependenciesComponentConfigurator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2013 the original author or authors.
- *
- * 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.
- */
-
-/*
- * Originally from http://stackoverflow.com/questions/2659048/add-maven-build-classpath-to-plugin-execution-classpath
- */
-
-package org.codehaus.gmavenplus.plexus;
-
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
-import org.codehaus.plexus.component.configurator.ComponentConfigurator;
-import org.codehaus.plexus.component.configurator.ConfigurationListener;
-import org.codehaus.plexus.component.configurator.converters.composite.ObjectWithFieldsConverter;
-import org.codehaus.plexus.component.configurator.converters.special.ClassRealmConverter;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.configuration.PlexusConfiguration;
-
-
-/**
- * A custom ComponentConfigurator which adds the project's runtime classpath
- * elements.
- *
- * @author Brian Jackson
- * @author Keegan Witt
- * @since 1.0-beta-3
- */
-@Component(role = ComponentConfigurator.class, hint = "include-project-runtime-dependencies")
-public class IncludeProjectRuntimeDependenciesComponentConfigurator extends AbstractIncludeProjectDependenciesComponentConfigurator {
-
-    /**
-     * Configures the specified component.
-     *
-     * @param component the Component to configure
-     * @param configuration the Configuration to use to configure the component
-     * @param expressionEvaluator the ExpressionEvaluator
-     * @param containerRealm the Classrealm to use to configure the component
-     * @param listener the component's Listener
-     * @throws ComponentConfigurationException when an exception occurs in component configuration
-     */
-    public void configureComponent(final Object component, final PlexusConfiguration configuration, final ExpressionEvaluator expressionEvaluator,
-                                   final org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm, final ConfigurationListener listener) throws ComponentConfigurationException {
-        if (shouldIncludeProjectDependencies(configuration)) {
-            addDependenciesToClassRealm(expressionEvaluator, Classpath.RUNTIME, containerRealm);
-        }
-        converterLookup.registerConverter(new ClassRealmConverter(containerRealm));
-        new ObjectWithFieldsConverter().processConfiguration(converterLookup, component, containerRealm.getParentClassLoader(), configuration, expressionEvaluator, listener);
-    }
-
-    /**
-     * Configures the specified component.
-     *
-     * @param component the Component to configure
-     * @param configuration the Configuration to use to configure the component
-     * @param expressionEvaluator the ExpressionEvaluator
-     * @param containerRealm the Classrealm to use to configure the component
-     * @param listener the component's Listener
-     * @throws ComponentConfigurationException when an exception occurs in component configuration
-     */
-    @SuppressWarnings("deprecation")
-    public void configureComponent(final Object component, final PlexusConfiguration configuration, final ExpressionEvaluator expressionEvaluator,
-                                   final org.codehaus.classworlds.ClassRealm containerRealm, final ConfigurationListener listener) throws ComponentConfigurationException {
-        if (shouldIncludeProjectDependencies(configuration)) {
-            addDependenciesToClassRealm(expressionEvaluator, Classpath.RUNTIME, containerRealm);
-        }
-        converterLookup.registerConverter(new ClassRealmConverter(containerRealm));
-        new ObjectWithFieldsConverter().processConfiguration(converterLookup, component, containerRealm.getClassLoader(), configuration, expressionEvaluator, listener);
-    }
-
-}
diff --git a/src/main/java/org/codehaus/gmavenplus/plexus/IncludeProjectTestDependenciesComponentConfigurator.java b/src/main/java/org/codehaus/gmavenplus/plexus/IncludeProjectTestDependenciesComponentConfigurator.java
deleted file mode 100644
index a980ec2..0000000
--- a/src/main/java/org/codehaus/gmavenplus/plexus/IncludeProjectTestDependenciesComponentConfigurator.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright 2013 the original author or authors.
- *
- * 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.
- */
-
-/*
- * Originally from http://stackoverflow.com/questions/2659048/add-maven-build-classpath-to-plugin-execution-classpath
- */
-
-package org.codehaus.gmavenplus.plexus;
-
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
-import org.codehaus.plexus.component.configurator.ComponentConfigurator;
-import org.codehaus.plexus.component.configurator.ConfigurationListener;
-import org.codehaus.plexus.component.configurator.converters.composite.ObjectWithFieldsConverter;
-import org.codehaus.plexus.component.configurator.converters.special.ClassRealmConverter;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.configuration.PlexusConfiguration;
-
-
-/**
- * A custom ComponentConfigurator which adds the project's test classpath
- * elements.
- *
- * @author Brian Jackson
- * @author Keegan Witt
- * @since 1.0-beta-3
- */
-@Component(role = ComponentConfigurator.class, hint = "include-project-test-dependencies")
-public class IncludeProjectTestDependenciesComponentConfigurator extends AbstractIncludeProjectDependenciesComponentConfigurator {
-
-    /**
-     * Configures the specified component.
-     *
-     * @param component the Component to configure
-     * @param configuration the Configuration to use to configure the component
-     * @param expressionEvaluator the ExpressionEvaluator
-     * @param containerRealm the Classrealm to use to configure the component
-     * @param listener the component's Listener
-     * @throws ComponentConfigurationException when an exception occurs in component configuration
-     */
-    public void configureComponent(final Object component, final PlexusConfiguration configuration, final ExpressionEvaluator expressionEvaluator,
-                                   final org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm, final ConfigurationListener listener) throws ComponentConfigurationException {
-        if (shouldIncludeProjectDependencies(configuration)) {
-            addDependenciesToClassRealm(expressionEvaluator, Classpath.TEST, containerRealm);
-        }
-        converterLookup.registerConverter(new ClassRealmConverter(containerRealm));
-        new ObjectWithFieldsConverter().processConfiguration(converterLookup, component, containerRealm.getParentClassLoader(), configuration, expressionEvaluator, listener);
-    }
-
-    /**
-     * Configures the specified component.
-     *
-     * @param component the Component to configure
-     * @param configuration the Configuration to use to configure the component
-     * @param expressionEvaluator the ExpressionEvaluator
-     * @param containerRealm the Classrealm to use to configure the component
-     * @param listener the component's Listener
-     * @throws ComponentConfigurationException when an exception occurs in component configuration
-     */
-    @SuppressWarnings("deprecation")
-    public void configureComponent(final Object component, final PlexusConfiguration configuration, final ExpressionEvaluator expressionEvaluator,
-                                   final org.codehaus.classworlds.ClassRealm containerRealm, final ConfigurationListener listener) throws ComponentConfigurationException {
-        if (shouldIncludeProjectDependencies(configuration)) {
-            addDependenciesToClassRealm(expressionEvaluator, Classpath.TEST, containerRealm);
-        }
-        converterLookup.registerConverter(new ClassRealmConverter(containerRealm));
-        new ObjectWithFieldsConverter().processConfiguration(converterLookup, component, containerRealm.getClassLoader(), configuration, expressionEvaluator, listener);
-    }
-
-}
diff --git a/src/main/java/org/codehaus/gmavenplus/util/ClassWrangler.java b/src/main/java/org/codehaus/gmavenplus/util/ClassWrangler.java
index 5d2db55..b62f679 100644
--- a/src/main/java/org/codehaus/gmavenplus/util/ClassWrangler.java
+++ b/src/main/java/org/codehaus/gmavenplus/util/ClassWrangler.java
@@ -17,7 +17,7 @@
 package org.codehaus.gmavenplus.util;
 
 import org.apache.maven.plugin.logging.Log;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 
 import java.io.File;
 import java.lang.reflect.InvocationTargetException;
@@ -53,35 +53,24 @@ public class ClassWrangler {
     /**
      * ClassLoader to use for class wrangling.
      */
-    private ClassLoader classLoader;
+    private final ClassLoader classLoader;
 
     /**
      * Plugin log.
      */
-    private Log log;
+    private final Log log;
 
     /**
-     * Creates a new ClassWrangler using the specified ClassLoader.
+     * Creates a new ClassWrangler using the specified parent ClassLoader, loaded with the items from the specified classpath.
      *
-     * @param classLoaderForLoading the ClassLoader to use to load classes
-     * @param pluginLog the Maven log to use for logging
-     */
-    public ClassWrangler(final ClassLoader classLoaderForLoading, final Log pluginLog) {
-        log = pluginLog;
-        classLoader = classLoaderForLoading;
-    }
-
-    /**
-     * Creates a new ClassWrangler using a new ClassLoader, loaded with the items from the specified classpath.
-     *
-     * @param classpath the classpath to load the new ClassLoader with
-     * @param pluginLog the Maven log to use for logging
+     * @param classpath         the classpath to load the new ClassLoader with
+     * @param parentClassLoader the parent for the new ClassLoader used to use to load classes
+     * @param pluginLog         the Maven log to use for logging
      * @throws MalformedURLException when a classpath element provides a malformed URL
      */
-    public ClassWrangler(final List<?> classpath, final Log pluginLog) throws MalformedURLException {
+    public ClassWrangler(final List<?> classpath, final ClassLoader parentClassLoader, final Log pluginLog) throws MalformedURLException {
         log = pluginLog;
-        // create an isolated ClassLoader with all the appropriate project dependencies in it
-        classLoader = createNewClassLoader(classpath);
+        classLoader = createNewClassLoader(classpath, parentClassLoader);
         Thread.currentThread().setContextClassLoader(classLoader);
     }
 
@@ -99,13 +88,7 @@ public class ClassWrangler {
                 if (ver != null && ver.length() > 0) {
                     groovyVersion = ver;
                 }
-            } catch (ClassNotFoundException e) {
-                // do nothing, will try another way
-            } catch (IllegalAccessException e) {
-                // do nothing, will try another way
-            } catch (InvocationTargetException e) {
-                // do nothing, will try another way
-            } catch (IllegalArgumentException e) {
+            } catch (ClassNotFoundException | IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
                 // do nothing, will try another way
             }
 
@@ -118,13 +101,7 @@ public class ClassWrangler {
                     if (ver != null && ver.length() > 0) {
                         groovyVersion = ver;
                     }
-                } catch (ClassNotFoundException e) {
-                    // do nothing, will try another way
-                } catch (IllegalAccessException e) {
-                    // do nothing, will try another way
-                } catch (InvocationTargetException e) {
-                    // do nothing, will try another way
-                } catch (IllegalArgumentException e) {
+                } catch (ClassNotFoundException | IllegalArgumentException | InvocationTargetException | IllegalAccessException e) {
                     // do nothing, will try another way
                 }
             }
@@ -164,15 +141,14 @@ public class ClassWrangler {
         try {
             return Version.parseFromString(getGroovyVersionString());
         } catch (Exception e) {
-            log.error("Unable to determine Groovy version. Is Groovy declared as a dependency?");
-            return null;
+            throw new RuntimeException("Unable to determine Groovy version. Is Groovy declared as a dependency?");
         }
     }
 
     /**
      * Determines whether the detected Groovy version is the specified version or newer.
      *
-     * @param detectedVersion the detected Groovy version
+     * @param detectedVersion  the detected Groovy version
      * @param compareToVersion the version to compare the detected Groovy version to
      * @return <code>true</code> if the detected Groovy version is the specified version or newer, <code>false</code> otherwise
      */
@@ -183,7 +159,7 @@ public class ClassWrangler {
     /**
      * Determines whether the detected Groovy version is the specified version.
      *
-     * @param detectedVersion the detected Groovy version
+     * @param detectedVersion  the detected Groovy version
      * @param compareToVersion the version to compare the detected Groovy version to
      * @return <code>true</code> if the detected Groovy version is the specified version, <code>false</code> otherwise
      */
@@ -194,7 +170,7 @@ public class ClassWrangler {
     /**
      * Determines whether the detected Groovy version is newer than the specified version.
      *
-     * @param detectedVersion the detected Groovy version
+     * @param detectedVersion  the detected Groovy version
      * @param compareToVersion the version to compare the detected Groovy version to
      * @return <code>true</code> if the detected Groovy version is newer than the specified version, <code>false</code> otherwise
      */
@@ -205,7 +181,7 @@ public class ClassWrangler {
     /**
      * Determines whether the detected Groovy version is older than the specified version.
      *
-     * @param detectedVersion the detected Groovy version
+     * @param detectedVersion  the detected Groovy version
      * @param compareToVersion the version to compare the detected Groovy version to
      * @return <code>true</code> if the detected Groovy version is older than the specified version, <code>false</code> otherwise
      */
@@ -217,15 +193,20 @@ public class ClassWrangler {
      * Gets whether the version of Groovy on the classpath supports invokedynamic.
      *
      * @return <code>true</code> if the version of Groovy uses invokedynamic,
-     *         <code>false</code> if not or Groovy dependency cannot be found.
+     * <code>false</code> if not or Groovy dependency cannot be found.
      */
     public boolean isGroovyIndy() {
         if (isIndy == null) {
             try {
-                getClass("org.codehaus.groovy.vmplugin.v7.IndyInterface");
+                getClass("org.codehaus.groovy.vmplugin.v8.IndyInterface");
                 isIndy = true;
-            } catch (ClassNotFoundException e) {
-                isIndy = false;
+            } catch (ClassNotFoundException e1) {
+                try {
+                    getClass("org.codehaus.groovy.vmplugin.v7.IndyInterface");
+                    isIndy = true;
+                } catch (ClassNotFoundException e2) {
+                    isIndy = false;
+                }
             }
         }
 
@@ -233,90 +214,89 @@ public class ClassWrangler {
     }
 
     /**
-     * Returns the filename of the Groovy jar on the classpath.
+     * Logs the version of groovy used by this mojo.
      *
-     * @return the Groovy jar filename
+     * @param goal The goal to mention in the log statement showing Groovy version
      */
-    public String getGroovyJar() {
-        try {
-            String groovyObjectClassPath = getJarPath();
-            String groovyJar = null;
-            if (groovyObjectClassPath != null) {
-                groovyJar = groovyObjectClassPath.replaceAll("!.+", "");
-                groovyJar = groovyJar.substring(groovyJar.lastIndexOf("/") + 1);
-            }
-
-            return groovyJar;
-        } catch (ClassNotFoundException e) {
-            log.error("Unable to determine Groovy version. Is Groovy declared as a dependency?");
-            return null;
+    public void logGroovyVersion(final String goal) {
+        if (log.isInfoEnabled()) {
+            log.info("Using Groovy " + getGroovyVersionString() + " to perform " + goal + ".");
         }
     }
 
     /**
-     * Returns the path of the Groovy jar on the classpath.
+     * Gets a class for the given class name.
      *
-     * @return the path of the Groovy jar
-     * @throws ClassNotFoundException when Groovy couldn't be found on the classpath
+     * @param className the class name to retrieve the class for
+     * @return the class for the given class name
+     * @throws ClassNotFoundException when a class for the specified class name cannot be found
      */
-    protected String getJarPath() throws ClassNotFoundException {
-        Class<?> groovyObjectClass = getClass("groovy.lang.GroovyObject");
-        String groovyObjectClassPath = String.valueOf(groovyObjectClass.getResource("/" + groovyObjectClass.getName().replace('.', '/') + ".class"));
-        if (groovyObjectClassPath == null) {
-            CodeSource codeSource = groovyObjectClass.getProtectionDomain().getCodeSource();
-            if (codeSource != null) {
-                groovyObjectClassPath = String.valueOf(codeSource.getLocation());
-            }
-        }
-        return groovyObjectClassPath;
+    public Class<?> getClass(final String className) throws ClassNotFoundException {
+        return Class.forName(className, true, classLoader);
     }
 
     /**
-     * Logs the version of groovy used by this mojo.
+     * Returns the classloader used for loading classes.
      *
-     * @param goal The goal to mention in the log statement showing Groovy version
+     * @return the classloader used for loading classes
      */
-    public void logGroovyVersion(final String goal) {
-        if (log.isInfoEnabled()) {
-            log.info("Using Groovy " + getGroovyVersionString() + " to perform " + goal + ".");
-        }
+    public ClassLoader getClassLoader() {
+        return classLoader;
     }
 
     /**
      * Creates a new ClassLoader with the specified classpath.
      *
-     * @param classpath the classpath (a list of file path Strings) to include in the new loader
+     * @param classpath   the classpath (a list of file path Strings) to include in the new loader
+     * @param classLoader the ClassLoader to use as the parent for the new CLassLoader
      * @return the new ClassLoader
      * @throws MalformedURLException when a classpath element provides a malformed URL
      */
-    public ClassLoader createNewClassLoader(final List<?> classpath) throws MalformedURLException {
-        List<URL> urlsList = new ArrayList<URL>();
+    protected ClassLoader createNewClassLoader(final List<?> classpath, final ClassLoader classLoader) throws MalformedURLException {
+        List<URL> urlsList = new ArrayList<>();
         for (Object classPathObject : classpath) {
             String path = (String) classPathObject;
             urlsList.add(new File(path).toURI().toURL());
         }
         URL[] urlsArray = urlsList.toArray(new URL[0]);
-        return new URLClassLoader(urlsArray, ClassLoader.getSystemClassLoader());
+        return new URLClassLoader(urlsArray, classLoader);
     }
 
     /**
-     * Gets a class for the given class name.
+     * Returns the filename of the Groovy jar on the classpath.
      *
-     * @param className the class name to retrieve the class for
-     * @return the class for the given class name
-     * @throws ClassNotFoundException when a class for the specified class name cannot be found
+     * @return the Groovy jar filename
      */
-    public Class<?> getClass(final String className) throws ClassNotFoundException {
-        return Class.forName(className, true, classLoader);
+    protected String getGroovyJar() {
+        try {
+            String groovyObjectClassPath = getJarPath();
+            String groovyJar = null;
+            if (groovyObjectClassPath != null) {
+                groovyJar = groovyObjectClassPath.replaceAll("!.+", "");
+                groovyJar = groovyJar.substring(groovyJar.lastIndexOf("/") + 1);
+            }
+
+            return groovyJar;
+        } catch (ClassNotFoundException e) {
+            throw new RuntimeException("Unable to determine Groovy version. Is Groovy declared as a dependency?");
+        }
     }
 
     /**
-     * Returns the classloader used for loading classes.
+     * Returns the path of the Groovy jar on the classpath.
      *
-     * @return the classloader used for loading classes
+     * @return the path of the Groovy jar
+     * @throws ClassNotFoundException when Groovy couldn't be found on the classpath
      */
-    public ClassLoader getClassLoader() {
-        return classLoader;
+    protected String getJarPath() throws ClassNotFoundException {
+        Class<?> groovyObjectClass = getClass("groovy.lang.GroovyObject");
+        String groovyObjectClassPath = String.valueOf(groovyObjectClass.getResource("/" + groovyObjectClass.getName().replace('.', '/') + ".class"));
+        if (groovyObjectClassPath == null) {
+            CodeSource codeSource = groovyObjectClass.getProtectionDomain().getCodeSource();
+            if (codeSource != null) {
+                groovyObjectClassPath = String.valueOf(codeSource.getLocation());
+            }
+        }
+        return groovyObjectClassPath;
     }
-
 }
diff --git a/src/main/java/org/codehaus/gmavenplus/util/FileUtils.java b/src/main/java/org/codehaus/gmavenplus/util/FileUtils.java
index 8dfdc67..b504aa7 100644
--- a/src/main/java/org/codehaus/gmavenplus/util/FileUtils.java
+++ b/src/main/java/org/codehaus/gmavenplus/util/FileUtils.java
@@ -27,7 +27,8 @@ import java.io.*;
  */
 public class FileUtils {
 
-    private FileUtils() { }
+    private FileUtils() {
+    }
 
     /**
      * Returns the file extension without the '.' for the given filename, or the empty string if the file has no extension.
diff --git a/src/main/java/org/codehaus/gmavenplus/util/ReflectionUtils.java b/src/main/java/org/codehaus/gmavenplus/util/ReflectionUtils.java
index 8104c08..98ab78d 100644
--- a/src/main/java/org/codehaus/gmavenplus/util/ReflectionUtils.java
+++ b/src/main/java/org/codehaus/gmavenplus/util/ReflectionUtils.java
@@ -36,13 +36,14 @@ import java.util.List;
  */
 public class ReflectionUtils {
 
-    private ReflectionUtils() { }
+    private ReflectionUtils() {
+    }
 
     /**
      * Attempt to find a {@link Constructor} on the supplied class with the supplied parameter types.
      * Searches all superclasses up to <code>Object</code>.
      *
-     * @param clazz The class to introspect
+     * @param clazz      The class to introspect
      * @param paramTypes The parameter types of the method (may be <code>null</code> to indicate any signature)
      * @return The Constructor object
      */
@@ -68,8 +69,8 @@ public class ReflectionUtils {
      * Searches all superclasses up to {@link Object}.
      *
      * @param clazz The class to introspect
-     * @param name The name of the field (may be <code>null</code> if type is specified)
-     * @param type The type of the field (may be <code>null</code> if name is specified)
+     * @param name  The name of the field (may be <code>null</code> if type is specified)
+     * @param type  The type of the field (may be <code>null</code> if name is specified)
      * @return The corresponding Field object
      */
     public static Field findField(final Class<?> clazz, final String name, final Class<?> type) {
@@ -112,11 +113,9 @@ public class ReflectionUtils {
         Class<?> searchType = clazz;
         while (searchType != null) {
             Method[] methods = (searchType.isInterface() ? searchType.getMethods() : getDeclaredMethods(searchType));
-            if (methods != null) {
-                for (Method method : methods) {
-                    if (name.equals(method.getName()) && (paramTypes == null || Arrays.equals(paramTypes, method.getParameterTypes()))) {
-                        return method;
-                    }
+            for (Method method : methods) {
+                if (name.equals(method.getName()) && (paramTypes == null || Arrays.equals(paramTypes, method.getParameterTypes()))) {
+                    return method;
                 }
             }
             searchType = searchType.getSuperclass();
@@ -127,7 +126,7 @@ public class ReflectionUtils {
     /**
      * Find and return the specified value from the specified enum class.
      *
-     * @param clazz The enum class to introspect
+     * @param clazz     The enum class to introspect
      * @param valueName The name of the enum value to get
      * @return The enum value
      */
@@ -148,7 +147,7 @@ public class ReflectionUtils {
      * Get the field represented by the supplied {@link Field field object} on the specified {@link Object target object}.
      * In accordance with {@link Field#get(Object)} semantics, the returned value is automatically wrapped if the underlying field has a primitive type.
      *
-     * @param field The field to get
+     * @param field  The field to get
      * @param target The target object from which to get the field
      * @return The field's current value
      * @throws IllegalAccessException when unable to access the specified field because access modifiers prevent it
@@ -177,11 +176,11 @@ public class ReflectionUtils {
      * Invoke the specified {@link Constructor}  with the supplied arguments.
      *
      * @param constructor The method to invoke
-     * @param args The invocation arguments (may be <code>null</code>)
+     * @param args        The invocation arguments (may be <code>null</code>)
      * @return The invocation result, if any
-     * @throws IllegalAccessException when unable to access the specified constructor because access modifiers prevent it
+     * @throws IllegalAccessException                      when unable to access the specified constructor because access modifiers prevent it
      * @throws java.lang.reflect.InvocationTargetException when a reflection invocation fails
-     * @throws InstantiationException when an instantiation fails
+     * @throws InstantiationException                      when an instantiation fails
      */
     public static Object invokeConstructor(final Constructor<?> constructor, final Object... args) throws InvocationTargetException, IllegalAccessException, InstantiationException {
         if (constructor == null) {
@@ -197,9 +196,9 @@ public class ReflectionUtils {
      *
      * @param method The method to invoke
      * @param target The target object to invoke the method on
-     * @param args The invocation arguments (may be <code>null</code>)
+     * @param args   The invocation arguments (may be <code>null</code>)
      * @return The invocation result, if any
-     * @throws IllegalAccessException when unable to access the specified method because access modifiers prevent it
+     * @throws IllegalAccessException                      when unable to access the specified method because access modifiers prevent it
      * @throws java.lang.reflect.InvocationTargetException when a reflection invocation fails
      */
     public static Object invokeMethod(final Method method, final Object target, final Object... args) throws InvocationTargetException, IllegalAccessException {
@@ -217,9 +216,9 @@ public class ReflectionUtils {
      * Invoke the specified static {@link Method} with the supplied arguments.
      *
      * @param method The method to invoke
-     * @param args The invocation arguments (may be <code>null</code>)
+     * @param args   The invocation arguments (may be <code>null</code>)
      * @return The invocation result, if any
-     * @throws IllegalAccessException when unable to access the specified method because access modifiers prevent it
+     * @throws IllegalAccessException                      when unable to access the specified method because access modifiers prevent it
      * @throws java.lang.reflect.InvocationTargetException when a reflection invocation fails
      */
     public static Object invokeStaticMethod(final Method method, final Object... args) throws InvocationTargetException, IllegalAccessException {
@@ -265,7 +264,7 @@ public class ReflectionUtils {
             for (Method ifcMethod : ifc.getMethods()) {
                 if (!Modifier.isAbstract(ifcMethod.getModifiers())) {
                     if (result == null) {
-                        result = new LinkedList<Method>();
+                        result = new LinkedList<>();
                     }
                     result.add(ifcMethod);
                 }
diff --git a/src/site/site.xml b/src/site/site.xml
index 7488a69..1cb73f3 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <project xmlns="http://maven.apache.org/DECORATION/1.3.0"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://maven.apache.org/DECORATION/1.3.0 http://maven.apache.org/xsd/decoration-1.3.0.xsd"
-  name="GMavenPlus Plugin">
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/DECORATION/1.3.0 http://maven.apache.org/xsd/decoration-1.3.0.xsd"
+         name="GMavenPlus Plugin">
 
   <bannerLeft>
     <name>GMavenPlus Logo</name>
@@ -38,12 +38,12 @@
 
   <body>
     <menu name="Overview">
-      <item name="Introduction" href="index.html" />
-      <item name="Goals" href="plugin-info.html" />
-      <item name="Usage" href="https://github.com/groovy/GMavenPlus/wiki/Usage" />
-      <item name="Examples" href="https://github.com/groovy/GMavenPlus/wiki/Examples" />
+      <item name="Introduction" href="index.html"/>
+      <item name="Goals" href="plugin-info.html"/>
+      <item name="Usage" href="https://github.com/groovy/GMavenPlus/wiki/Usage"/>
+      <item name="Examples" href="https://github.com/groovy/GMavenPlus/wiki/Examples"/>
     </menu>
-    <menu ref="reports" />
+    <menu ref="reports"/>
   </body>
 
 </project>
diff --git a/src/test/java/org/codehaus/gmavenplus/groovyworkarounds/DotGroovyFileTest.java b/src/test/java/org/codehaus/gmavenplus/groovyworkarounds/DotGroovyFileTest.java
index 60290a2..68179f4 100644
--- a/src/test/java/org/codehaus/gmavenplus/groovyworkarounds/DotGroovyFileTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/groovyworkarounds/DotGroovyFileTest.java
@@ -35,12 +35,12 @@ public class DotGroovyFileTest {
 
     @Test
     public void testGroovyWithCustomExtension() {
-        DotGroovyFile[] dotGroovyFiles = new DotGroovyFile[] {
-                new DotGroovyFile("pathname.ext").setScriptExtensions(new HashSet<String>(singletonList("ext"))),
-                new DotGroovyFile("parent", "child.ext").setScriptExtensions(new HashSet<String>(singletonList("ext"))),
-                new DotGroovyFile(new File("parent"), "child.ext").setScriptExtensions(new HashSet<String>(singletonList("ext"))),
-                new DotGroovyFile(new File("filename.ext")).setScriptExtensions(new HashSet<String>(singletonList("ext"))),
-                new DotGroovyFile(new File("filename.ext").toURI()).setScriptExtensions(new HashSet<String>(singletonList("ext")))
+        DotGroovyFile[] dotGroovyFiles = new DotGroovyFile[]{
+                new DotGroovyFile("pathname.ext").setScriptExtensions(new HashSet<>(singletonList("ext"))),
+                new DotGroovyFile("parent", "child.ext").setScriptExtensions(new HashSet<>(singletonList("ext"))),
+                new DotGroovyFile(new File("parent"), "child.ext").setScriptExtensions(new HashSet<>(singletonList("ext"))),
+                new DotGroovyFile(new File("filename.ext")).setScriptExtensions(new HashSet<>(singletonList("ext"))),
+                new DotGroovyFile(new File("filename.ext").toURI()).setScriptExtensions(new HashSet<>(singletonList("ext")))
         };
         for (DotGroovyFile dotGroovyFile : dotGroovyFiles) {
             assertTrue(dotGroovyFile.getName() + " doesn't end with .groovy", dotGroovyFile.getName().endsWith(".groovy"));
@@ -49,7 +49,7 @@ public class DotGroovyFileTest {
 
     @Test
     public void testNonGroovyFile() {
-        DotGroovyFile[] dotGroovyFiles = new DotGroovyFile[] {
+        DotGroovyFile[] dotGroovyFiles = new DotGroovyFile[]{
                 new DotGroovyFile("pathname.ext"),
                 new DotGroovyFile("parent", "child.ext"),
                 new DotGroovyFile(new File("parent"), "child.ext"),
@@ -63,7 +63,7 @@ public class DotGroovyFileTest {
 
     @Test
     public void testGettersAndSetters() {
-        Set<String> extensions = new HashSet<String>();
+        Set<String> extensions = new HashSet<>();
         extensions.add("ext");
         DotGroovyFile dotGroovyFile = new DotGroovyFile("")
                 .setScriptExtensions(extensions);
diff --git a/src/test/java/org/codehaus/gmavenplus/groovyworkarounds/GroovyDocTemplateInfoTest.java b/src/test/java/org/codehaus/gmavenplus/groovyworkarounds/GroovyDocTemplateInfoTest.java
index 3326bcf..d5d074d 100644
--- a/src/test/java/org/codehaus/gmavenplus/groovyworkarounds/GroovyDocTemplateInfoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/groovyworkarounds/GroovyDocTemplateInfoTest.java
@@ -1,6 +1,6 @@
 package org.codehaus.gmavenplus.groovyworkarounds;
 
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.junit.Test;
 
 import static org.junit.Assert.assertArrayEquals;
@@ -16,7 +16,7 @@ public class GroovyDocTemplateInfoTest {
     @Test
     public void testDefaultDocTemplatesWithGroovy2_5_0() {
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(new Version(2, 6, 0));
-        assertArrayEquals(new String[] {
+        assertArrayEquals(new String[]{
                 groovyDocTemplateInfo.templateBaseDir + "topLevel/index.html",
                 groovyDocTemplateInfo.templateBaseDir + "topLevel/overview-frame.html",
                 groovyDocTemplateInfo.templateBaseDir + "topLevel/allclasses-frame.html",
@@ -33,7 +33,7 @@ public class GroovyDocTemplateInfoTest {
     @Test
     public void testDefaultDocTemplatesWithGroovy1_6_2() {
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(new Version(1, 6, 2));
-        assertArrayEquals(new String[] {
+        assertArrayEquals(new String[]{
                 groovyDocTemplateInfo.templateBaseDir + "topLevel/index.html",
                 groovyDocTemplateInfo.templateBaseDir + "topLevel/overview-frame.html",
                 groovyDocTemplateInfo.templateBaseDir + "topLevel/allclasses-frame.html",
@@ -50,7 +50,7 @@ public class GroovyDocTemplateInfoTest {
     @Test
     public void testDefaultDocTemplatesWithGroovy1_6_0() {
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(new Version(1, 6, 0));
-        assertArrayEquals(new String[] {
+        assertArrayEquals(new String[]{
                 groovyDocTemplateInfo.templateBaseDir + "top-level/index.html",
                 groovyDocTemplateInfo.templateBaseDir + "top-level/overview-frame.html",
                 groovyDocTemplateInfo.templateBaseDir + "top-level/allclasses-frame.html",
@@ -65,7 +65,7 @@ public class GroovyDocTemplateInfoTest {
     @Test
     public void testDefaultDocTemplatesWithGroovy1_6_0_RC2() {
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(new Version(1, 6, 0, "RC-2"));
-        assertArrayEquals(new String[] {
+        assertArrayEquals(new String[]{
                 groovyDocTemplateInfo.templateBaseDir + "top-level/index.html",
                 groovyDocTemplateInfo.templateBaseDir + "top-level/overview-frame.html",
                 groovyDocTemplateInfo.templateBaseDir + "top-level/allclasses-frame.html",
@@ -78,7 +78,7 @@ public class GroovyDocTemplateInfoTest {
     @Test
     public void testDefaultDocTemplatesWithGroovy1_5_0() {
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(new Version(1, 5, 0));
-        assertArrayEquals(new String[] {
+        assertArrayEquals(new String[]{
                 groovyDocTemplateInfo.templateBaseDir + "top-level/index.html",
                 groovyDocTemplateInfo.templateBaseDir + "top-level/overview-frame.html",
                 groovyDocTemplateInfo.templateBaseDir + "top-level/allclasses-frame.html",
@@ -90,7 +90,7 @@ public class GroovyDocTemplateInfoTest {
     @Test
     public void testDefaultPackageTemplatesWithGroovy1_6_2() {
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(new Version(1, 6, 2));
-        assertArrayEquals(new String[] {
+        assertArrayEquals(new String[]{
                 groovyDocTemplateInfo.templateBaseDir + "packageLevel/package-frame.html",
                 groovyDocTemplateInfo.templateBaseDir + "packageLevel/package-summary.html"
         }, groovyDocTemplateInfo.defaultPackageTemplates());
@@ -99,7 +99,7 @@ public class GroovyDocTemplateInfoTest {
     @Test
     public void testDefaultPackageTemplatesWithGroovy1_5_0() {
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(new Version(1, 5, 0));
-        assertArrayEquals(new String[] {
+        assertArrayEquals(new String[]{
                 groovyDocTemplateInfo.templateBaseDir + "package-level/package-frame.html",
                 groovyDocTemplateInfo.templateBaseDir + "package-level/package-summary.html"
         }, groovyDocTemplateInfo.defaultPackageTemplates());
@@ -108,13 +108,13 @@ public class GroovyDocTemplateInfoTest {
     @Test
     public void testDefaultClassTemplatesWithGroovy1_6_2() {
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(new Version(1, 6, 2));
-        assertArrayEquals(new String[] {groovyDocTemplateInfo.templateBaseDir + "classLevel/classDocName.html"}, groovyDocTemplateInfo.defaultClassTemplates());
+        assertArrayEquals(new String[]{groovyDocTemplateInfo.templateBaseDir + "classLevel/classDocName.html"}, groovyDocTemplateInfo.defaultClassTemplates());
     }
 
     @Test
     public void testDefaultClassTemplatesWithGroovy1_5_0() {
         GroovyDocTemplateInfo groovyDocTemplateInfo = new GroovyDocTemplateInfo(new Version(1, 5, 0));
-        assertArrayEquals(new String[] {groovyDocTemplateInfo.templateBaseDir + "class-level/classDocName.html"}, groovyDocTemplateInfo.defaultClassTemplates());
+        assertArrayEquals(new String[]{groovyDocTemplateInfo.templateBaseDir + "class-level/classDocName.html"}, groovyDocTemplateInfo.defaultClassTemplates());
     }
 
 }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/LinkTest.java b/src/test/java/org/codehaus/gmavenplus/model/LinkTest.java
similarity index 85%
rename from src/test/java/org/codehaus/gmavenplus/mojo/LinkTest.java
rename to src/test/java/org/codehaus/gmavenplus/model/LinkTest.java
index f2d0587..8325aa6 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/LinkTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/model/LinkTest.java
@@ -14,12 +14,11 @@
  * limitations under the License.
  */
 
-package org.codehaus.gmavenplus.mojo;
+package org.codehaus.gmavenplus.model;
 
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
 
 /**
@@ -32,8 +31,8 @@ public class LinkTest {
         String packages = "PACKAGES";
         String href = "HREF";
         Link link = new Link();
-        assertTrue(link.getPackages().length() == 0);
-        assertTrue(link.getHref().length() == 0);
+        assertEquals(0, link.getPackages().length());
+        assertEquals(0, link.getHref().length());
         link.setPackages(packages);
         link.setHref(href);
         assertEquals(packages, link.getPackages());
diff --git a/src/test/java/org/codehaus/gmavenplus/model/VersionTest.java b/src/test/java/org/codehaus/gmavenplus/model/internal/VersionTest.java
similarity index 97%
rename from src/test/java/org/codehaus/gmavenplus/model/VersionTest.java
rename to src/test/java/org/codehaus/gmavenplus/model/internal/VersionTest.java
index 47a6a9e..715bc97 100644
--- a/src/test/java/org/codehaus/gmavenplus/model/VersionTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/model/internal/VersionTest.java
@@ -1,4 +1,4 @@
-package org.codehaus.gmavenplus.model;
+package org.codehaus.gmavenplus.model.internal;
 
 import org.junit.Test;
 
@@ -86,7 +86,7 @@ public class VersionTest {
         Version v8 = Version.parseFromString("1.0.1");
         Version v9 = Version.parseFromString("1.1.0");
         Version v10 = Version.parseFromString("2.0.0");
-        List<Version> versions = new ArrayList<Version>();
+        List<Version> versions = new ArrayList<>();
         versions.add(v10);
         versions.add(v9);
         versions.add(v8);
@@ -118,7 +118,7 @@ public class VersionTest {
     @Test
     public void testNotEqualsWithNonVersion() {
         Version version = new Version(0);
-        assertFalse(version.toString().equals(""));
+        assertNotEquals("", version.toString());
     }
 
     @Test(expected = IllegalArgumentException.class)
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojoTest.java
index 6b7e55b..f49b4b3 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractCompileMojoTest.java
@@ -16,12 +16,10 @@
 
 package org.codehaus.gmavenplus.mojo;
 
-import org.apache.maven.project.MavenProject;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
 import static org.junit.Assert.assertFalse;
@@ -38,12 +36,9 @@ import static org.mockito.Mockito.mock;
 public class AbstractCompileMojoTest {
     private TestMojo testMojo;
 
-    @Mock
-    private MavenProject project;
-
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         testMojo = new TestMojo();
     }
 
@@ -283,6 +278,90 @@ public class AbstractCompileMojoTest {
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava14WithUnsupportedGroovy() {
+        testMojo = new TestMojo("3.0.0-beta-1");
+        testMojo.targetBytecode = "14";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava14WithSupportedGroovy() {
+        testMojo = new TestMojo("3.0.0-beta-2");
+        testMojo.targetBytecode = "14";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava15WithUnsupportedGroovy() {
+        testMojo = new TestMojo("3.0.2");
+        testMojo.targetBytecode = "15";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava15WithSupportedGroovy() {
+        testMojo = new TestMojo("3.0.3");
+        testMojo.targetBytecode = "15";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava16WithUnsupportedGroovy() {
+        testMojo = new TestMojo("3.0.5");
+        testMojo.targetBytecode = "16";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava16WithSupportedGroovy() {
+        testMojo = new TestMojo("3.0.6");
+        testMojo.targetBytecode = "16";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava17WithUnsupportedGroovy() {
+        testMojo = new TestMojo("3.0.7");
+        testMojo.targetBytecode = "17";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava17WithSupportedGroovy() {
+        testMojo = new TestMojo("3.0.8");
+        testMojo.targetBytecode = "17";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava17WithUnsupportedGroovy4() {
+        testMojo = new TestMojo("4.0.0-alpha-2");
+        testMojo.targetBytecode = "17";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava17WithSupportedGroovy4() {
+        testMojo = new TestMojo("4.0.0-alpha-3");
+        testMojo.targetBytecode = "17";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava18WithUnsupportedGroovy() {
+        testMojo = new TestMojo("4.0.0-alpha-3");
+        testMojo.targetBytecode = "18";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava18WithSupportedGroovy() {
+        testMojo = new TestMojo("4.0.0-beta-1");
+        testMojo.targetBytecode = "18";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
     @Test(expected = IllegalArgumentException.class)
     public void testUnrecognizedJava() {
         testMojo = new TestMojo("2.1.2");
@@ -290,7 +369,7 @@ public class AbstractCompileMojoTest {
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
-    protected class TestMojo extends AbstractCompileMojo {
+    protected static class TestMojo extends AbstractCompileMojo {
         protected TestMojo() {
             this(GROOVY_1_5_0.toString(), false);
         }
@@ -306,7 +385,8 @@ public class AbstractCompileMojoTest {
         }
 
         @Override
-        public void execute() { }
+        public void execute() {
+        }
     }
 
 }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojoTest.java
index f9a14ed..4ec76d6 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGenerateStubsMojoTest.java
@@ -18,7 +18,7 @@ package org.codehaus.gmavenplus.mojo;
 
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.model.fileset.FileSet;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 import org.junit.Before;
 import org.junit.Test;
@@ -52,9 +52,9 @@ public class AbstractGenerateStubsMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         doReturn("STUBBED_DIRECTORY").when(fileSet).getDirectory();
-        doReturn(new String[] {"STUBBED_INCLUDES"}).when(fileSet).getIncludesArray();
+        doReturn(new String[]{"STUBBED_INCLUDES"}).when(fileSet).getIncludesArray();
         doReturn("STUBBED_STUBS_DIRECTORY").when(outputDirectory).getAbsolutePath();
         File mockBaseDir = mock(File.class);
         doReturn("STUBBED_BASEDIR").when(mockBaseDir).getAbsolutePath();
@@ -71,20 +71,20 @@ public class AbstractGenerateStubsMojoTest {
 
     @Test
     public void testGroovyVersionSupportsActionTrue() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("1.5.0");
+        testMojo = new TestMojo("1.5.0");
         assertTrue(testMojo.groovyVersionSupportsAction());
     }
 
     @Test
     public void testGroovyVersionSupportsActionFalse() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("1.1-rc-3");
+        testMojo = new TestMojo("1.1-rc-3");
         assertFalse(testMojo.groovyVersionSupportsAction());
     }
 
     @Test
     public void testResetStubModifiedDates() {
         File stub = mock(File.class);
-        Set<File> stubs = new HashSet<File>();
+        Set<File> stubs = new HashSet<>();
         stubs.add(stub);
         testMojo.resetStubModifiedDates(stubs);
         verify(stub, atLeastOnce()).setLastModified(anyLong());
@@ -92,229 +92,320 @@ public class AbstractGenerateStubsMojoTest {
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava6WithUnsupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.1.2");
+        testMojo = new TestMojo("2.1.2");
         testMojo.targetBytecode = "1.6";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava6WithSupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.1.3");
+        testMojo = new TestMojo("2.1.3");
         testMojo.targetBytecode = "1.6";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava7WithUnsupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.1.2");
+        testMojo = new TestMojo("2.1.2");
         testMojo.targetBytecode = "1.7";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava7WithSupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.1.3");
+        testMojo = new TestMojo("2.1.3");
         testMojo.targetBytecode = "1.7";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava8WithUnsupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.3.2");
+        testMojo = new TestMojo("2.3.2");
         testMojo.targetBytecode = "1.8";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava8WithSupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.3.3");
+        testMojo = new TestMojo("2.3.3");
         testMojo.targetBytecode = "1.8";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava9WithUnsupportedGroovy2_5() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.2");
+        testMojo = new TestMojo("2.5.2");
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava9WithSupportedGroovy2_5() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.3");
+        testMojo = new TestMojo("2.5.3");
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava9WithUnsupportedGroovy2_6() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.6.0-alpha-3");
+        testMojo = new TestMojo("2.6.0-alpha-3");
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava9WithSupportedGroovy2_6() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.6.0-alpha-4");
+        testMojo = new TestMojo("2.6.0-alpha-4");
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava9WithUnsupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-1");
+        testMojo = new TestMojo("3.0.0-alpha-1");
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava9WithSupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-2");
+        testMojo = new TestMojo("3.0.0-alpha-2");
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava9WithUnsupportedGroovyIndy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.2", true);
+        testMojo = new TestMojo("2.5.2", true);
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava9WithSupportedGroovyIndy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.3", true);
+        testMojo = new TestMojo("2.5.3", true);
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava9WithUnsupportedGroovy3Indy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-3", true);
+        testMojo = new TestMojo("3.0.0-alpha-3", true);
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava9WithSupportedGroovy3Indy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-4", true);
+        testMojo = new TestMojo("3.0.0-alpha-4", true);
         testMojo.targetBytecode = "9";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava10WithUnsupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.2");
+        testMojo = new TestMojo("2.5.2");
         testMojo.targetBytecode = "10";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava10WithSupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.3");
+        testMojo = new TestMojo("2.5.3");
         testMojo.targetBytecode = "10";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava10WithUnsupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-3");
+        testMojo = new TestMojo("3.0.0-alpha-3");
         testMojo.targetBytecode = "10";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava10WithSupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-4");
+        testMojo = new TestMojo("3.0.0-alpha-4");
         testMojo.targetBytecode = "10";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava11WithUnsupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.2");
+        testMojo = new TestMojo("2.5.2");
         testMojo.targetBytecode = "11";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava11WithSupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.3");
+        testMojo = new TestMojo("2.5.3");
         testMojo.targetBytecode = "11";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava11WithUnsupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-3");
+        testMojo = new TestMojo("3.0.0-alpha-3");
         testMojo.targetBytecode = "11";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava11WithSupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-4");
+        testMojo = new TestMojo("3.0.0-alpha-4");
         testMojo.targetBytecode = "11";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava12WithUnsupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.2");
+        testMojo = new TestMojo("2.5.2");
         testMojo.targetBytecode = "12";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava12WithSupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.3");
+        testMojo = new TestMojo("2.5.3");
         testMojo.targetBytecode = "12";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava12WithUnsupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-3");
+        testMojo = new TestMojo("3.0.0-alpha-3");
         testMojo.targetBytecode = "12";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava12WithSupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-4");
+        testMojo = new TestMojo("3.0.0-alpha-4");
         testMojo.targetBytecode = "12";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava13WithUnsupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.6");
+        testMojo = new TestMojo("2.5.6");
         testMojo.targetBytecode = "13";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava13WithSupportedGroovy() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("2.5.7");
+        testMojo = new TestMojo("2.5.7");
         testMojo.targetBytecode = "13";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testJava13WithUnsupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-alpha-4");
+        testMojo = new TestMojo("3.0.0-alpha-4");
         testMojo.targetBytecode = "13";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
     @Test
     public void testJava13WithSupportedGroovy3() {
-        testMojo = new AbstractGenerateStubsMojoTest.TestMojo("3.0.0-beta-1");
+        testMojo = new TestMojo("3.0.0-beta-1");
         testMojo.targetBytecode = "13";
         testMojo.verifyGroovyVersionSupportsTargetBytecode();
     }
 
-    protected class TestMojo extends AbstractGenerateStubsMojo {
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava14WithUnsupportedGroovy() {
+        testMojo = new TestMojo("3.0.0-beta-1");
+        testMojo.targetBytecode = "14";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava14WithSupportedGroovy() {
+        testMojo = new TestMojo("3.0.0-beta-2");
+        testMojo.targetBytecode = "14";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava15WithUnsupportedGroovy() {
+        testMojo = new TestMojo("3.0.2");
+        testMojo.targetBytecode = "15";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava15WithSupportedGroovy() {
+        testMojo = new TestMojo("3.0.3");
+        testMojo.targetBytecode = "15";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava16WithUnsupportedGroovy() {
+        testMojo = new TestMojo("3.0.5");
+        testMojo.targetBytecode = "16";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava16WithSupportedGroovy() {
+        testMojo = new TestMojo("3.0.6");
+        testMojo.targetBytecode = "16";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava17WithUnsupportedGroovy() {
+        testMojo = new TestMojo("3.0.7");
+        testMojo.targetBytecode = "17";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava17WithSupportedGroovy() {
+        testMojo = new TestMojo("3.0.8");
+        testMojo.targetBytecode = "17";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava17WithUnsupportedGroovy4() {
+        testMojo = new TestMojo("4.0.0-alpha-2");
+        testMojo.targetBytecode = "17";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava17WithSupportedGroovy4() {
+        testMojo = new TestMojo("4.0.0-alpha-3");
+        testMojo.targetBytecode = "17";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testJava18WithUnsupportedGroovy() {
+        testMojo = new TestMojo("4.0.0-alpha-3");
+        testMojo.targetBytecode = "18";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test
+    public void testJava18WithSupportedGroovy() {
+        testMojo = new TestMojo("4.0.0-beta-1");
+        testMojo.targetBytecode = "18";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testUnrecognizedJava() {
+        testMojo = new TestMojo("2.1.2");
+        testMojo.targetBytecode = "unknown";
+        testMojo.verifyGroovyVersionSupportsTargetBytecode();
+    }
+
+    protected static class TestMojo extends AbstractGenerateStubsMojo {
         protected TestMojo() {
             this(GROOVY_1_8_2.toString(), false);
         }
@@ -330,7 +421,8 @@ public class AbstractGenerateStubsMojoTest {
         }
 
         @Override
-        public void execute() { }
+        public void execute() {
+        }
     }
 
 }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyDocMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyDocMojoTest.java
index 17d2fa4..2282ec8 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyDocMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyDocMojoTest.java
@@ -15,7 +15,6 @@ import java.io.File;
 import java.util.Properties;
 
 import static java.util.Collections.emptyList;
-import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
 /**
@@ -39,20 +38,20 @@ public class AbstractGroovyDocMojoTest {
     @Before
     @SuppressWarnings("deprecation")
     public void setup() throws Exception {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         testMojo.mojoExecution = mojoExecution;
         doReturn(mojoDescriptor).when(mojoExecution).getMojoDescriptor();
         testMojo.project = project;
         doReturn(new Properties()).when(testMojo).setupProperties();
         doReturn(emptyList()).when(testMojo).setupGroovyDocSources(any(FileSet[].class), any(FileSetManager.class));
-        doNothing().when(testMojo).generateGroovyDoc(any(File.class), any(Class.class), any(Class.class), anyObject(), anyListOf(String.class), anyObject());
+        doNothing().when(testMojo).generateGroovyDoc(any(File.class), any(Class.class), any(Class.class), any(), anyList(), any());
     }
 
     @Test
     @SuppressWarnings("deprecation")
     public void testDontSkipGroovyDoc() throws Exception {
         testMojo.doGroovyDocGeneration(new FileSet[]{new FileSet()}, emptyList(), new File(""));
-        verify(testMojo, times(1)).generateGroovyDoc(any(File.class), any(Class.class), any(Class.class), anyObject(), anyListOf(String.class), anyObject());
+        verify(testMojo, times(1)).generateGroovyDoc(any(File.class), any(Class.class), any(Class.class), any(), anyList(), any());
     }
 
     @Test
@@ -60,12 +59,13 @@ public class AbstractGroovyDocMojoTest {
     public void testSkipGroovyDoc() throws Exception {
         testMojo.skipGroovyDoc = true;
         testMojo.doGroovyDocGeneration(new FileSet[]{new FileSet()}, emptyList(), new File(""));
-        verify(testMojo, never()).generateGroovyDoc(any(File.class), any(Class.class), any(Class.class), anyObject(), anyListOf(String.class), anyObject());
+        verify(testMojo, never()).generateGroovyDoc(any(File.class), any(Class.class), any(Class.class), any(), anyList(), any());
     }
 
     public static class TestMojo extends AbstractGroovyDocMojo {
         @Override
-        public void execute() { }
+        public void execute() {
+        }
     }
 
 }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojoTest.java
index c91bd76..ba585f9 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyMojoTest.java
@@ -16,7 +16,7 @@
 
 package org.codehaus.gmavenplus.mojo;
 
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -70,7 +70,8 @@ public class AbstractGroovyMojoTest {
 
     public static class TestGroovyMojo extends AbstractGroovyMojo {
         @Override
-        public void execute() { }
+        public void execute() {
+        }
     }
 
 }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovySourcesMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovySourcesMojoTest.java
index cd5bf2a..9b07a75 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovySourcesMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovySourcesMojoTest.java
@@ -17,12 +17,18 @@
 package org.codehaus.gmavenplus.mojo;
 
 import org.apache.maven.project.MavenProject;
+import org.apache.maven.shared.model.fileset.FileSet;
 import org.junit.Before;
+import org.junit.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
 import java.io.File;
+import java.util.List;
 
+import static java.util.Collections.singletonList;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.doReturn;
 
 
@@ -33,22 +39,138 @@ import static org.mockito.Mockito.doReturn;
  */
 public class AbstractGroovySourcesMojoTest {
     private TestMojo testMojo;
+
     @Mock
     private MavenProject project;
+
     @Mock
     private File basedir;
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         testMojo = new TestMojo();
         doReturn(basedir).when(project).getBasedir();
+        doReturn(singletonList("basedir" + File.separator + "src" + File.separator + "main" + File.separator + "java")).when(project).getCompileSourceRoots();
+        doReturn(singletonList("basedir" + File.separator + "src" + File.separator + "test" + File.separator + "java")).when(project).getTestCompileSourceRoots();
         testMojo.project = project;
     }
 
-    public class TestMojo extends AbstractGroovySourcesMojo {
+    @Test
+    public void mainDefaultPattern() {
+        FileSet[] results = testMojo.getFilesets(null, false);
+
+        assertEquals(1, results.length);
+        assertEquals("basedir" + File.separator + "src" + File.separator + "main" + File.separator + "groovy", results[0].getDirectory());
+        assertEquals(1, results[0].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.groovy"), results[0].getIncludes());
+    }
+
+    @Test
+    public void testDefaultPattern() {
+        FileSet[] results = testMojo.getTestFilesets(null, false);
+
+        assertEquals(1, results.length);
+        assertEquals("basedir" + File.separator + "src" + File.separator + "test" + File.separator + "groovy", results[0].getDirectory());
+        assertEquals(1, results[0].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.groovy"), results[0].getIncludes());
+    }
+
+    @Test
+    public void mainWithJavaPattern() {
+        FileSet[] results = testMojo.getFilesets(null, true);
+
+        assertEquals(2, results.length);
+        assertEquals("basedir" + File.separator + "src" + File.separator + "main" + File.separator + "groovy", results[0].getDirectory());
+        assertEquals(1, results[0].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.groovy"), results[0].getIncludes());
+        assertEquals(1, results[1].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.java"), results[1].getIncludes());
+    }
+
+    @Test
+    public void testWithJavaPattern() {
+        FileSet[] results = testMojo.getTestFilesets(null, true);
+
+        assertEquals(2, results.length);
+        assertEquals("basedir" + File.separator + "src" + File.separator + "test" + File.separator + "groovy", results[0].getDirectory());
+        assertEquals(1, results[0].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.groovy"), results[0].getIncludes());
+        assertEquals(1, results[1].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.java"), results[1].getIncludes());
+    }
+
+    @Test
+    public void mainWithSpecifiedPattern() {
+        FileSet fileSet = new FileSet();
+        fileSet.setDirectory("basedir" + File.separator + "src" + File.separator + "custom");
+        fileSet.setIncludes(singletonList("**" + File.separator + "*.gvy"));
+        FileSet[] specifiedSources = new FileSet[]{fileSet};
+        FileSet[] results = testMojo.getTestFilesets(specifiedSources, false);
+
+        assertEquals(1, results.length);
+        assertEquals("basedir" + File.separator + "src" + File.separator + "custom", results[0].getDirectory());
+        assertEquals(1, results[0].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.gvy"), results[0].getIncludes());
+    }
+
+    @Test
+    public void testWithSpecifiedPattern() {
+        FileSet fileSet = new FileSet();
+        fileSet.setDirectory("basedir" + File.separator + "src" + File.separator + "custom");
+        fileSet.setIncludes(singletonList("**" + File.separator + "*.gvy"));
+        FileSet[] specifiedSources = new FileSet[]{fileSet};
+        FileSet[] results = testMojo.getTestFilesets(specifiedSources, false);
+
+        assertEquals(1, results.length);
+        assertEquals("basedir" + File.separator + "src" + File.separator + "custom", results[0].getDirectory());
+        assertEquals(1, results[0].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.gvy"), results[0].getIncludes());
+    }
+
+    @Test
+    public void mainWithSpecifiedPatternAndJavaPattern() {
+        FileSet fileSet = new FileSet();
+        fileSet.setDirectory("basedir" + File.separator + "src" + File.separator + "custom");
+        fileSet.setIncludes(singletonList("**" + File.separator + "*.gvy"));
+        FileSet[] specifiedSources = new FileSet[]{fileSet};
+        FileSet[] results = testMojo.getTestFilesets(specifiedSources, true);
+
+        assertEquals(2, results.length);
+        assertEquals("basedir" + File.separator + "src" + File.separator + "custom", results[0].getDirectory());
+        assertEquals(1, results[0].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.gvy"), results[0].getIncludes());
+        assertEquals(1, results[1].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.java"), results[1].getIncludes());
+    }
+
+    @Test
+    public void testWithSpecifiedPatternAndJavaPattern() {
+        FileSet fileSet = new FileSet();
+        fileSet.setDirectory("basedir" + File.separator + "src" + File.separator + "custom");
+        fileSet.setIncludes(singletonList("**" + File.separator + "*.gvy"));
+        FileSet[] specifiedSources = new FileSet[]{fileSet};
+        FileSet[] results = testMojo.getTestFilesets(specifiedSources, true);
+
+        assertEquals(2, results.length);
+        assertEquals("basedir" + File.separator + "src" + File.separator + "custom", results[0].getDirectory());
+        assertEquals(1, results[0].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.gvy"), results[0].getIncludes());
+        assertEquals(1, results[1].getIncludes().size());
+        assertListsEqual(singletonList("**" + File.separator + "*.java"), results[1].getIncludes());
+    }
+
+    private void assertListsEqual(List<String> expected, List<String> actual) {
+        assertEquals(expected.size(), actual.size());
+        for (String expectedEntry : expected) {
+            assertTrue("Expected " + actual + " to contain " + expectedEntry, actual.contains(expectedEntry));
+        }
+    }
+
+    public static class TestMojo extends AbstractGroovySourcesMojo {
         @Override
-        public void execute() { }
+        public void execute() {
+        }
     }
 
 }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyStubSourcesMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyStubSourcesMojoTest.java
index be5762d..c83f89c 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyStubSourcesMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractGroovyStubSourcesMojoTest.java
@@ -40,7 +40,7 @@ public class AbstractGroovyStubSourcesMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         testMojo = new TestMojo();
         doReturn(PATH).when(outputDirectory).getAbsolutePath();
     }
@@ -50,9 +50,10 @@ public class AbstractGroovyStubSourcesMojoTest {
         assertEquals(0, testMojo.getStubs(outputDirectory).size());
     }
 
-    protected class TestMojo extends AbstractGroovyStubSourcesMojo {
+    protected static class TestMojo extends AbstractGroovyStubSourcesMojo {
         @Override
-        public void execute() { }
+        public void execute() {
+        }
     }
 
 }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractToolsMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractToolsMojoTest.java
index 8b82e9e..3749677 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AbstractToolsMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AbstractToolsMojoTest.java
@@ -16,9 +16,9 @@
 
 package org.codehaus.gmavenplus.mojo;
 
-import groovy.util.AntBuilder;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.execution.MavenSession;
+import org.apache.maven.model.Model;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.project.MavenProject;
 import org.codehaus.gmavenplus.util.ClassWrangler;
@@ -31,7 +31,7 @@ import org.mockito.Spy;
 import java.util.List;
 import java.util.Properties;
 
-import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.*;
 import static org.mockito.Mockito.*;
 
 
@@ -57,14 +57,21 @@ public class AbstractToolsMojoTest {
 
     @Before
     public void setup() throws Exception {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         testMojo = new TestMojo();
         testMojo.project = project;
-        testMojo.session= session;
+        testMojo.session = session;
         testMojo.pluginArtifacts = pluginArtifacts;
         testMojo.mojoExecution = mojoExecution;
         testMojo.classWrangler = classWrangler;
-        doReturn(AntBuilder.class).when(classWrangler).getClass(anyString());
+        Class<?> antBuilderClass;
+        try {
+            antBuilderClass = Class.forName("groovy.ant.AntBuilder");
+        } catch (ClassNotFoundException e) {
+            antBuilderClass = Class.forName("groovy.util.AntBuilder");
+        }
+
+        doReturn(antBuilderClass).when(classWrangler).getClass(anyString());
     }
 
     @Test
@@ -81,7 +88,7 @@ public class AbstractToolsMojoTest {
     @SuppressWarnings("deprecation")
     public void testInitializePropertiesNull() {
         testMojo.project = null;
-        testMojo.session= null;
+        testMojo.session = null;
         testMojo.pluginArtifacts = null;
         testMojo.mojoExecution = mojoExecution;
 
@@ -89,7 +96,7 @@ public class AbstractToolsMojoTest {
 
         verify(properties, never()).put(eq("project"), any(MavenProject.class));
         verify(properties, never()).put(eq("session"), any(MavenSession.class));
-        verify(properties, never()).put(eq("pluginArtifacts"), anyListOf(Artifact.class));
+        verify(properties, never()).put(eq("pluginArtifacts"), anyList());
         verify(properties, never()).put(eq("mojoExecution"), any(MojoExecution.class));
     }
 
@@ -103,13 +110,98 @@ public class AbstractToolsMojoTest {
 
         verify(properties, times(1)).put(eq("project"), any(MavenProject.class));
         verify(properties, times(1)).put(eq("session"), any(MavenSession.class));
-        verify(properties, times(1)).put(eq("pluginArtifacts"), anyListOf(Artifact.class));
+        verify(properties, times(1)).put(eq("pluginArtifacts"), anyList());
         verify(properties, times(1)).put(eq("mojoExecution"), any(MojoExecution.class));
     }
 
-    protected class TestMojo extends AbstractToolsMojo {
+    @Test
+    public void testAddAllProjectProperties() {
+        Properties projectProperties = new Properties();
+        projectProperties.put("foo", "bar");
+        Model model = new Model();
+        model.setProperties(projectProperties);
+        testMojo.project = new MavenProject(model);
+        testMojo.bindAllProjectProperties = true;
+
+        testMojo.initializeProperties();
+
+        assertEquals("bar", testMojo.properties.get("foo"));
+    }
+
+    @Test
+    public void testAddAllSessionUserProperties() {
+        MavenSession session = mock(MavenSession.class);
+        Properties sessionProperties = new Properties();
+        sessionProperties.put("foo", "bar");
+        doReturn(sessionProperties).when(session).getUserProperties();
+        testMojo.session = session;
+        testMojo.bindAllSessionUserProperties = true;
+
+        testMojo.initializeProperties();
+
+        assertEquals("bar", testMojo.properties.get("foo"));
+    }
+
+    @Test
+    public void testBindAllProjectPropertiesAndBindSessionUserOverridePropertiesWhenEmpty() {
+        MavenSession session = mock(MavenSession.class);
+        Properties projectProperties = new Properties();
+        projectProperties.put("foo", "bar");
+        doReturn(new Properties()).when(session).getUserProperties();
+        doReturn(projectProperties).when(project).getProperties();
+        testMojo.session = session;
+        testMojo.bindAllProjectProperties = true;
+        testMojo.bindSessionUserOverrideProperties = true;
+
+        testMojo.initializeProperties();
+    }
+
+    @Test
+    public void testSessionPropertiesOverrideProjectPropertiesAndIncludesOthers() {
+        Properties projectProperties = new Properties();
+        projectProperties.put("foo", "bar");
+        Model model = new Model();
+        model.setProperties(projectProperties);
+        testMojo.project = new MavenProject(model);
+        MavenSession session = mock(MavenSession.class);
+        Properties sessionProperties = new Properties();
+        sessionProperties.put("foo", "baz");
+        sessionProperties.put("bar", "foo");
+        doReturn(sessionProperties).when(session).getUserProperties();
+        testMojo.session = session;
+        testMojo.bindAllProjectProperties = true;
+        testMojo.bindAllSessionUserProperties = true;
+
+        testMojo.initializeProperties();
+        assertEquals("baz", testMojo.properties.get("foo"));
+        assertEquals("foo", testMojo.properties.get("bar"));
+    }
+
+    @Test
+    public void testSessionPropertiesOverrideProjectProperties() {
+        Properties projectProperties = new Properties();
+        projectProperties.put("foo", "bar");
+        Model model = new Model();
+        model.setProperties(projectProperties);
+        testMojo.project = new MavenProject(model);
+        MavenSession session = mock(MavenSession.class);
+        Properties sessionProperties = new Properties();
+        sessionProperties.put("foo", "baz");
+        sessionProperties.put("bar", "foo");
+        doReturn(sessionProperties).when(session).getUserProperties();
+        testMojo.session = session;
+        testMojo.bindAllProjectProperties = true;
+        testMojo.bindSessionUserOverrideProperties = true;
+
+        testMojo.initializeProperties();
+        assertEquals("baz", testMojo.properties.get("foo"));
+        assertNull(testMojo.properties.get("bar"));
+    }
+
+    protected static class TestMojo extends AbstractToolsMojo {
         @Override
-        public void execute() { }
+        public void execute() {
+        }
     }
 
 }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AddSourcesMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AddSourcesMojoTest.java
index b0bdc94..ead6db4 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AddSourcesMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AddSourcesMojoTest.java
@@ -42,7 +42,7 @@ public class AddSourcesMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         addSourcesMojo = new AddSourcesMojo();
         addSourcesMojo.project = project;
     }
@@ -52,7 +52,7 @@ public class AddSourcesMojoTest {
         doReturn(singletonList(PATH)).when(project).getCompileSourceRoots();
         FileSet fs = new FileSet();
         fs.setDirectory(PATH);
-        addSourcesMojo.sources = new FileSet[] {fs};
+        addSourcesMojo.sources = new FileSet[]{fs};
         addSourcesMojo.execute();
         verify(project, never()).addCompileSourceRoot(anyString());
     }
@@ -62,7 +62,7 @@ public class AddSourcesMojoTest {
         doReturn(singletonList(PATH)).when(project).getCompileSourceRoots();
         FileSet fs = new FileSet();
         fs.setDirectory("OTHER PATH");
-        addSourcesMojo.sources = new FileSet[] {fs};
+        addSourcesMojo.sources = new FileSet[]{fs};
         addSourcesMojo.execute();
         verify(project, times(1)).addCompileSourceRoot(anyString());
     }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AddStubSourcesMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AddStubSourcesMojoTest.java
index 868a85c..f5f8e69 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AddStubSourcesMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AddStubSourcesMojoTest.java
@@ -41,7 +41,7 @@ public class AddStubSourcesMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         addStubSourcesMojo = new AddStubSourcesMojo();
         addStubSourcesMojo.project = project;
         addStubSourcesMojo.stubsOutputDirectory = stubsOutputDirectory;
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AddTestSourcesMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AddTestSourcesMojoTest.java
index d9146f6..2e2f61b 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AddTestSourcesMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AddTestSourcesMojoTest.java
@@ -42,7 +42,7 @@ public class AddTestSourcesMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         addTestSourcesMojo = new AddTestSourcesMojo();
         addTestSourcesMojo.project = project;
     }
@@ -52,7 +52,7 @@ public class AddTestSourcesMojoTest {
         doReturn(singletonList(PATH)).when(project).getTestCompileSourceRoots();
         FileSet fs = new FileSet();
         fs.setDirectory(PATH);
-        addTestSourcesMojo.testSources = new FileSet[] {fs};
+        addTestSourcesMojo.testSources = new FileSet[]{fs};
         addTestSourcesMojo.execute();
         verify(project, never()).addTestCompileSourceRoot(anyString());
     }
@@ -62,7 +62,7 @@ public class AddTestSourcesMojoTest {
         doReturn(singletonList(PATH)).when(project).getTestCompileSourceRoots();
         FileSet fs = new FileSet();
         fs.setDirectory("OTHER PATH");
-        addTestSourcesMojo.testSources = new FileSet[] {fs};
+        addTestSourcesMojo.testSources = new FileSet[]{fs};
         addTestSourcesMojo.execute();
         verify(project, times(1)).addTestCompileSourceRoot(anyString());
     }
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/AddTestStubSourcesMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/AddTestStubSourcesMojoTest.java
index b9df248..aace23a 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/AddTestStubSourcesMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/AddTestStubSourcesMojoTest.java
@@ -42,7 +42,7 @@ public class AddTestStubSourcesMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         addTestStubSourcesMojo = new AddTestStubSourcesMojo();
         addTestStubSourcesMojo.project = project;
         addTestStubSourcesMojo.testStubsOutputDirectory = outputDirectory;
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/CompileMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/CompileMojoTest.java
index ff70a38..8a48aee 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/CompileMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/CompileMojoTest.java
@@ -21,7 +21,7 @@ import org.apache.maven.model.Build;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.model.fileset.FileSet;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 import org.junit.Before;
 import org.junit.Test;
@@ -50,8 +50,8 @@ public class CompileMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
-        Set<File> sources = new TreeSet<File>();
+        MockitoAnnotations.openMocks(this);
+        Set<File> sources = new TreeSet<>();
         sources.add(mock(File.class));
         doReturn(sources).when(compileMojo).getTestFiles(any(FileSet[].class), eq(false));
         compileMojo.outputDirectory = mock(File.class);
@@ -65,49 +65,49 @@ public class CompileMojoTest {
     @Test
     @SuppressWarnings("deprecation")
     public void testCallsExpectedMethods() throws Exception {
-        doNothing().when(compileMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doNothing().when(compileMojo).doCompile(anySet(), anyList(), any(File.class));
         compileMojo.execute();
         verify(compileMojo, never()).logPluginClasspath();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testClassNotFoundExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySet(), anyList(), any(File.class));
         compileMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testInvocationTargetExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySet(), anyList(), any(File.class));
         compileMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testInstantiationExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySet(), anyList(), any(File.class));
         compileMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testIllegalAccessExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySet(), anyList(), any(File.class));
         compileMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testDependencyResolutionRequiredExceptionThrowsMojoExecutionException() throws Exception {
         doThrow(mock(DependencyResolutionRequiredException.class)).when(compileMojo.project).getCompileClasspathElements();
         compileMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testMalformedURLExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileMojo).doCompile(anySet(), anyList(), any(File.class));
         compileMojo.execute();
     }
 
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/CompileTestsMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/CompileTestsMojoTest.java
index 632916b..1f5c005 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/CompileTestsMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/CompileTestsMojoTest.java
@@ -21,7 +21,7 @@ import org.apache.maven.model.Build;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.model.fileset.FileSet;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 import org.junit.Before;
 import org.junit.Test;
@@ -50,8 +50,8 @@ public class CompileTestsMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
-        Set<File> sources = new TreeSet<File>();
+        MockitoAnnotations.openMocks(this);
+        Set<File> sources = new TreeSet<>();
         sources.add(mock(File.class));
         doReturn(sources).when(compileTestsMojo).getTestFiles(any(FileSet[].class), eq(false));
         compileTestsMojo.testOutputDirectory = mock(File.class);
@@ -65,9 +65,9 @@ public class CompileTestsMojoTest {
     @Test
     @SuppressWarnings("deprecation")
     public void testCallsExpectedMethods() throws Exception {
-        doNothing().when(compileTestsMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doNothing().when(compileTestsMojo).doCompile(anySet(), anyList(), any(File.class));
         compileTestsMojo.execute();
-        verify(compileTestsMojo, times(1)).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        verify(compileTestsMojo, times(1)).doCompile(anySet(), anyList(), any(File.class));
     }
 
     @Test
@@ -75,47 +75,47 @@ public class CompileTestsMojoTest {
     public void testSkipped() throws Exception {
         compileTestsMojo.skipTests = true;
         compileTestsMojo.execute();
-        verify(compileTestsMojo, never()).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        verify(compileTestsMojo, never()).doCompile(anySet(), anyList(), any(File.class));
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testClassNotFoundExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySet(), anyList(), any(File.class));
         compileTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testInvocationTargetExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySet(), anyList(), any(File.class));
         compileTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testInstantiationExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySet(), anyList(), any(File.class));
         compileTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testIllegalAccessExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySet(), anyList(), any(File.class));
         compileTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testDependencyResolutionRequiredExceptionThrowsMojoExecutionException() throws Exception {
         doThrow(mock(DependencyResolutionRequiredException.class)).when(compileTestsMojo.project).getTestClasspathElements();
         compileTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testMalformedURLExceptionThrowsMojoExecutionException() throws Exception {
-        doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(compileTestsMojo).doCompile(anySet(), anyList(), any(File.class));
         compileTestsMojo.execute();
     }
 
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/ExecuteMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/ExecuteMojoTest.java
index ffc58bd..2c899f1 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/ExecuteMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/ExecuteMojoTest.java
@@ -19,7 +19,7 @@ package org.codehaus.gmavenplus.mojo;
 import org.apache.maven.plugin.MojoExecution;
 import org.apache.maven.plugin.descriptor.MojoDescriptor;
 import org.apache.maven.project.MavenProject;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 import org.codehaus.gmavenplus.util.FileUtils;
 import org.junit.Before;
@@ -50,11 +50,10 @@ public class ExecuteMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         executeMojo = new ExecuteMojo();
         executeMojo.mojoExecution = mock(MojoExecution.class);
-        MavenProject project = mock(MavenProject.class);
-        executeMojo.project = project;
+        executeMojo.project = mock(MavenProject.class);
         MojoDescriptor mockMojoDescriptor = mock(MojoDescriptor.class);
         doReturn(mockMojoDescriptor).when(executeMojo.mojoExecution).getMojoDescriptor();
         doReturn("execute").when(mockMojoDescriptor).getGoal();
@@ -64,7 +63,7 @@ public class ExecuteMojoTest {
     public void testScriptString() throws Exception {
         File file = tmpDir.newFile();
         String line = "hello world";
-        executeMojo.scripts = new String[] {"new File('" + file.getAbsolutePath().replaceAll("\\\\", "/") + "').withWriter { w -> w << '" + line +"' }"};
+        executeMojo.scripts = new String[]{"new File('" + file.getAbsolutePath().replaceAll("\\\\", "/") + "').withWriter { w -> w << '" + line + "' }"};
 
         executeMojo.execute();
         BufferedReader reader = new BufferedReader(new FileReader(file));
@@ -79,7 +78,7 @@ public class ExecuteMojoTest {
         executeMojo.sourceEncoding = "UTF-8";
         File file = new File("target/testFile.txt");
         String line = "Hello world!";
-        executeMojo.scripts = new String[] {new File("src/test/resources/testScript.groovy").getCanonicalPath()};
+        executeMojo.scripts = new String[]{new File("src/test/resources/testScript.groovy").getCanonicalPath()};
 
         String actualLine;
         try {
@@ -99,7 +98,7 @@ public class ExecuteMojoTest {
         executeMojo.sourceEncoding = "UTF-8";
         File file = new File("target/testFile.txt");
         String line = "Hello world!";
-        executeMojo.scripts = new String[] {new File("src/test/resources/testScript.groovy").toURI().toURL().toString()};
+        executeMojo.scripts = new String[]{new File("src/test/resources/testScript.groovy").toURI().toURL().toString()};
 
         String actualLine;
         try {
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojoTest.java
index abe82a8..331d4d8 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/GenerateStubsMojoTest.java
@@ -21,7 +21,7 @@ import org.apache.maven.model.Build;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.model.fileset.FileSet;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 import org.junit.Before;
 import org.junit.Test;
@@ -49,7 +49,7 @@ public class GenerateStubsMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         doReturn(new TreeSet<File>()).when(generateStubsMojo).getFiles(any(FileSet[].class), eq(false));
         doReturn(new TreeSet<File>()).when(generateStubsMojo).getStubs(any(File.class));
         generateStubsMojo.project = mock(MavenProject.class);
@@ -63,54 +63,54 @@ public class GenerateStubsMojoTest {
     @SuppressWarnings("deprecation")
     public void testCallsExpectedMethods() throws Exception {
         doReturn(true).when(generateStubsMojo).groovyVersionSupportsAction();
-        doNothing().when(generateStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doNothing().when(generateStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateStubsMojo.execute();
-        verify(generateStubsMojo, times(1)).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        verify(generateStubsMojo, times(1)).doStubGeneration(anySet(), anyList(), any(File.class));
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testClassNotFoundExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateStubsMojo).groovyVersionSupportsAction();
-        doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testInvocationTargetExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateStubsMojo).groovyVersionSupportsAction();
-        doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testInstantiationExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateStubsMojo).groovyVersionSupportsAction();
-        doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testIllegalAccessExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateStubsMojo).groovyVersionSupportsAction();
-        doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testDependencyResolutionRequiredExceptionThrowsMojoExecutionException() throws Exception {
         doThrow(mock(DependencyResolutionRequiredException.class)).when(generateStubsMojo.project).getCompileClasspathElements();
         generateStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testMalformedURLExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateStubsMojo).groovyVersionSupportsAction();
-        doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateStubsMojo.execute();
     }
 
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/GenerateTestStubsMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/GenerateTestStubsMojoTest.java
index 7415cfe..0c15481 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/GenerateTestStubsMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/GenerateTestStubsMojoTest.java
@@ -21,7 +21,7 @@ import org.apache.maven.model.Build;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.model.fileset.FileSet;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 import org.junit.Before;
 import org.junit.Test;
@@ -49,7 +49,7 @@ public class GenerateTestStubsMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
+        MockitoAnnotations.openMocks(this);
         doReturn(new TreeSet<File>()).when(generateTestStubsMojo).getTestFiles(any(FileSet[].class), eq(false));
         doReturn(new TreeSet<File>()).when(generateTestStubsMojo).getStubs(any(File.class));
         generateTestStubsMojo.project = mock(MavenProject.class);
@@ -63,9 +63,9 @@ public class GenerateTestStubsMojoTest {
     @SuppressWarnings("deprecation")
     public void testCallsExpectedMethods() throws Exception {
         doReturn(true).when(generateTestStubsMojo).groovyVersionSupportsAction();
-        doNothing().when(generateTestStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doNothing().when(generateTestStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateTestStubsMojo.execute();
-        verify(generateTestStubsMojo, times(1)).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        verify(generateTestStubsMojo, times(1)).doStubGeneration(anySet(), anyList(), any(File.class));
     }
 
     @Test
@@ -74,52 +74,52 @@ public class GenerateTestStubsMojoTest {
         doReturn(true).when(generateTestStubsMojo).groovyVersionSupportsAction();
         generateTestStubsMojo.skipTests = true;
         generateTestStubsMojo.execute();
-        verify(generateTestStubsMojo, never()).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        verify(generateTestStubsMojo, never()).doStubGeneration(anySet(), anyList(), any(File.class));
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testClassNotFoundExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateTestStubsMojo).groovyVersionSupportsAction();
-        doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateTestStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testInvocationTargetExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateTestStubsMojo).groovyVersionSupportsAction();
-        doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateTestStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testInstantiationExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateTestStubsMojo).groovyVersionSupportsAction();
-        doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateTestStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testIllegalAccessExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateTestStubsMojo).groovyVersionSupportsAction();
-        doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateTestStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testDependencyResolutionRequiredExceptionThrowsMojoExecutionException() throws Exception {
         doThrow(mock(DependencyResolutionRequiredException.class)).when(generateTestStubsMojo.project).getTestClasspathElements();
         generateTestStubsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     @SuppressWarnings("deprecation")
     public void testMalformedURLExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(generateTestStubsMojo).groovyVersionSupportsAction();
-        doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySetOf(File.class), anyList(), any(File.class));
+        doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(generateTestStubsMojo).doStubGeneration(anySet(), anyList(), any(File.class));
         generateTestStubsMojo.execute();
     }
 
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/GroovyDocMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/GroovyDocMojoTest.java
index 91c3c63..3cbcb2d 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/GroovyDocMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/GroovyDocMojoTest.java
@@ -20,7 +20,7 @@ import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.model.fileset.FileSet;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 import org.junit.Before;
 import org.junit.Test;
@@ -49,8 +49,8 @@ public class GroovyDocMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
-        Set<File> sources = new TreeSet<File>();
+        MockitoAnnotations.openMocks(this);
+        Set<File> sources = new TreeSet<>();
         sources.add(mock(File.class));
         doReturn(sources).when(groovyDocMojo).getTestFiles(any(FileSet[].class), eq(false));
         groovyDocMojo.groovyDocOutputDirectory = mock(File.class);
@@ -70,42 +70,41 @@ public class GroovyDocMojoTest {
         doReturn(new Version(1, 5, 0)).when(groovyDocMojo.classWrangler).getGroovyVersion();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testClassNotFoundExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocMojo).groovyVersionSupportsAction();
         doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
         groovyDocMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testInvocationTargetExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocMojo).groovyVersionSupportsAction();
         doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
         groovyDocMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testInstantiationExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocMojo).groovyVersionSupportsAction();
         doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
         groovyDocMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testIllegalAccessExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocMojo).groovyVersionSupportsAction();
         doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
         groovyDocMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testDependencyResolutionRequiredExceptionThrowsMojoExecutionException() throws Exception {
         doThrow(mock(DependencyResolutionRequiredException.class)).when(groovyDocMojo.project).getRuntimeClasspathElements();
         groovyDocMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
-    @SuppressWarnings("unchecked")
+    @Test(expected = MojoExecutionException.class)
     public void testMalformedURLExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocMojo).groovyVersionSupportsAction();
         doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
diff --git a/src/test/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsMojoTest.java b/src/test/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsMojoTest.java
index 9b21a48..126ad7d 100644
--- a/src/test/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsMojoTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/mojo/GroovyDocTestsMojoTest.java
@@ -20,7 +20,7 @@ import org.apache.maven.artifact.DependencyResolutionRequiredException;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.model.fileset.FileSet;
-import org.codehaus.gmavenplus.model.Version;
+import org.codehaus.gmavenplus.model.internal.Version;
 import org.codehaus.gmavenplus.util.ClassWrangler;
 import org.junit.Before;
 import org.junit.Test;
@@ -49,8 +49,8 @@ public class GroovyDocTestsMojoTest {
 
     @Before
     public void setup() {
-        MockitoAnnotations.initMocks(this);
-        Set<File> sources = new TreeSet<File>();
+        MockitoAnnotations.openMocks(this);
+        Set<File> sources = new TreeSet<>();
         sources.add(mock(File.class));
         doReturn(sources).when(groovyDocTestsMojo).getTestFiles(any(FileSet[].class), eq(false));
         groovyDocTestsMojo.testGroovyDocOutputDirectory = mock(File.class);
@@ -68,42 +68,41 @@ public class GroovyDocTestsMojoTest {
         verify(groovyDocTestsMojo, times(1)).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testClassNotFoundExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocTestsMojo).groovyVersionSupportsAction();
         doThrow(new ClassNotFoundException(INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocTestsMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
         groovyDocTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testInvocationTargetExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocTestsMojo).groovyVersionSupportsAction();
         doThrow(new InvocationTargetException(mock(Exception.class), INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocTestsMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
         groovyDocTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testInstantiationExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocTestsMojo).groovyVersionSupportsAction();
         doThrow(new InstantiationException(INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocTestsMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
         groovyDocTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testIllegalAccessExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocTestsMojo).groovyVersionSupportsAction();
         doThrow(new IllegalAccessException(INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocTestsMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
         groovyDocTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
+    @Test(expected = MojoExecutionException.class)
     public void testDependencyResolutionRequiredExceptionThrowsMojoExecutionException() throws Exception {
         doThrow(mock(DependencyResolutionRequiredException.class)).when(groovyDocTestsMojo.project).getTestClasspathElements();
         groovyDocTestsMojo.execute();
     }
 
-    @Test (expected = MojoExecutionException.class)
-    @SuppressWarnings("unchecked")
+    @Test(expected = MojoExecutionException.class)
     public void testMalformedURLExceptionThrowsMojoExecutionException() throws Exception {
         doReturn(true).when(groovyDocTestsMojo).groovyVersionSupportsAction();
         doThrow(new MalformedURLException(INTENTIONAL_EXCEPTION_MESSAGE)).when(groovyDocTestsMojo).doGroovyDocGeneration(any(FileSet[].class), anyList(), any(File.class));
diff --git a/src/test/java/org/codehaus/gmavenplus/plexus/IncludeProjectCompileDependenciesComponentConfiguratorTest.java b/src/test/java/org/codehaus/gmavenplus/plexus/IncludeProjectCompileDependenciesComponentConfiguratorTest.java
deleted file mode 100644
index 21bea9e..0000000
--- a/src/test/java/org/codehaus/gmavenplus/plexus/IncludeProjectCompileDependenciesComponentConfiguratorTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2013 the original author or authors.
- *
- * 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.
- */
-
-package org.codehaus.gmavenplus.plexus;
-
-import org.codehaus.plexus.component.configurator.ConfigurationListener;
-import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup;
-import org.codehaus.plexus.component.configurator.converters.special.ClassRealmConverter;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.configuration.PlexusConfiguration;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.MockitoAnnotations;
-import org.mockito.Spy;
-
-import java.lang.reflect.Field;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-
-
-/**
- * Unit tests for the IncludeProjectCompileDependenciesComponentConfigurator class.
- *
- * @author Keegan Witt
- */
-public class IncludeProjectCompileDependenciesComponentConfiguratorTest {
-    @Spy
-    private IncludeProjectCompileDependenciesComponentConfigurator configurator = new IncludeProjectCompileDependenciesComponentConfigurator();
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @Test
-    public void testConfigureComponent_1() throws Exception {
-        ConverterLookup converterLookup = mock(ConverterLookup.class);
-        Field modifiersField = configurator.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("converterLookup");
-        modifiersField.setAccessible(true);
-        modifiersField.set(configurator, converterLookup);
-        Object component = mock(Object.class);
-        PlexusConfiguration configuration = mock(PlexusConfiguration.class);
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm = mock(org.codehaus.plexus.classworlds.realm.ClassRealm.class);
-        ConfigurationListener listener = mock(ConfigurationListener.class);
-        doReturn(true).when(configurator).shouldIncludeProjectDependencies(any(PlexusConfiguration.class));
-        doNothing().when(configurator).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.plexus.classworlds.realm.ClassRealm.class));
-
-        configurator.configureComponent(component, configuration, expressionEvaluator, containerRealm, listener);
-
-        verify(configurator, atLeastOnce()).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.plexus.classworlds.realm.ClassRealm.class));
-        verify(converterLookup, atLeastOnce()).registerConverter(any(ClassRealmConverter.class));
-    }
-
-    @Test
-    @SuppressWarnings("deprecation")
-    public void testConfigureComponent_2() throws Exception {
-        ConverterLookup converterLookup = mock(ConverterLookup.class);
-        Field modifiersField = configurator.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("converterLookup");
-        modifiersField.setAccessible(true);
-        modifiersField.set(configurator, converterLookup);
-        Object component = mock(Object.class);
-        PlexusConfiguration configuration = mock(PlexusConfiguration.class);
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        org.codehaus.classworlds.ClassRealm containerRealm = mock(org.codehaus.classworlds.ClassRealm.class);
-        ConfigurationListener listener = mock(ConfigurationListener.class);
-        doReturn(true).when(configurator).shouldIncludeProjectDependencies(any(PlexusConfiguration.class));
-        doNothing().when(configurator).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.classworlds.ClassRealm.class));
-
-        configurator.configureComponent(component, configuration, expressionEvaluator, containerRealm, listener);
-
-        verify(configurator, atLeastOnce()).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.classworlds.ClassRealm.class));
-        verify(converterLookup, atLeastOnce()).registerConverter(any(ClassRealmConverter.class));
-    }
-
-    @Test
-    @SuppressWarnings("deprecation")
-    public void testAddProjectCompileDependenciesToClassRealm() throws Exception {
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        List<?> classpathElements = singletonList("CLASSPATH_ELEMENT");
-        doReturn(classpathElements).when(expressionEvaluator).evaluate(anyString());
-        org.codehaus.classworlds.ClassRealm containerRealm = mock(org.codehaus.classworlds.ClassRealm.class);
-        configurator.addDependenciesToClassRealm(expressionEvaluator, IncludeProjectCompileDependenciesComponentConfigurator.Classpath.COMPILE, containerRealm);
-        verify(expressionEvaluator, times(1)).evaluate(anyString());
-        verify(containerRealm, times(1)).addConstituent(any(URL.class));
-    }
-
-    @Test
-    public void testAddProjectCompileDependenciesToPlexusClassRealm() throws Exception {
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        List<?> classpathElements = singletonList("CLASSPATH_ELEMENT");
-        doReturn(classpathElements).when(expressionEvaluator).evaluate(anyString());
-        org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm = mock(org.codehaus.plexus.classworlds.realm.ClassRealm.class);
-        configurator.addDependenciesToClassRealm(expressionEvaluator, IncludeProjectCompileDependenciesComponentConfigurator.Classpath.COMPILE, containerRealm);
-        verify(expressionEvaluator, times(1)).evaluate(anyString());
-        verify(containerRealm, times(1)).addURL(any(URL.class));
-    }
-
-    @Test
-    public void testBuildURLs() throws Exception {
-        List<String> elements = new ArrayList<String>();
-        elements.add("ELEMENT_1");
-        URL[] urls = configurator.buildURLs(elements);
-        assertEquals(elements.size(), urls.length);
-    }
-
-}
diff --git a/src/test/java/org/codehaus/gmavenplus/plexus/IncludeProjectRuntimeDependenciesComponentConfiguratorTest.java b/src/test/java/org/codehaus/gmavenplus/plexus/IncludeProjectRuntimeDependenciesComponentConfiguratorTest.java
deleted file mode 100644
index 7081750..0000000
--- a/src/test/java/org/codehaus/gmavenplus/plexus/IncludeProjectRuntimeDependenciesComponentConfiguratorTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2013 the original author or authors.
- *
- * 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.
- */
-
-package org.codehaus.gmavenplus.plexus;
-
-import org.codehaus.plexus.component.configurator.ConfigurationListener;
-import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup;
-import org.codehaus.plexus.component.configurator.converters.special.ClassRealmConverter;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.configuration.PlexusConfiguration;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.MockitoAnnotations;
-import org.mockito.Spy;
-
-import java.lang.reflect.Field;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-
-
-/**
- * Unit tests for the IncludeProjectRuntimeDependenciesComponentConfigurator class.
- *
- * @author Keegan Witt
- */
-public class IncludeProjectRuntimeDependenciesComponentConfiguratorTest {
-    @Spy
-    private IncludeProjectRuntimeDependenciesComponentConfigurator configurator = new IncludeProjectRuntimeDependenciesComponentConfigurator();
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @Test
-    public void testConfigureComponent_1() throws Exception {
-        ConverterLookup converterLookup = mock(ConverterLookup.class);
-        Field modifiersField = configurator.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("converterLookup");
-        modifiersField.setAccessible(true);
-        modifiersField.set(configurator, converterLookup);
-        Object component = mock(Object.class);
-        PlexusConfiguration configuration = mock(PlexusConfiguration.class);
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm = mock(org.codehaus.plexus.classworlds.realm.ClassRealm.class);
-        ConfigurationListener listener = mock(ConfigurationListener.class);
-        doReturn(true).when(configurator).shouldIncludeProjectDependencies(any(PlexusConfiguration.class));
-        doNothing().when(configurator).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.plexus.classworlds.realm.ClassRealm.class));
-
-        configurator.configureComponent(component, configuration, expressionEvaluator, containerRealm, listener);
-
-        verify(configurator, atLeastOnce()).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.plexus.classworlds.realm.ClassRealm.class));
-        verify(converterLookup, atLeastOnce()).registerConverter(any(ClassRealmConverter.class));
-    }
-
-    @Test
-    @SuppressWarnings("deprecation")
-    public void testConfigureComponent_2() throws Exception {
-        ConverterLookup converterLookup = mock(ConverterLookup.class);
-        Field modifiersField = configurator.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("converterLookup");
-        modifiersField.setAccessible(true);
-        modifiersField.set(configurator, converterLookup);
-        Object component = mock(Object.class);
-        PlexusConfiguration configuration = mock(PlexusConfiguration.class);
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        org.codehaus.classworlds.ClassRealm containerRealm = mock(org.codehaus.classworlds.ClassRealm.class);
-        ConfigurationListener listener = mock(ConfigurationListener.class);
-        doReturn(true).when(configurator).shouldIncludeProjectDependencies(any(PlexusConfiguration.class));
-        doNothing().when(configurator).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.classworlds.ClassRealm.class));
-
-        configurator.configureComponent(component, configuration, expressionEvaluator, containerRealm, listener);
-
-        verify(configurator, atLeastOnce()).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.classworlds.ClassRealm.class));
-        verify(converterLookup, atLeastOnce()).registerConverter(any(ClassRealmConverter.class));
-    }
-
-    @Test
-    @SuppressWarnings("deprecation")
-    public void testAddProjectRuntimeDependenciesToClassRealm() throws Exception {
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        List<?> classpathElements = singletonList("CLASSPATH_ELEMENT");
-        doReturn(classpathElements).when(expressionEvaluator).evaluate(anyString());
-        org.codehaus.classworlds.ClassRealm containerRealm = mock(org.codehaus.classworlds.ClassRealm.class);
-        configurator.addDependenciesToClassRealm(expressionEvaluator, IncludeProjectRuntimeDependenciesComponentConfigurator.Classpath.RUNTIME, containerRealm);
-        verify(expressionEvaluator, times(1)).evaluate(anyString());
-        verify(containerRealm, times(1)).addConstituent(any(URL.class));
-    }
-
-    @Test
-    public void testAddProjectRuntimeDependenciesToPlexusClassRealm() throws Exception {
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        List<?> classpathElements = singletonList("CLASSPATH_ELEMENT");
-        doReturn(classpathElements).when(expressionEvaluator).evaluate(anyString());
-        org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm = mock(org.codehaus.plexus.classworlds.realm.ClassRealm.class);
-        configurator.addDependenciesToClassRealm(expressionEvaluator, IncludeProjectRuntimeDependenciesComponentConfigurator.Classpath.RUNTIME, containerRealm);
-        verify(expressionEvaluator, times(1)).evaluate(anyString());
-        verify(containerRealm, times(1)).addURL(any(URL.class));
-    }
-
-    @Test
-    public void testBuildURLs() throws Exception {
-        List<String> elements = new ArrayList<String>();
-        elements.add("ELEMENT_1");
-        URL[] urls = configurator.buildURLs(elements);
-        assertEquals(elements.size(), urls.length);
-    }
-
-}
diff --git a/src/test/java/org/codehaus/gmavenplus/plexus/IncludeProjectTestDependenciesComponentConfiguratorTest.java b/src/test/java/org/codehaus/gmavenplus/plexus/IncludeProjectTestDependenciesComponentConfiguratorTest.java
deleted file mode 100644
index 64e79f9..0000000
--- a/src/test/java/org/codehaus/gmavenplus/plexus/IncludeProjectTestDependenciesComponentConfiguratorTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright 2013 the original author or authors.
- *
- * 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.
- */
-
-package org.codehaus.gmavenplus.plexus;
-
-import org.codehaus.plexus.component.configurator.ConfigurationListener;
-import org.codehaus.plexus.component.configurator.converters.lookup.ConverterLookup;
-import org.codehaus.plexus.component.configurator.converters.special.ClassRealmConverter;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.configuration.PlexusConfiguration;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.MockitoAnnotations;
-import org.mockito.Spy;
-
-import java.lang.reflect.Field;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-import static java.util.Collections.singletonList;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.*;
-
-
-/**
- * Unit tests for the IncludeProjectTestDependenciesComponentConfigurator class.
- *
- * @author Keegan Witt
- */
-public class IncludeProjectTestDependenciesComponentConfiguratorTest {
-    @Spy
-    private IncludeProjectTestDependenciesComponentConfigurator configurator = new IncludeProjectTestDependenciesComponentConfigurator();
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-    }
-
-    @Test
-    public void testConfigureComponent_1() throws Exception {
-        ConverterLookup converterLookup = mock(ConverterLookup.class);
-        Field modifiersField = configurator.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("converterLookup");
-        modifiersField.setAccessible(true);
-        modifiersField.set(configurator, converterLookup);
-        Object component = mock(Object.class);
-        PlexusConfiguration configuration = mock(PlexusConfiguration.class);
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm = mock(org.codehaus.plexus.classworlds.realm.ClassRealm.class);
-        ConfigurationListener listener = mock(ConfigurationListener.class);
-        doReturn(true).when(configurator).shouldIncludeProjectDependencies(any(PlexusConfiguration.class));
-        doNothing().when(configurator).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.plexus.classworlds.realm.ClassRealm.class));
-
-        configurator.configureComponent(component, configuration, expressionEvaluator, containerRealm, listener);
-
-        verify(configurator, atLeastOnce()).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.plexus.classworlds.realm.ClassRealm.class));
-        verify(converterLookup, atLeastOnce()).registerConverter(any(ClassRealmConverter.class));
-    }
-
-    @Test
-    @SuppressWarnings("deprecation")
-    public void testConfigureComponent_2() throws Exception {
-        ConverterLookup converterLookup = mock(ConverterLookup.class);
-        Field modifiersField = configurator.getClass().getSuperclass().getSuperclass().getSuperclass().getDeclaredField("converterLookup");
-        modifiersField.setAccessible(true);
-        modifiersField.set(configurator, converterLookup);
-        Object component = mock(Object.class);
-        PlexusConfiguration configuration = mock(PlexusConfiguration.class);
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        org.codehaus.classworlds.ClassRealm containerRealm = mock(org.codehaus.classworlds.ClassRealm.class);
-        ConfigurationListener listener = mock(ConfigurationListener.class);
-        doReturn(true).when(configurator).shouldIncludeProjectDependencies(any(PlexusConfiguration.class));
-        doNothing().when(configurator).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.classworlds.ClassRealm.class));
-
-        configurator.configureComponent(component, configuration, expressionEvaluator, containerRealm, listener);
-
-        verify(configurator, atLeastOnce()).addDependenciesToClassRealm(any(ExpressionEvaluator.class), any(AbstractIncludeProjectDependenciesComponentConfigurator.Classpath.class), any(org.codehaus.classworlds.ClassRealm.class));
-        verify(converterLookup, atLeastOnce()).registerConverter(any(ClassRealmConverter.class));
-    }
-
-    @Test
-    @SuppressWarnings("deprecation")
-    public void testAddProjectTestDependenciesToClassRealm() throws Exception {
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        List<?> classpathElements = singletonList("CLASSPATH_ELEMENT");
-        doReturn(classpathElements).when(expressionEvaluator).evaluate(anyString());
-        org.codehaus.classworlds.ClassRealm containerRealm = mock(org.codehaus.classworlds.ClassRealm.class);
-        configurator.addDependenciesToClassRealm(expressionEvaluator, IncludeProjectTestDependenciesComponentConfigurator.Classpath.TEST, containerRealm);
-        verify(expressionEvaluator, times(1)).evaluate(anyString());
-        verify(containerRealm, times(1)).addConstituent(any(URL.class));
-    }
-
-    @Test
-    public void testAddProjectTestDependenciesToPlexusClassRealm() throws Exception {
-        ExpressionEvaluator expressionEvaluator = mock(ExpressionEvaluator.class);
-        List<?> classpathElements = singletonList("CLASSPATH_ELEMENT");
-        doReturn(classpathElements).when(expressionEvaluator).evaluate(anyString());
-        org.codehaus.plexus.classworlds.realm.ClassRealm containerRealm = mock(org.codehaus.plexus.classworlds.realm.ClassRealm.class);
-        configurator.addDependenciesToClassRealm(expressionEvaluator, IncludeProjectTestDependenciesComponentConfigurator.Classpath.TEST, containerRealm);
-        verify(expressionEvaluator, times(1)).evaluate(anyString());
-        verify(containerRealm, times(1)).addURL(any(URL.class));
-    }
-
-    @Test
-    public void testBuildURLs() throws Exception {
-        List<String> elements = new ArrayList<String>();
-        elements.add("ELEMENT_1");
-        URL[] urls = configurator.buildURLs(elements);
-        assertEquals(elements.size(), urls.length);
-    }
-
-}
diff --git a/src/test/java/org/codehaus/gmavenplus/util/ClassWranglerTest.java b/src/test/java/org/codehaus/gmavenplus/util/ClassWranglerTest.java
index 2a4e426..9663fc9 100644
--- a/src/test/java/org/codehaus/gmavenplus/util/ClassWranglerTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/util/ClassWranglerTest.java
@@ -20,8 +20,8 @@ import org.apache.maven.plugin.logging.Log;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 
+import static java.util.Collections.emptyList;
 import static org.junit.Assert.*;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.*;
 
 
@@ -34,7 +34,7 @@ public class ClassWranglerTest {
 
     @Test
     public void testGetGroovyJar() throws Exception {
-        ClassWrangler classWrangler = spy(new ClassWrangler((ClassLoader) null, mock(Log.class)));
+        ClassWrangler classWrangler = spy(new ClassWrangler(emptyList(), null, mock(Log.class)));
         doThrow(new ClassNotFoundException("Throwing exception to force GMavenPlus to get version from jar.")).when(classWrangler).getClass(anyString());
         doReturn("some/path/groovy-all-1.5.0.jar").when(classWrangler).getJarPath();
         assertEquals("groovy-all-1.5.0.jar", classWrangler.getGroovyJar());
@@ -42,7 +42,7 @@ public class ClassWranglerTest {
 
     @Test
     public void testGetGroovyVersionStringFromGroovySystemThenFromInvokerHelper() throws Exception {
-        ClassWrangler classWrangler = spy(new ClassWrangler((ClassLoader) null, mock(Log.class)));
+        ClassWrangler classWrangler = spy(new ClassWrangler(emptyList(), null, mock(Log.class)));
         doThrow(new ClassNotFoundException("Throwing exception to force GMavenPlus to try other methods."))
                 .when(classWrangler).getClass(anyString());
         doReturn("some/path/groovy-all-1.5.0.jar").when(classWrangler).getJarPath();
@@ -55,7 +55,7 @@ public class ClassWranglerTest {
 
     @Test
     public void testGetGroovyVersionStringFromJar() throws Exception {
-        ClassWrangler classWrangler = spy(new ClassWrangler((ClassLoader) null, mock(Log.class)));
+        ClassWrangler classWrangler = spy(new ClassWrangler(emptyList(), null, mock(Log.class)));
         doThrow(new ClassNotFoundException("Throwing exception to force GMavenPlus to get version from jar.")).when(classWrangler).getClass(anyString());
         doReturn("some/path/groovy-all-1.5.0.jar").when(classWrangler).getJarPath();
         assertEquals("1.5.0", classWrangler.getGroovyVersionString());
@@ -63,7 +63,7 @@ public class ClassWranglerTest {
 
     @Test
     public void testGetGroovyVersionWithIndyFromJar() throws Exception {
-        ClassWrangler classWrangler = spy(new ClassWrangler((ClassLoader) null, mock(Log.class)));
+        ClassWrangler classWrangler = spy(new ClassWrangler(emptyList(), null, mock(Log.class)));
         doThrow(new ClassNotFoundException("Throwing exception to force GMavenPlus to get version from jar.")).when(classWrangler).getClass(anyString());
         doReturn("some/path/groovy-all-2.4.0-indy.jar").when(classWrangler).getJarPath();
         assertEquals("2.4.0", classWrangler.getGroovyVersion().toString());
@@ -71,7 +71,7 @@ public class ClassWranglerTest {
 
     @Test
     public void testGetGroovyVersionWithGrooidFromJar() throws Exception {
-        ClassWrangler classWrangler = spy(new ClassWrangler((ClassLoader) null, mock(Log.class)));
+        ClassWrangler classWrangler = spy(new ClassWrangler(emptyList(), null, mock(Log.class)));
         doThrow(new ClassNotFoundException("Throwing exception to force GMavenPlus to get version from jar.")).when(classWrangler).getClass(anyString());
         doReturn("some/path/groovy-all-2.4.0-grooid.jar").when(classWrangler).getJarPath();
         assertEquals("2.4.0", classWrangler.getGroovyVersion().toString());
@@ -79,14 +79,14 @@ public class ClassWranglerTest {
 
     @Test
     public void testIsGroovyIndyTrue() throws Exception {
-        ClassWrangler classWrangler = spy(new ClassWrangler((ClassLoader) null, mock(Log.class)));
+        ClassWrangler classWrangler = spy(new ClassWrangler(emptyList(), null, mock(Log.class)));
         doReturn(null).when(classWrangler).getClass(anyString());  // make it appear Groovy is indy
         assertTrue(classWrangler.isGroovyIndy());
     }
 
     @Test
     public void testIsGroovyIndyFalse() throws Exception {
-        ClassWrangler classWrangler = spy(new ClassWrangler((ClassLoader) null, mock(Log.class)));
+        ClassWrangler classWrangler = spy(new ClassWrangler(emptyList(), null, mock(Log.class)));
         doThrow(new ClassNotFoundException("Throwing exception to make it appear Groovy is not indy.")).when(classWrangler).getClass(anyString());
         assertFalse(classWrangler.isGroovyIndy());
     }
diff --git a/src/test/java/org/codehaus/gmavenplus/util/ReflectionUtilsTest.java b/src/test/java/org/codehaus/gmavenplus/util/ReflectionUtilsTest.java
index e4dc448..39a8eb7 100644
--- a/src/test/java/org/codehaus/gmavenplus/util/ReflectionUtilsTest.java
+++ b/src/test/java/org/codehaus/gmavenplus/util/ReflectionUtilsTest.java
@@ -37,7 +37,7 @@ public class ReflectionUtilsTest {
         assertEquals(TestClass.HELLO_WORLD, ReflectionUtils.invokeStaticMethod(ReflectionUtils.findMethod(TestClass.class, "helloWorld")));
         assertEquals(TestClass.ENUM.VALUE, ReflectionUtils.getEnumValue(TestClass.ENUM.class, "VALUE"));
         assertEquals(TestClass.HELLO_WORLD, ReflectionUtils.getStaticField(ReflectionUtils.findField(TestClass.class, "HELLO_WORLD", null)));
-        Object test2 = ReflectionUtils.invokeConstructor(ReflectionUtils.findConstructor(TestClass.class, String.class), expectedString );
+        Object test2 = ReflectionUtils.invokeConstructor(ReflectionUtils.findConstructor(TestClass.class, String.class), expectedString);
         assertEquals(expectedString, ReflectionUtils.getField(ReflectionUtils.findField(TestClass.class, "stringField", String.class), test2));
     }
 
@@ -130,7 +130,8 @@ public class ReflectionUtilsTest {
         public static final String HELLO_WORLD = "Hello world!";
         public String stringField;
 
-        public TestClass() { }
+        public TestClass() {
+        }
 
         public TestClass(String newStringField) {
             stringField = newStringField;
@@ -148,7 +149,7 @@ public class ReflectionUtilsTest {
             return HELLO_WORLD;
         }
 
-        protected static enum ENUM {
+        protected enum ENUM {
             VALUE
         }
     }