diff --git a/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java b/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java
index 3446c73..189604a 100644
--- a/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java
+++ b/src/main/java/org/apache/maven/plugins/javadoc/AbstractJavadocMojo.java
@@ -132,8 +132,6 @@
 import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
 import static org.apache.maven.plugins.javadoc.JavadocUtil.toRelative;
 import static org.apache.maven.plugins.javadoc.JavadocUtil.toList;
@@ -171,43 +169,6 @@
     public static final String TEST_JAVADOC_RESOURCES_ATTACHMENT_CLASSIFIER = "test-javadoc-resources";
 
     /**
-     * The default Javadoc API urls according the
-     * <a href="http://www.oracle.com/technetwork/java/javase/documentation/api-jsp-136079.html">Sun API
-     * Specifications</a>:
-     * <pre>
-     * &lt;javaApiLinks&gt;
-     *   &lt;property&gt;
-     *     &lt;name&gt;api_1.3&lt;/name&gt;
-     *     &lt;value&gt;http://docs.oracle.com/javase/1.3/docs/api/&lt;/value&gt;
-     *   &lt;/property&gt;
-     *   &lt;property&gt;
-     *     &lt;name&gt;api_1.4&lt;/name&gt;
-     *     &lt;value&gt;http://docs.oracle.com/javase/1.4.2/docs/api/&lt;/value&gt;
-     *   &lt;/property&gt;
-     *   &lt;property&gt;
-     *     &lt;name&gt;api_1.5&lt;/name&gt;
-     *     &lt;value&gt;http://docs.oracle.com/javase/1.5.0/docs/api/&lt;/value&gt;
-     *   &lt;/property&gt;
-     *   &lt;property&gt;
-     *     &lt;name&gt;api_1.6&lt;/name&gt;
-     *     &lt;value&gt;http://docs.oracle.com/javase/6/docs/api/&lt;/value&gt;
-     *   &lt;/property&gt;
-     *   &lt;property&gt;
-     *     &lt;name&gt;api_1.7&lt;/name&gt;
-     *     &lt;value&gt;http://docs.oracle.com/javase/7/docs/api/&lt;/value&gt;
-     *   &lt;/property&gt;
-     *   &lt;property&gt;
-     *     &lt;name&gt;api_1.8&lt;/name&gt;
-     *     &lt;value&gt;http://docs.oracle.com/javase/8/docs/api/&lt;/value&gt;
-     *   &lt;/property&gt;
-     * &lt;/javaApiLinks&gt;
-     * </pre>
-     *
-     * @since 2.6
-     */
-    public static final Properties DEFAULT_JAVA_API_LINKS = new Properties();
-
-    /**
      * The Javadoc script file name when <code>debug</code> parameter is on, i.e. javadoc.bat or javadoc.sh
      */
     protected static final String DEBUG_JAVADOC_SCRIPT_NAME = "javadoc." + ( SystemUtils.IS_OS_WINDOWS ? "bat" : "sh" );
@@ -606,15 +567,19 @@
     private boolean detectJavaApiLink;
 
     /**
-     * Use this parameter <b>only</b> if the <a href="http://java.sun.com/reference/api/index.html">Sun Javadoc API</a>
-     * urls have been changed or to use custom urls for Javadoc API url.
-     * <br/>
-     * See
-     * <a href="./apidocs/org/apache/maven/plugin/javadoc/AbstractJavadocMojo.html#DEFAULT_JAVA_API_LINKS">Javadoc</a>
-     * for the default values.
-     * <br/>
-     *
-     * @see #DEFAULT_JAVA_API_LINKS
+     * Use this parameter <b>only</b> if if you want to override the default URLs.
+     * 
+     * The key should match {@code api_x}, where {@code x} matches the Java version.  
+     * 
+     *  For example:
+     *  <dl>
+     *   <dt>api_1.5</dt>
+     *   <dd>https://docs.oracle.com/javase/1.5.0/docs/api/</dd>
+     *   <dt>api_1.8<dt>
+     *   <dd>https://docs.oracle.com/javase/8/docs/api/</dd>
+     *   <dt>api_9</dd>
+     *   <dd>https://docs.oracle.com/javase/9/docs/api/</dd>
+     * </dl>
      * @since 2.6
      */
     @Parameter( property = "javaApiLinks" )
@@ -1765,21 +1730,6 @@
     private Map<String, String> jdkToolchain;
 
     // ----------------------------------------------------------------------
-    // static
-    // ----------------------------------------------------------------------
-
-    static
-    {
-        DEFAULT_JAVA_API_LINKS.put( "api_1.5", "https://docs.oracle.com/javase/1.5.0/docs/api/" );
-        DEFAULT_JAVA_API_LINKS.put( "api_1.6", "https://docs.oracle.com/javase/6/docs/api/" );
-        DEFAULT_JAVA_API_LINKS.put( "api_1.7", "https://docs.oracle.com/javase/7/docs/api/" );
-        DEFAULT_JAVA_API_LINKS.put( "api_1.8", "https://docs.oracle.com/javase/8/docs/api/" );
-        DEFAULT_JAVA_API_LINKS.put( "api_9",   "https://docs.oracle.com/javase/9/docs/api/" );
-        DEFAULT_JAVA_API_LINKS.put( "api_10",  "https://docs.oracle.com/javase/10/docs/api/" );
-        DEFAULT_JAVA_API_LINKS.put( "api_11",  "https://docs.oracle.com/en/java/javase/11/docs/api/" );
-    }
-
-    // ----------------------------------------------------------------------
     // protected methods
     // ----------------------------------------------------------------------
 
@@ -4861,12 +4811,6 @@
         {
             throw new MavenReportException( "Option <stylesheet/> supports only \"maven\" or \"java\" value." );
         }
-
-        // default java api links
-        if ( javaApiLinks == null || javaApiLinks.size() == 0 )
-        {
-            javaApiLinks = DEFAULT_JAVA_API_LINKS;
-        }
     }
 
     /**
@@ -6054,53 +5998,72 @@
      * @see <a href="http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#source">source parameter</a>
      * @since 2.6
      */
-    private OfflineLink getDefaultJavadocApiLink()
+    protected final OfflineLink getDefaultJavadocApiLink()
     {
         if ( !detectJavaApiLink )
         {
             return null;
         }
 
-        final String pluginId = "org.apache.maven.plugins:maven-compiler-plugin";
-        JavaVersion sourceVersion = javadocRuntimeVersion;
-        String sourceConfigured = getPluginParameter( project, pluginId, "source" );
-        if ( sourceConfigured != null )
+        final JavaVersion javaApiversion;
+        if ( release != null )
         {
-            try
-            {
-                sourceVersion = JavaVersion.parse( sourceConfigured );
-            }
-            catch ( NumberFormatException e )
-            {
-                getLog().debug(
-                    "NumberFormatException for the source parameter in the maven-compiler-plugin. " + "Ignored it", e );
-            }
+            javaApiversion = JavaVersion.parse( release );
         }
         else
         {
-            getLog().debug( "No maven-compiler-plugin defined in ${build.plugins} or in "
-                                + "${project.build.pluginManagement} for the " + project.getId()
-                                + ". Added Javadoc API link according the javadoc executable version i.e.: "
-                                + javadocRuntimeVersion );
+            final String pluginId = "org.apache.maven.plugins:maven-compiler-plugin";
+            String sourceConfigured = getPluginParameter( project, pluginId, "source" );
+            if ( sourceConfigured != null )
+            {
+                javaApiversion = JavaVersion.parse( sourceConfigured );
+            }
+            else
+            {
+                getLog().debug( "No maven-compiler-plugin defined in ${build.plugins} or in "
+                                    + "${project.build.pluginManagement} for the " + project.getId()
+                                    + ". Added Javadoc API link according the javadoc executable version i.e.: "
+                                    + javadocRuntimeVersion );
+                
+                javaApiversion = javadocRuntimeVersion;
+            }
         }
-
-        String apiVersion;
         
-        Matcher apiMatcher = Pattern.compile( "(1\\.\\d|\\d\\d*)" ).matcher( sourceVersion.toString() );
-        if ( apiMatcher.find() )
+        final String javaApiKey;
+        if ( javaApiversion.asMajor().isAtLeast( "9" ) )
         {
-            apiVersion = apiMatcher.group( 1 );
+            javaApiKey = "api_" + javaApiversion.asMajor();
         }
         else
         {
-            apiVersion = null;
+            javaApiKey = "api_1." + javaApiversion.asMajor().toString().charAt( 0 );
         }
-
-        String javaApiLink = javaApiLinks.getProperty( "api_" + apiVersion, null );
-
+        
+        final String javaApiLink;
+        if ( javaApiLinks != null && javaApiLinks.containsKey( javaApiKey ) )
+        {
+            javaApiLink = javaApiLinks.getProperty( javaApiKey );  
+        }
+        else if ( javaApiversion.isAtLeast( "11" ) )
+        {
+            javaApiLink = String.format( "https://docs.oracle.com/en/java/javase/%s/docs/api/", javaApiversion );
+        }
+        else if ( javaApiversion.asMajor().isAtLeast( "6" ) )
+        {
+            javaApiLink = String.format( "https://docs.oracle.com/javase/%s/docs/api/", javaApiversion.asMajor() );
+        }
+        else if ( javaApiversion.isAtLeast( "1.5" ) )
+        {
+            javaApiLink = "https://docs.oracle.com/javase/1.5.0/docs/api/";
+        }
+        else
+        {
+            javaApiLink = null;
+        }
+        
         if ( getLog().isDebugEnabled() )
         {
-            if ( StringUtils.isNotEmpty( javaApiLink ) )
+            if ( javaApiLink != null )
             {
                 getLog().debug( "Found Java API link: " + javaApiLink );
             }
@@ -6117,15 +6080,20 @@
 
         final Path javaApiListFile;
         final String resourceName;
-        if ( JavaVersion.parse( apiVersion ).isAtLeast( "10" ) )
+        if ( javaApiversion.isAtLeast( "10" ) )
         {
             javaApiListFile = getJavadocOptionsFile().getParentFile().toPath().resolve( "element-list" );
-            resourceName = "java-api-element-list-" + apiVersion;
+            resourceName = "java-api-element-list-" + javaApiversion.toString().substring( 0, 2 );
+        }
+        else if ( javaApiversion.asMajor().isAtLeast( "9" ) )
+        {
+            javaApiListFile = getJavadocOptionsFile().getParentFile().toPath().resolve( "package-list" );
+            resourceName = "java-api-package-list-9";
         }
         else
         {
             javaApiListFile = getJavadocOptionsFile().getParentFile().toPath().resolve( "package-list" );
-            resourceName = "java-api-package-list-" + apiVersion;
+            resourceName = "java-api-package-list-1." + javaApiversion.asMajor().toString().charAt( 0 );
         }
 
         OfflineLink link = new OfflineLink();
@@ -6139,7 +6107,7 @@
         }
         catch ( IOException ioe )
         {
-            logError( "Can't get java-api-package-list-" + apiVersion + ": " + ioe.getMessage(), ioe );
+            logError( "Can't get " + resourceName + ": " + ioe.getMessage(), ioe );
             return null;
         }
 
diff --git a/src/test/java/org/apache/maven/plugins/javadoc/JavadocReportTest.java b/src/test/java/org/apache/maven/plugins/javadoc/JavadocReportTest.java
index 0afc13e..0f2cec2 100644
--- a/src/test/java/org/apache/maven/plugins/javadoc/JavadocReportTest.java
+++ b/src/test/java/org/apache/maven/plugins/javadoc/JavadocReportTest.java
@@ -237,7 +237,8 @@
         assertTrue( generatedFile.exists() );
 
         // only test when URL can be reached
-        String url = JavadocReport.DEFAULT_JAVA_API_LINKS.getProperty( "api_9" );
+        
+        String url = mojo.getDefaultJavadocApiLink().getUrl();
         HttpURLConnection connection = (HttpURLConnection) new URL( url ).openConnection();
         connection.setRequestMethod( "HEAD" );
         if ( connection.getResponseCode() == 200 )
