--- src/java/org/apache/nutch/plugin/PluginClassLoader.java	2017-03-29 04:06:50.000000000 +0000
+++ src/java/org/apache/nutch/plugin/PluginClassLoader.java	2017-04-27 14:22:06.034806764 +0000
@@ -20,20 +20,26 @@
 import java.net.URLClassLoader;
 import java.util.Arrays;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
 /**
- * The <code>PluginClassLoader</code> contains only classes of the runtime
- * libraries setuped in the plugin manifest file and exported libraries of
- * plugins that are required pluguin. Libraries can be exported or not. Not
- * exported libraries are only used in the plugin own
+ * The <code>PluginClassLoader</code> is a child-first classloader that only
+ * contains classes of the runtime libraries setuped in the plugin manifest 
+ * file and exported libraries of plugins that are required plugins. Libraries 
+ * can be exported or not. Not exported libraries are only used in the plugin own
  * <code>PluginClassLoader</code>. Exported libraries are available for
  * <code>PluginClassLoader</code> of plugins that depends on these plugins.
  * 
- * @author joa23
  */
 public class PluginClassLoader extends URLClassLoader {
 
   private URL[] urls;
   private ClassLoader parent;
+  private ClassLoader system;
 
   /**
    * Construtor
@@ -48,9 +55,129 @@
 
     this.urls = urls;
     this.parent = parent;
+    system = getSystemClassLoader();
   }
 
   @Override
+  protected synchronized Class<?> loadClass(String name, boolean resolve)
+      throws ClassNotFoundException {
+    
+    // First, check if the class has already been loaded
+    Class<?> c = findLoadedClass(name);
+
+    if (c == null) {
+      try {
+        // checking local
+        c = findClass(name);
+      } catch (ClassNotFoundException e) {
+        c = loadClassFromParent(name, resolve);
+      } catch(SecurityException e){
+        c = loadClassFromParent(name, resolve);
+      }
+    }
+
+    if (resolve)
+      resolveClass(c);
+    return c;
+  }
+
+  private Class<?> loadClassFromParent(String name, boolean resolve) throws ClassNotFoundException {
+    // checking parent
+    // This call to loadClass may eventually call findClass
+    // again, in case the parent doesn't find anything.
+    Class<?> c;
+    try {
+      c = super.loadClass(name, resolve);
+    } catch (ClassNotFoundException e) {
+      c = loadClassFromSystem(name);
+    } catch (SecurityException e){
+      c = loadClassFromSystem(name);
+    }
+    return c;
+  }
+
+  private Class<?> loadClassFromSystem(String name) throws ClassNotFoundException{
+    Class<?> c = null;
+    if (system != null) {
+      // checking system: jvm classes, endorsed, cmd classpath,
+      c = system.loadClass(name);
+    }
+    return c;
+  }
+
+  @Override
+  public URL getResource(String name) {
+    URL url = findResource(name);
+    if (url == null)
+      url = super.getResource(name);
+
+    if (url == null && system != null)
+      url = system.getResource(name);
+
+    return url;
+  }
+
+  @Override
+  public Enumeration<URL> getResources(String name) throws IOException {
+    /**
+     * Similar to super, but local resources are enumerated before parent
+     * resources
+     */
+    Enumeration<URL> systemUrls = null;
+    if (system != null) {
+      systemUrls = system.getResources(name);
+    }
+
+    Enumeration<URL> localUrls = findResources(name);
+    Enumeration<URL> parentUrls = null;
+    if (getParent() != null) {
+      parentUrls = getParent().getResources(name);
+    }
+
+    final List<URL> urls = new ArrayList<URL>();
+    if (localUrls != null) {
+      while (localUrls.hasMoreElements()) {
+        URL local = localUrls.nextElement();
+        urls.add(local);
+      }
+    }
+
+    if (systemUrls != null) {
+      while (systemUrls.hasMoreElements()) {
+        urls.add(systemUrls.nextElement());
+      }
+    }
+
+    if (parentUrls != null) {
+      while (parentUrls.hasMoreElements()) {
+        urls.add(parentUrls.nextElement());
+      }
+    }
+
+    return new Enumeration<URL>() {
+      Iterator<URL> iter = urls.iterator();
+
+      public boolean hasMoreElements() {
+        return iter.hasNext();
+      }
+
+      public URL nextElement() {
+        return iter.next();
+      }
+    };
+  }
+
+  public InputStream getResourceAsStream(String name) {
+    URL url = getResource(name);
+    try {
+      return url != null ? url.openStream() : null;
+    } catch (IOException e) {
+    }
+    return null;
+  }
+
+
+  @Override
   public int hashCode() {
     final int PRIME = 31;
     int result = 1;
diff -Naur ../tmp/apache-nutch-1.13/src/plugin/parse-tika/plugin.xml ./src/plugin/parse-tika/plugin.xml
--- ../tmp/apache-nutch-1.13/src/plugin/parse-tika/plugin.xml   2017-03-29 04:06:50.000000000 +0000
+++ ./src/plugin/parse-tika/plugin.xml  2017-04-27 17:47:48.405758085 +0000
@@ -103,7 +103,6 @@
       <library name="sis-referencing-0.5.jar"/>
       <library name="sis-storage-0.5.jar"/>
       <library name="sis-utility-0.5.jar"/>
-      <library name="slf4j-api-1.7.12.jar"/>
       <library name="stax2-api-3.1.4.jar"/>
       <library name="tagsoup-1.2.1.jar"/>
       <library name="tika-parsers-1.12.jar"/>
diff -Naur ../tmp/apache-nutch-1.13/src/plugin/indexer-solr/plugin.xml ./src/plugin/indexer-solr/plugin.xml
--- ../tmp/apache-nutch-1.13/src/plugin/indexer-solr/plugin.xml 2017-03-29 04:06:50.000000000 +0000
+++ ./src/plugin/indexer-solr/plugin.xml        2017-04-27 19:50:09.056664493 +0000
@@ -27,7 +27,6 @@
       <library name="httpcore-4.4.1.jar"/>
       <library name="httpmime-4.4.1.jar"/>
       <library name="noggit-0.6.jar"/>
-      <library name="slf4j-api-1.7.7.jar"/>
       <library name="solr-solrj-5.5.0.jar"/>
       <library name="stax2-api-3.1.4.jar"/>
       <library name="woodstox-core-asl-4.4.1.jar"/>
diff -Naur ../tmp/apache-nutch-1.13/src/plugin/parse-tika/ivy.xml ./src/plugin/parse-tika/ivy.xml
--- ../tmp/apache-nutch-1.13/src/plugin/parse-tika/ivy.xml      2017-03-29 04:06:50.000000000 +0000
+++ ./src/plugin/parse-tika/ivy.xml     2017-04-27 20:34:35.223566873 +0000
@@ -37,9 +37,10 @@
 
   <dependencies>
     <dependency org="org.apache.tika" name="tika-parsers" rev="1.12" conf="*->default">
-     <exclude org="org.apache.tika" name="tika-core" />
-     <exclude org="org.apache.httpcomponents" name="httpclient" />
-     <exclude org="org.apache.httpcomponents" name="httpcore" />
+      <exclude org="org.apache.tika" name="tika-core" />
+      <exclude org="org.apache.httpcomponents" name="httpclient" />
+      <exclude org="org.apache.httpcomponents" name="httpcore" />
+      <exclude org="org.slf4j" name="slf4j-log4j12" />
     </dependency>
   </dependencies>
   
diff -Naur ../tmp/apache-nutch-1.13/src/plugin/parsefilter-naivebayes/plugin.xml ./src/plugin/parsefilter-naivebayes/plugin.xml
--- ../tmp/apache-nutch-1.13/src/plugin/parsefilter-naivebayes/plugin.xml  2017-03-29 04:06:50.000000000 +0000
+++ ./src/plugin/parsefilter-naivebayes/plugin.xml  2017-05-01 12:48:37.282691583 +0000
@@ -35,7 +35,6 @@
       <library name="lucene-core-5.5.0.jar"/>
       <library name="mahout-core-0.9.jar"/>
       <library name="mahout-math-0.10.1.jar"/>
-      <library name="slf4j-api-1.7.12.jar"/>
       <library name="solr-commons-csv-3.5.0.jar"/>
       <library name="t-digest-3.1.jar"/>
       <library name="xmlpull-1.1.3.1.jar"/>

