diff --git a/pom.xml b/pom.xml
index d5f7c10..5fafc54 100644
--- a/pom.xml
+++ b/pom.xml
@@ -68,6 +68,7 @@
     <groovyEclipseCompilerVersion>2.7.0-01</groovyEclipseCompilerVersion>
     <groovy-eclipse-batch>2.0.4-04</groovy-eclipse-batch>
     <openJpaVersion>2.2.0</openJpaVersion>
+    <javaVersion>7</javaVersion>
   </properties>
 
   <contributors>
@@ -110,14 +111,9 @@
     </dependency>
 
     <dependency>
-      <groupId>org.ow2.asm</groupId>
-      <artifactId>asm</artifactId>
-      <version>6.0_BETA</version>
-    </dependency>
-    <dependency>
-      <groupId>com.thoughtworks.qdox</groupId>
-      <artifactId>qdox</artifactId>
-      <version>2.0-M7</version>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-java</artifactId>
+      <version>0.9.1</version>
     </dependency>
 
     <dependency>
@@ -313,18 +309,4 @@
       </dependencies>
     </profile>
   </profiles>
-
-  <repositories>
-    <repository>
-      <releases>
-        <enabled>false</enabled>
-      </releases>
-      <snapshots>
-        <enabled>true</enabled>
-      </snapshots>
-      <id>plexus-snapshots</id>
-      <name>Plexus Snapshot Repository</name>
-      <url>https://oss.sonatype.org/content/repositories/plexus-snapshots</url>
-    </repository>
-  </repositories>
 </project>
diff --git a/src/it/MCOMPILER-268_modulepath/pom.xml b/src/it/MCOMPILER-268_modulepath/pom.xml
index 82bf9f2..5ccd455 100644
--- a/src/it/MCOMPILER-268_modulepath/pom.xml
+++ b/src/it/MCOMPILER-268_modulepath/pom.xml
@@ -35,6 +35,11 @@
 
   <dependencies>
     <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+      <version>3.6</version>
+    </dependency>
+    <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
       <version>3.8.2</version>
diff --git a/src/it/MCOMPILER-268_modulepath/src/main/java/module-info.java b/src/it/MCOMPILER-268_modulepath/src/main/java/module-info.java
index c0e023a..d9800e3 100644
--- a/src/it/MCOMPILER-268_modulepath/src/main/java/module-info.java
+++ b/src/it/MCOMPILER-268_modulepath/src/main/java/module-info.java
@@ -18,5 +18,5 @@
  */
 
 module M.N {
-    
+    requires org.apache.commons.lang3;
 }
\ No newline at end of file
diff --git a/src/it/MCOMPILER-294/app/pom.xml b/src/it/MCOMPILER-294/app/pom.xml
new file mode 100644
index 0000000..6eac746
--- /dev/null
+++ b/src/it/MCOMPILER-294/app/pom.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.plugins.compiler.it</groupId>
+    <artifactId>mcompiler294</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>app</artifactId>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugins.compiler.it</groupId>
+      <artifactId>lib</artifactId>
+      <version>1.0-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/src/it/MCOMPILER-294/app/src/main/java/module-info.java b/src/it/MCOMPILER-294/app/src/main/java/module-info.java
new file mode 100644
index 0000000..3cda721
--- /dev/null
+++ b/src/it/MCOMPILER-294/app/src/main/java/module-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module org.maven.test.app {
+    requires org.maven.test.lib;
+}
\ No newline at end of file
diff --git a/src/it/MCOMPILER-294/app/src/main/java/org/maven/test/app/Main.java b/src/it/MCOMPILER-294/app/src/main/java/org/maven/test/app/Main.java
new file mode 100644
index 0000000..5d94eec
--- /dev/null
+++ b/src/it/MCOMPILER-294/app/src/main/java/org/maven/test/app/Main.java
@@ -0,0 +1,32 @@
+package org.maven.test.app;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.maven.test.lib.Sout;
+
+public class Main {
+    
+    /**
+     * @param args
+     */
+    public static void main(String[] args) {
+        Sout.println( args );
+    }
+}
\ No newline at end of file
diff --git a/src/it/MCOMPILER-294/invoker.properties b/src/it/MCOMPILER-294/invoker.properties
new file mode 100644
index 0000000..8d76986
--- /dev/null
+++ b/src/it/MCOMPILER-294/invoker.properties
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+invoker.java.version = 9+
+invoker.goals = compile
diff --git a/src/it/MCOMPILER-294/lib/pom.xml b/src/it/MCOMPILER-294/lib/pom.xml
new file mode 100644
index 0000000..ec3cc61
--- /dev/null
+++ b/src/it/MCOMPILER-294/lib/pom.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.maven.plugins.compiler.it</groupId>
+    <artifactId>mcompiler294</artifactId>
+    <version>1.0-SNAPSHOT</version>
+  </parent>
+  <artifactId>lib</artifactId>
+
+</project>
diff --git a/src/it/MCOMPILER-294/lib/src/main/java/module-info.java b/src/it/MCOMPILER-294/lib/src/main/java/module-info.java
new file mode 100644
index 0000000..a218436
--- /dev/null
+++ b/src/it/MCOMPILER-294/lib/src/main/java/module-info.java
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+module org.maven.test.lib {
+    exports org.maven.test.lib;
+}
\ No newline at end of file
diff --git a/src/it/MCOMPILER-294/lib/src/main/java/org/maven/test/lib/Sout.java b/src/it/MCOMPILER-294/lib/src/main/java/org/maven/test/lib/Sout.java
new file mode 100644
index 0000000..658044e
--- /dev/null
+++ b/src/it/MCOMPILER-294/lib/src/main/java/org/maven/test/lib/Sout.java
@@ -0,0 +1,33 @@
+package org.maven.test.lib;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+public class Sout {
+    
+    /**
+     * @param args
+     */
+    public static void println(String[] args) {
+        for ( String string : args )
+        {
+            System.out.println( args );
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/it/MCOMPILER-294/pom.xml b/src/it/MCOMPILER-294/pom.xml
new file mode 100644
index 0000000..4e3ec93
--- /dev/null
+++ b/src/it/MCOMPILER-294/pom.xml
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <groupId>org.apache.maven.plugins.compiler.it</groupId>
+  <artifactId>mcompiler294</artifactId>
+  <version>1.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <url>https://issues.apache.org/jira/browse/MCOMPILER-294</url>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+  </properties>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>@project.version@</version>
+        <configuration>
+          <release>9</release>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+  
+  <modules>
+    <module>lib</module>
+    <module>app</module>
+  </modules>
+
+</project>
diff --git a/src/it/automodules-application/verify.groovy b/src/it/automodules-application/verify.groovy
index 9524a2f..4ce088d 100644
--- a/src/it/automodules-application/verify.groovy
+++ b/src/it/automodules-application/verify.groovy
@@ -19,4 +19,4 @@
 
 buildLog = new File( basedir, 'build.log' ).text;
 
-assert buildLog.contains("[INFO] Required automodules detected. Please don't publish this project to a public artifact repository!");
+assert buildLog.contains("[INFO] Required filename-based automodules detected. Please don't publish this project to a public artifact repository!");
diff --git a/src/it/automodules-library/verify.groovy b/src/it/automodules-library/verify.groovy
index 15c7a52..fb2d1d1 100644
--- a/src/it/automodules-library/verify.groovy
+++ b/src/it/automodules-library/verify.groovy
@@ -19,4 +19,4 @@
 
 buildLog = new File( basedir, 'build.log' ).text;
 
-assert buildLog.contains("[WARNING] * Required automodules detected. Please don't publish this project to a public artifact repository! *");
+assert buildLog.contains("[WARNING] * Required filename-based automodules detected. Please don't publish this project to a public artifact repository! *");
diff --git a/src/it/automodules-transitive-module/verify.groovy b/src/it/automodules-transitive-module/verify.groovy
index 15c7a52..fb2d1d1 100644
--- a/src/it/automodules-transitive-module/verify.groovy
+++ b/src/it/automodules-transitive-module/verify.groovy
@@ -19,4 +19,4 @@
 
 buildLog = new File( basedir, 'build.log' ).text;
 
-assert buildLog.contains("[WARNING] * Required automodules detected. Please don't publish this project to a public artifact repository! *");
+assert buildLog.contains("[WARNING] * Required filename-based automodules detected. Please don't publish this project to a public artifact repository! *");
diff --git a/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java b/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java
index a7857e9..84bb300 100644
--- a/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java
+++ b/src/main/java/org/apache/maven/plugin/compiler/AbstractCompilerMojo.java
@@ -1227,7 +1227,7 @@
 
     //TODO remove the part with ToolchainManager lookup once we depend on
     //3.0.9 (have it as prerequisite). Define as regular component field then.
-    private Toolchain getToolchain()
+    protected final Toolchain getToolchain()
     {
         Toolchain tc = null;
         
diff --git a/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java b/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java
index ef9db32..be6f096 100644
--- a/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java
+++ b/src/main/java/org/apache/maven/plugin/compiler/CompilerMojo.java
@@ -31,12 +31,6 @@
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.compiler.module.JavaModuleDescriptor;
-import org.apache.maven.plugin.compiler.module.ModuleInfoParser;
-import org.apache.maven.plugin.compiler.module.ProjectAnalyzer;
-import org.apache.maven.plugin.compiler.module.ProjectAnalyzerRequest;
-import org.apache.maven.plugin.compiler.module.ProjectAnalyzerResult;
-import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
@@ -44,9 +38,17 @@
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.shared.utils.StringUtils;
 import org.apache.maven.shared.utils.logging.MessageUtils;
+import org.apache.maven.toolchain.Toolchain;
+import org.apache.maven.toolchain.java.DefaultJavaToolChain;
 import org.codehaus.plexus.compiler.util.scan.SimpleSourceInclusionScanner;
 import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
 import org.codehaus.plexus.compiler.util.scan.StaleSourceScanner;
+import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor;
+import org.codehaus.plexus.languages.java.jpms.LocationManager;
+import org.codehaus.plexus.languages.java.jpms.QDoxModuleInfoParser;
+import org.codehaus.plexus.languages.java.jpms.ResolvePathsRequest;
+import org.codehaus.plexus.languages.java.jpms.ResolvePathsResult;
+import org.codehaus.plexus.languages.java.jpms.ResolvePathsResult.ModuleNameSource;
 
 /**
  * Compiles application sources
@@ -115,11 +117,9 @@
     @Parameter
     private boolean allowPartialRequirements;
 
-    @Component( hint = "qdox" )
-    private ModuleInfoParser moduleInfoParser;
+    private QDoxModuleInfoParser moduleInfoParser = new QDoxModuleInfoParser();
 
-    @Component
-    private ProjectAnalyzer projectAnalyzer;
+    private LocationManager locationManager = new LocationManager();
 
     private List<String> classpathElements;
 
@@ -177,7 +177,7 @@
             {
                 try
                 {
-                    moduleDescriptor = moduleInfoParser.getModuleDescriptor( sourceFile.getParentFile() );
+                    moduleDescriptor = moduleInfoParser.fromSourcePath( sourceFile.getParentFile().toPath() );
                 }
                 catch ( IOException e )
                 {
@@ -197,92 +197,57 @@
             modulepathElements = new ArrayList<String>( compilePath.size() );
             classpathElements = new ArrayList<String>( compilePath.size() );
 
-            ProjectAnalyzerResult analyzerResult;
+            ResolvePathsResult<File> analyzerResult;
             try
             {
                 Collection<File> dependencyArtifacts = getCompileClasspathElements( getProject() );
-
-                ProjectAnalyzerRequest analyzerRequest = new ProjectAnalyzerRequest()
-                                .setBaseModuleDescriptor( moduleDescriptor )
-                                .setDependencyArtifacts( dependencyArtifacts );
-
-                analyzerResult = projectAnalyzer.analyze( analyzerRequest );
-
-                if ( !analyzerResult.getRequiredAutomaticModules().isEmpty() )
+                
+                ResolvePathsRequest<File> request =
+                    ResolvePathsRequest.withFiles( dependencyArtifacts ).setMainModuleDescriptor( moduleDescriptor );
+                
+                Toolchain toolchain = getToolchain();
+                if ( toolchain != null && toolchain instanceof DefaultJavaToolChain )
                 {
-                    boolean filenameBased = false;
-                    
-                    for ( String automodule : analyzerResult.getRequiredAutomaticModules() )
+                    request.setJdkHome( new File( ( (DefaultJavaToolChain) toolchain ).getJavaHome() ) );
+                }
+
+                analyzerResult = locationManager.resolvePaths( request );
+
+                for ( Map.Entry<File, ModuleNameSource> entry : analyzerResult.getModulepathElements().entrySet() )
+                {
+                    if ( ModuleNameSource.FILENAME.equals( entry.getValue() ) )
                     {
-                        filenameBased =
-                            ProjectAnalyzerResult.ModuleNameSource.FILENAME.equals( 
-                                                            analyzerResult.getModuleNameSource( automodule ) );
-                        
-                        if ( filenameBased )
+                        final String message = "Required filename-based automodules detected. "
+                            + "Please don't publish this project to a public artifact repository!";
+
+                        if ( moduleDescriptor.exports().isEmpty() )
                         {
-                            final String message = "Required automodules detected. "
-                                + "Please don't publish this project to a public artifact repository!";
-                            
-                            if ( moduleDescriptor.exports().isEmpty() )
-                            {
-                                // application
-                                getLog().info( message );
-                            }
-                            else
-                            {
-                                // library
-                                writeBoxedWarning( message );
-                            }
-                            
-                            break;
+                            // application
+                            getLog().info( message );
                         }
+                        else
+                        {
+                            // library
+                            writeBoxedWarning( message );
+                        }
+                        break;
                     }
                 }
                 
-                for ( Map.Entry<File, JavaModuleDescriptor> entry : analyzerResult.getPathElements().entrySet() )
+                for ( File file : analyzerResult.getClasspathElements() )
                 {
-                    if ( !allowPartialRequirements )
-                    {
-                        modulepathElements.add( entry.getKey().getPath() );
-                    }
-                    else if ( entry.getValue() == null )
-                    {
-                        classpathElements.add( entry.getKey().getPath() );
-                    }
-                    else if ( analyzerResult.getRequiredNormalModules().contains( entry.getValue().name() ) )
-                    {
-                        modulepathElements.add( entry.getKey().getPath() );
-                    }
-                    else if ( analyzerResult.getRequiredAutomaticModules().contains( entry.getValue().name() ) )
-                    {
-                        modulepathElements.add( entry.getKey().getPath() );
-                    }
-                    else
-                    {
-                        classpathElements.add( entry.getKey().getPath() );
-                    }
+                    classpathElements.add( file.getPath() );
+                }
+                
+                for ( File file : analyzerResult.getModulepathElements().keySet() )
+                {
+                    modulepathElements.add( file.getPath() );
                 }
             }
             catch ( IOException e )
             {
                 getLog().warn( e.getMessage() );
             }
-
-//            if ( !classpathElements.isEmpty() )
-//            {
-//                if ( compilerArgs == null )
-//                {
-//                    compilerArgs = new ArrayList<String>();
-//                }
-//                compilerArgs.add( "--add-reads" );
-//                compilerArgs.add( moduleDescriptor.name() + "=ALL-UNNAMED" );
-//
-//                if ( !modulepathElements.isEmpty() )
-//                {
-//                    compilerArgs.add( "--add-reads" );
-//                    compilerArgs.add( "ALL-MODULE-PATH=ALL-UNNAMED" );
-//                }
-//            }
         }
         else
         {
diff --git a/src/main/java/org/apache/maven/plugin/compiler/TestCompilerMojo.java b/src/main/java/org/apache/maven/plugin/compiler/TestCompilerMojo.java
index 0651508..9f4c7c0 100644
--- a/src/main/java/org/apache/maven/plugin/compiler/TestCompilerMojo.java
+++ b/src/main/java/org/apache/maven/plugin/compiler/TestCompilerMojo.java
@@ -20,25 +20,30 @@
  */
 
 import java.io.File;
+import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.compiler.module.ModuleInfoParser;
-import org.apache.maven.plugins.annotations.Component;
 import org.apache.maven.plugins.annotations.LifecyclePhase;
 import org.apache.maven.plugins.annotations.Mojo;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.apache.maven.plugins.annotations.ResolutionScope;
+import org.apache.maven.toolchain.Toolchain;
+import org.apache.maven.toolchain.java.DefaultJavaToolChain;
 import org.codehaus.plexus.compiler.util.scan.SimpleSourceInclusionScanner;
 import org.codehaus.plexus.compiler.util.scan.SourceInclusionScanner;
 import org.codehaus.plexus.compiler.util.scan.StaleSourceScanner;
+import org.codehaus.plexus.languages.java.jpms.AsmModuleInfoParser;
+import org.codehaus.plexus.languages.java.jpms.JavaModuleDescriptor;
+import org.codehaus.plexus.languages.java.jpms.LocationManager;
+import org.codehaus.plexus.languages.java.jpms.ResolvePathsRequest;
+import org.codehaus.plexus.languages.java.jpms.ResolvePathsResult;
 
 /**
  * Compiles application test sources.
@@ -153,13 +158,14 @@
 
     @Parameter( defaultValue = "${project.testClasspathElements}", readonly = true )
     private List<String> testPath;
+
+    private AsmModuleInfoParser asmModuleInfoParser = new AsmModuleInfoParser();
     
-    @Component
-    private Map<String, ModuleInfoParser> moduleInfoParsers;
+    private LocationManager locationManager = new LocationManager();
 
-    private List<String> classpathElements;
+    private Collection<String> classpathElements;
 
-    private List<String> modulepathElements;
+    private Collection<String> modulepathElements;
 
     public void execute()
         throws MojoExecutionException, CompilationFailureException
@@ -179,13 +185,13 @@
 
     protected List<String> getClasspathElements()
     {
-        return classpathElements;
+        return new ArrayList<>( classpathElements );
     }
-    
+
     @Override
     protected List<String> getModulepathElements()
     {
-        return modulepathElements;
+        return new ArrayList<>( modulepathElements );
     }
 
     protected File getOutputDirectory()
@@ -213,9 +219,6 @@
             }
         }
         
-        List<String> testScopedElements = new ArrayList<String>( testPath );
-        testScopedElements.removeAll( compilePath );
-        
         if ( release != null )
         {
             if ( Integer.valueOf( release ) < 9 )
@@ -255,18 +258,39 @@
         {
             if ( hasMainModuleDescriptor )
             {
-                modulepathElements = compilePath;
-                classpathElements = testScopedElements;
+                JavaModuleDescriptor moduleDescriptor;
+                ResolvePathsResult<String> result;
+                
+                try
+                {
+                    moduleDescriptor = getModuleDescriptor( mainOutputDirectory );
+
+                    ResolvePathsRequest<String> request =
+                        ResolvePathsRequest.withStrings( testPath ).setMainModuleDescriptor( moduleDescriptor );
+                    
+                    Toolchain toolchain = getToolchain();
+                    if ( toolchain != null && toolchain instanceof DefaultJavaToolChain )
+                    {
+                        request.setJdkHome( new File( ( (DefaultJavaToolChain) toolchain ).getJavaHome() ) );
+                    }
+                    
+                    result = locationManager.resolvePaths( request );
+                }
+                catch ( IOException e )
+                {
+                    throw new RuntimeException( e );
+                }
+                
+                modulepathElements = result.getModulepathElements().keySet();
+                classpathElements = result.getClasspathElements();
+                
                 if ( compilerArgs == null )
                 {
                     compilerArgs = new ArrayList<String>();
                 }
-                
-                String moduleName = getModuleName( mainOutputDirectory );
-                
                 compilerArgs.add( "--patch-module" );
                 
-                StringBuilder addReadsValue = new StringBuilder( moduleName )
+                StringBuilder addReadsValue = new StringBuilder( moduleDescriptor.name() )
                                 .append( '=' )
                                 .append( mainOutputDirectory )
                                 .append( PS );
@@ -278,7 +302,7 @@
                 compilerArgs.add( addReadsValue.toString() );
                 
                 compilerArgs.add( "--add-reads" );
-                compilerArgs.add( moduleName + "=ALL-UNNAMED" );
+                compilerArgs.add( moduleDescriptor.name() + "=ALL-UNNAMED" );
             }
             else
             {
@@ -288,46 +312,9 @@
         }
     }
 
-    private String getModuleName( File mainOutputDirectory )
+    private JavaModuleDescriptor getModuleDescriptor( File mainOutputDirectory ) throws IOException
     {
-        String moduleName = null;
-        
-        Map<String, Exception> exceptionMap = new LinkedHashMap<String, Exception>( moduleInfoParsers.size() ); 
-        
-        List<String> parserKeys = Arrays.asList( "reflect", "asm" );
-        
-        // The class format is still changing, for that reason provide multiple strategies to parse module-info 
-        for ( String parserKey: parserKeys )
-        {
-            ModuleInfoParser parser = moduleInfoParsers.get( parserKey );
-
-            try
-            {
-                moduleName = parser.getModuleDescriptor( mainOutputDirectory  ).name();
-                
-                if ( moduleName != null )
-                {
-                    break;
-                }
-            }
-            catch ( Exception e )
-            {
-                exceptionMap.put( parserKey, e );
-            }
-        }
-        
-        if ( moduleName == null )
-        {
-            getLog().error( "Failed to parse module-info:" );
-            
-            for ( Map.Entry<String, Exception> exception : exceptionMap.entrySet() )
-            {
-                getLog().error( "With " + exception.getKey() + ": " + exception.getValue().getMessage() );
-            }
-            
-            throw new RuntimeException( "Failed to parse module-info" );
-        }
-        return moduleName;
+        return asmModuleInfoParser.getModuleDescriptor( mainOutputDirectory.toPath() );
     }
 
     protected SourceInclusionScanner getSourceInclusionScanner( int staleMillis )
diff --git a/src/main/java/org/apache/maven/plugin/compiler/module/AsmModuleInfoParser.java b/src/main/java/org/apache/maven/plugin/compiler/module/AsmModuleInfoParser.java
deleted file mode 100644
index af86c1e..0000000
--- a/src/main/java/org/apache/maven/plugin/compiler/module/AsmModuleInfoParser.java
+++ /dev/null
@@ -1,122 +0,0 @@
-package org.apache.maven.plugin.compiler.module;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.jar.JarEntry;
-import java.util.jar.JarFile;
-
-import org.codehaus.plexus.component.annotations.Component;
-import org.objectweb.asm.ClassReader;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.ModuleVisitor;
-import org.objectweb.asm.Opcodes;
-
-/**
- * Extract information from module with ASM
- * 
- * @author Robert Scholte
- * @since 3.6
- */
-@Component( role = ModuleInfoParser.class, hint = "asm" )
-public class AsmModuleInfoParser
-    implements ModuleInfoParser
-{
-    @Override
-    public Type getType()
-    {
-        return Type.CLASS;
-    }
-
-    
-    @Override
-    public JavaModuleDescriptor getModuleDescriptor( File modulePath )
-        throws IOException
-    {
-        final JavaModuleDescriptorWrapper wrapper = new JavaModuleDescriptorWrapper();
-
-        InputStream in = getModuleInfoClass( modulePath );
-
-        if ( in != null )
-        {
-            ClassReader reader = new ClassReader( in );
-            reader.accept( new ClassVisitor( Opcodes.ASM6 )
-            {
-                @Override
-                public ModuleVisitor visitModule( String name, int arg1, String arg2 )
-                {
-                    wrapper.builder = JavaModuleDescriptor.newModule( name );
-
-                    return new ModuleVisitor( Opcodes.ASM6 )
-                    {
-                        @Override
-                        public void visitRequire( String module, int access, String version )
-                        {
-                            wrapper.builder.requires( module );
-                        }
-                    };
-                }
-            }, 0 );
-
-            in.close();
-        }
-        else
-        {
-            wrapper.builder = JavaModuleDescriptor.newAutomaticModule( null );
-        }
-
-        return wrapper.builder.build();
-    }
-
-    private InputStream getModuleInfoClass( File modulePath )
-        throws FileNotFoundException, IOException
-    {
-        InputStream in;
-        if ( modulePath.isDirectory() )
-        {
-            in = new FileInputStream( new File( modulePath, "module-info.class" ) );
-        }
-        else
-        {
-            // 
-            JarFile jarFile = new JarFile( modulePath );
-            JarEntry moduleInfo = jarFile.getJarEntry( "/module-info.class" );
-            
-            if ( moduleInfo != null )
-            {
-                in = jarFile.getInputStream( moduleInfo );
-            }
-            else
-            {
-                in = null;
-            }
-        }
-        return in;
-    }
-    
-    private static class JavaModuleDescriptorWrapper 
-    {
-        private JavaModuleDescriptor.Builder builder;
-    }
-}
diff --git a/src/main/java/org/apache/maven/plugin/compiler/module/JavaModuleDescriptor.java b/src/main/java/org/apache/maven/plugin/compiler/module/JavaModuleDescriptor.java
deleted file mode 100644
index c571b96..0000000
--- a/src/main/java/org/apache/maven/plugin/compiler/module/JavaModuleDescriptor.java
+++ /dev/null
@@ -1,159 +0,0 @@
-package org.apache.maven.plugin.compiler.module;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * Simple representation of a Module containing info required by this plugin.
- * It will provide only methods matching Java 9 ModuleDescriptor, so once Java 9  is required, we can easily switch 
- * 
- * @author Robert Scholte
- * @since 3.7.0
- *
- */
-public class JavaModuleDescriptor
-{
-    private String name;
-    
-    private boolean automatic;
-
-    private Set<JavaRequires> requires = new HashSet<JavaRequires>();
-    
-    private Set<JavaExports> exports = new HashSet<JavaExports>();
-
-    public String name()
-    {
-        return name;
-    }
-
-    public boolean isAutomatic()
-    {
-        return automatic;
-    }
-    
-    public Set<JavaRequires> requires()
-    {
-        return Collections.unmodifiableSet( requires );
-    }
-    
-    public Set<JavaExports> exports()
-    {
-        return Collections.unmodifiableSet( exports );
-    }
-    
-    public static JavaModuleDescriptor.Builder newModule( String name )
-    {
-        return new Builder( name ).setAutomatic( false );
-    }
-    
-    public static Builder newAutomaticModule( String name )
-    {
-        return new Builder( name ).setAutomatic( true );
-    }  
-
-    /**
-     * A JavaModuleDescriptor Builder
-     * 
-     * @author Robert Scholte
-     * @since 3.7.0
-     */
-    public static final class Builder
-    {
-        private JavaModuleDescriptor jModule;
-        
-        private Builder( String name )
-        {
-            jModule = new JavaModuleDescriptor();
-            jModule.name = name;
-        }
-        
-        private Builder setAutomatic( boolean isAutomatic )
-        {
-            jModule.automatic = isAutomatic;
-            return this;
-        }
-
-        public Builder requires( String name )
-        {
-            JavaRequires requires = new JavaRequires( name );
-            jModule.requires.add( requires );
-            return this;
-        }
-        
-        public Builder exports( String source )
-        {
-            JavaExports exports = new JavaExports( source );
-            jModule.exports.add( exports );
-            return this;
-        }
-        
-        public JavaModuleDescriptor build()
-        {
-            return jModule;
-        }
-    }
-    
-    /**
-     * Represents Module.Requires
-     * 
-     * @author Robert Scholte
-     * @since 3.7.0
-     */
-    public static class JavaRequires
-    {
-        private final String name;
-
-        private JavaRequires( String name )
-        {
-            this.name = name;
-        }
-
-        public String name()
-        {
-            return name;
-        }
-    }
-    
-    /**
-     * Represents Module.Exports
-     * 
-     * @author Robert Scholte
-     * @since 3.7.0
-     *
-     */
-    public static class JavaExports
-    {
-        private final String source;
-        
-        private JavaExports( String source )
-        {
-            this.source = source;
-        }
-        
-        public String source()
-        {
-            return source;
-        }
-    }
-    
-}
diff --git a/src/main/java/org/apache/maven/plugin/compiler/module/ModuleInfoParser.java b/src/main/java/org/apache/maven/plugin/compiler/module/ModuleInfoParser.java
deleted file mode 100644
index 166da01..0000000
--- a/src/main/java/org/apache/maven/plugin/compiler/module/ModuleInfoParser.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package org.apache.maven.plugin.compiler.module;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.io.IOException;
-
-/**
- * Extract information from the module-info file
- * 
- * @author Robert Scholte
- * @since 3.6.0
- */
-public interface ModuleInfoParser
-{
-    /**
-     * Defines the type of parser, i.e. using the source or the class files
-     */
-    public enum Type
-    {
-        SOURCE, CLASS
-    }
-
-    /**
-     * What kind of file does the parser use
-     * 
-     * @return the type
-     */
-    Type getType();
-
-    /**
-     * Extracts the name from the module-info file
-     * 
-     * @param modulePath
-     * @return
-     * @throws IOException
-     */
-    JavaModuleDescriptor getModuleDescriptor( File modulePath )
-        throws IOException;
-}
\ No newline at end of file
diff --git a/src/main/java/org/apache/maven/plugin/compiler/module/ProjectAnalyzer.java b/src/main/java/org/apache/maven/plugin/compiler/module/ProjectAnalyzer.java
deleted file mode 100644
index afb96b6..0000000
--- a/src/main/java/org/apache/maven/plugin/compiler/module/ProjectAnalyzer.java
+++ /dev/null
@@ -1,198 +0,0 @@
-package org.apache.maven.plugin.compiler.module;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-import java.util.jar.JarFile;
-import java.util.jar.Manifest;
-
-import org.apache.maven.plugin.compiler.module.ProjectAnalyzerResult.ModuleNameSource;
-import org.codehaus.plexus.component.annotations.Component;
-import org.codehaus.plexus.component.annotations.Requirement;
-import org.codehaus.plexus.logging.AbstractLogEnabled;
-
-/**
- * Maps artifacts to modules and analyzes the type of required modules
- * 
- * @author Robert Scholte
- * @since 3.7.0
- */
-@Component( role = ProjectAnalyzer.class )
-public class ProjectAnalyzer extends AbstractLogEnabled
-{
-    @Requirement( hint = "asm" )
-    private ModuleInfoParser asmParser;
-
-    @Requirement( hint = "reflect" )
-    private ModuleInfoParser reflectParser;
-
-    public ProjectAnalyzerResult analyze( ProjectAnalyzerRequest request )
-        throws IOException
-    {
-        ProjectAnalyzerResult result = new ProjectAnalyzerResult();
-        
-        Map<File, JavaModuleDescriptor> pathElements =
-            new LinkedHashMap<File, JavaModuleDescriptor>( request.getDependencyArtifacts().size() );
-
-        JavaModuleDescriptor baseModuleDescriptor = request.getBaseModuleDescriptor();
-
-        Map<String, JavaModuleDescriptor> availableNamedModules = new HashMap<String, JavaModuleDescriptor>(); 
-        
-        Map<String, ModuleNameSource> moduleNameSources = new HashMap<String, ModuleNameSource>();
-        
-        // start from root
-        result.setBaseModuleDescriptor( baseModuleDescriptor );
-
-        // collect all modules from path
-        for ( File file : request.getDependencyArtifacts() )
-        {
-            JavaModuleDescriptor descriptor = extractDescriptor( file );
-
-            if ( descriptor != null )
-            {
-                availableNamedModules.put( descriptor.name(), descriptor );
-            }
-            
-            if ( descriptor == null || descriptor.isAutomatic() )
-            {
-                Manifest manifest = extractManifest( file );
-
-                String modulename = null;
-                
-                if ( manifest != null )
-                {
-                    modulename = manifest.getMainAttributes().getValue( "Automatic-Module-Name" );
-                }
-
-                if ( modulename != null )
-                {
-                    moduleNameSources.put( modulename, ModuleNameSource.MANIFEST );
-                }
-                else if ( descriptor != null )
-                {
-                    moduleNameSources.put( descriptor.name(), ModuleNameSource.FILENAME );
-                }
-            }
-            else
-            {
-                moduleNameSources.put( descriptor.name(), ModuleNameSource.MODULEDESCRIPTOR );
-            }
-            
-            pathElements.put( file, descriptor );
-        }
-        result.setPathElements( pathElements );
-        
-        result.setModuleNameSources( moduleNameSources );
-
-        if ( baseModuleDescriptor != null )
-        {
-            Set<String> requiredNamedModules = new HashSet<String>();
-            Set<String> requiredUnnamedModules = new HashSet<String>();
-            
-            select( baseModuleDescriptor, Collections.unmodifiableMap( availableNamedModules ), requiredNamedModules,
-                    requiredUnnamedModules );
-            
-            result.setRequiredNormalModules( requiredNamedModules );
-            result.setRequiredAutomaticModules( requiredUnnamedModules );
-        }
-
-        return result;
-    }
-
-    private JavaModuleDescriptor extractDescriptor( File file )
-        throws IOException
-    {
-        JavaModuleDescriptor moduleDescriptor;
-        if ( file.isFile() || new File( file, "module-info.class" ).exists() )
-        {
-            moduleDescriptor = reflectParser.getModuleDescriptor( file );
-
-            if ( moduleDescriptor == null )
-            {
-                moduleDescriptor = asmParser.getModuleDescriptor( file );
-            }
-        }
-        else
-        {
-            moduleDescriptor = null;
-        }
-        return moduleDescriptor;
-    }
-
-    private Manifest extractManifest( File file )
-        throws IOException
-    {
-        Manifest manifest;
-        if ( file.isFile() )
-        {
-            JarFile jarFile = null;
-            try
-            {
-                jarFile = new JarFile( file );
-                manifest = jarFile.getManifest();
-            }
-            finally
-            {
-                jarFile.close();
-            }
-        }
-        else if ( new File( file, "META-INF/MANIFEST.MF" ).exists() )
-        {
-            manifest = new Manifest( new FileInputStream( new File( file, "META-INF/MANIFEST.MF" ) ) );
-        }
-        else
-        {
-            manifest = null;
-        }
-
-        return manifest;
-    }
-
-
-    private void select( JavaModuleDescriptor module, Map<String, JavaModuleDescriptor> availableModules,
-                         Set<String> namedModules, Set<String> unnamedModules )
-    {
-        for ( JavaModuleDescriptor.JavaRequires requires : module.requires() )
-        {
-            String requiresName = requires.name();
-            JavaModuleDescriptor requiredModule = availableModules.get( requiresName );
-
-            if ( requiredModule != null && !requiredModule.isAutomatic() )
-            {
-                if ( namedModules.add( requiresName ) )
-                {
-                    select( requiredModule, availableModules, namedModules, unnamedModules );
-                }
-            }
-            else
-            {
-                unnamedModules.add( requiresName );
-            }
-        }
-    }
-}
diff --git a/src/main/java/org/apache/maven/plugin/compiler/module/ProjectAnalyzerRequest.java b/src/main/java/org/apache/maven/plugin/compiler/module/ProjectAnalyzerRequest.java
deleted file mode 100644
index 397ab34..0000000
--- a/src/main/java/org/apache/maven/plugin/compiler/module/ProjectAnalyzerRequest.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.apache.maven.plugin.compiler.module;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.util.Collection;
-
-/**
- * Contains all information required to analyze the project
- * 
- * @author Robert Scholte
- * @since 3.7.0
- */
-public class ProjectAnalyzerRequest
-{
-    private JavaModuleDescriptor baseModuleDescriptor;
-    
-    private Collection<File> dependencyArtifacts;
-
-    public JavaModuleDescriptor getBaseModuleDescriptor()
-    {
-        return baseModuleDescriptor;
-    }
-
-    public ProjectAnalyzerRequest setBaseModuleDescriptor( JavaModuleDescriptor baseModuleDescriptor )
-    {
-        this.baseModuleDescriptor = baseModuleDescriptor;
-        return this;
-    }
-
-    public Collection<File> getDependencyArtifacts()
-    {
-        return dependencyArtifacts;
-    }
-
-    public ProjectAnalyzerRequest setDependencyArtifacts( Collection<File> dependencyArtifacts )
-    {
-        this.dependencyArtifacts = dependencyArtifacts;
-        return this;
-    }
-}
diff --git a/src/main/java/org/apache/maven/plugin/compiler/module/ProjectAnalyzerResult.java b/src/main/java/org/apache/maven/plugin/compiler/module/ProjectAnalyzerResult.java
deleted file mode 100644
index 3efc0b6..0000000
--- a/src/main/java/org/apache/maven/plugin/compiler/module/ProjectAnalyzerResult.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package org.apache.maven.plugin.compiler.module;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Holds the results of the project analyzer
- * 
- * @author Robert Scholte
- * @since 3.7.0
- */
-public class ProjectAnalyzerResult
-{
-    /**
-     * Source of the modulename 
-     */
-    public enum ModuleNameSource
-    {
-        FILENAME, MANIFEST, MODULEDESCRIPTOR
-    }
-    
-    private JavaModuleDescriptor baseModuleDescriptor;
-    
-    /**
-     * Ordered map, respects the classpath order
-     */
-    private Map<File, JavaModuleDescriptor> pathElements;
-    
-    private Map<String, ModuleNameSource> moduleNameSources = new HashMap<String, ModuleNameSource>();
-    
-    private Set<String> requiredNormalModules = new HashSet<String>();
-
-    private Set<String> requiredAutomaticModules = new HashSet<String>();
-
-    public void setBaseModuleDescriptor( JavaModuleDescriptor baseModuleDescriptor )
-    {
-        this.baseModuleDescriptor = baseModuleDescriptor;
-    }
-
-    public JavaModuleDescriptor getBaseModuleDescriptor()
-    {
-        return baseModuleDescriptor;
-    }
-
-    public void setPathElements( Map<File, JavaModuleDescriptor> pathElements )
-    {
-        this.pathElements = pathElements;
-    }
-    
-    /**
-     * Ordered map, respects the classpath order
-     */
-    public Map<File, JavaModuleDescriptor> getPathElements()
-    {
-        return pathElements;
-    }
-    
-    public void setModuleNameSources( Map<String, ModuleNameSource> moduleNameSources )
-    {
-        this.moduleNameSources = moduleNameSources;
-    }
-    
-    public ModuleNameSource getModuleNameSource( String name )
-    {
-        return moduleNameSources.get( name );
-    }
-    
-    public void setRequiredNormalModules( Set<String> requiredNormalModules )
-    {
-        this.requiredNormalModules = requiredNormalModules;
-    }
-    
-    public Set<String> getRequiredNormalModules()
-    {
-        return requiredNormalModules;
-    }
-    
-    public void setRequiredAutomaticModules( Set<String> requiredAutomaticModules )
-    {
-        this.requiredAutomaticModules = requiredAutomaticModules;
-    }
-    
-    public Set<String> getRequiredAutomaticModules()
-    {
-        return requiredAutomaticModules;
-    }
-}
diff --git a/src/main/java/org/apache/maven/plugin/compiler/module/QDoxModuleInfoParser.java b/src/main/java/org/apache/maven/plugin/compiler/module/QDoxModuleInfoParser.java
deleted file mode 100644
index f795efa..0000000
--- a/src/main/java/org/apache/maven/plugin/compiler/module/QDoxModuleInfoParser.java
+++ /dev/null
@@ -1,78 +0,0 @@
-package org.apache.maven.plugin.compiler.module;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.io.IOException;
-
-import org.codehaus.plexus.component.annotations.Component;
-
-import com.thoughtworks.qdox.JavaProjectBuilder;
-import com.thoughtworks.qdox.model.JavaModuleDescriptor;
-
-/**
- * Extract information from module with QDox
- * 
- * @author Robert Scholte
- * @since 3.6.1
- */
-@Component( role = ModuleInfoParser.class, hint = "qdox" )
-public class QDoxModuleInfoParser
-    implements ModuleInfoParser
-{
-
-    @Override
-    public Type getType()
-    {
-        return Type.SOURCE;
-    }
-
-    @Override
-    public org.apache.maven.plugin.compiler.module.JavaModuleDescriptor getModuleDescriptor( File modulePath )
-        throws IOException
-    {
-        File moduleDescriptor = new File( modulePath, "module-info.java" );
-        
-        org.apache.maven.plugin.compiler.module.JavaModuleDescriptor.Builder builder;
-        if ( moduleDescriptor.exists() )
-        {
-            JavaModuleDescriptor descriptor = new JavaProjectBuilder().addSourceFolder( modulePath ).getDescriptor();
-
-            builder = org.apache.maven.plugin.compiler.module.JavaModuleDescriptor.newModule( descriptor.getName() );
-            
-            for ( JavaModuleDescriptor.JavaRequires requires : descriptor.getRequires() )
-            {
-                builder.requires( requires.getModule().getName() );
-            }
-            
-            for ( JavaModuleDescriptor.JavaExports exports : descriptor.getExports() )
-            {
-                builder.exports( exports.getSource().getName() );
-            }
-        }
-        else
-        {
-            builder = org.apache.maven.plugin.compiler.module.JavaModuleDescriptor.newAutomaticModule( null );
-        }
-
-        return builder.build();
-    }
-
-}
diff --git a/src/main/java/org/apache/maven/plugin/compiler/module/ReflectModuleInfoParser.java b/src/main/java/org/apache/maven/plugin/compiler/module/ReflectModuleInfoParser.java
deleted file mode 100644
index caf8abf..0000000
--- a/src/main/java/org/apache/maven/plugin/compiler/module/ReflectModuleInfoParser.java
+++ /dev/null
@@ -1,131 +0,0 @@
-package org.apache.maven.plugin.compiler.module;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import java.io.File;
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Set;
-
-import org.codehaus.plexus.component.annotations.Component;
-
-/**
- * This class is could be replaced with a Java 9 MultiRelease implementation 
- * 
- * @author Robert Scholte
- * @since 3.7.0
- */
-@Component( role = ModuleInfoParser.class, hint = "reflect" )
-public class ReflectModuleInfoParser implements ModuleInfoParser
-{
-    @Override
-    public Type getType()
-    {
-        return Type.CLASS;
-    }
-
-    @Override
-    public JavaModuleDescriptor getModuleDescriptor( File modulePath )
-        throws IOException
-    {
-        JavaModuleDescriptor moduleDescriptor = null;
-        
-        try
-        {
-            // Use Java9 code to get moduleName, don't try to do it better with own implementation
-            Class moduleFinderClass = Class.forName( "java.lang.module.ModuleFinder" );
-
-            java.nio.file.Path path = modulePath.toPath();
-
-            Method ofMethod = moduleFinderClass.getMethod( "of", java.nio.file.Path[].class );
-            Object moduleFinderInstance = ofMethod.invoke( null, new Object[] { new java.nio.file.Path[] { path } } );
-
-            Method findAllMethod = moduleFinderClass.getMethod( "findAll" );
-            Set<Object> moduleReferences = (Set<Object>) findAllMethod.invoke( moduleFinderInstance );
-
-            Object moduleReference = moduleReferences.iterator().next();
-            Method descriptorMethod = moduleReference.getClass().getMethod( "descriptor" );
-            Object moduleDescriptorInstance = descriptorMethod.invoke( moduleReference );
-
-            JavaModuleDescriptor.Builder builder = getBuilder( moduleDescriptorInstance );
-            
-            Method requiresMethod = moduleDescriptorInstance.getClass().getMethod( "requires" );
-            Set<Object> requires = (Set<Object>) requiresMethod.invoke( moduleDescriptorInstance );
-            
-            for ( Object requiresInstance : requires )
-            {
-                Method nameMethod = requiresInstance.getClass().getMethod( "name" );
-                String name = (String) nameMethod.invoke( requiresInstance );
-                
-                builder.requires( name );
-            }
-            
-            moduleDescriptor = builder.build();
-        }
-        catch ( ClassNotFoundException e )
-        {
-            // do nothing
-        }
-        catch ( NoSuchMethodException e )
-        {
-            e.printStackTrace();
-        }
-        catch ( SecurityException e )
-        {
-            // do nothing
-        }
-        catch ( IllegalAccessException e )
-        {
-            // do nothing
-        }
-        catch ( IllegalArgumentException e )
-        {
-            // do nothing
-        }
-        catch ( InvocationTargetException e )
-        {
-            // do nothing
-        }
-        return moduleDescriptor;
-    }
-
-    private JavaModuleDescriptor.Builder getBuilder( Object moduleDescriptorInstance )
-        throws NoSuchMethodException, IllegalAccessException, InvocationTargetException
-    {
-        JavaModuleDescriptor.Builder builder;
-        Method nameMethod = moduleDescriptorInstance.getClass().getMethod( "name" );
-        String name = (String) nameMethod.invoke( moduleDescriptorInstance );
-        
-        Method isAutomaticMethod = moduleDescriptorInstance.getClass().getMethod( "isAutomatic" );
-        boolean automatic = (Boolean) isAutomaticMethod.invoke( moduleDescriptorInstance );
-
-        if ( automatic )
-        {
-            builder = JavaModuleDescriptor.newAutomaticModule( name );
-        }
-        else
-        {
-            builder = JavaModuleDescriptor.newModule( name );
-        }
-        return builder;
-    }
-
-}
