Index: src/test/org/apache/nutch/protocol/TestProtocolFactory.java
===================================================================
--- src/test/org/apache/nutch/protocol/TestProtocolFactory.java	(revision 550027)
+++ src/test/org/apache/nutch/protocol/TestProtocolFactory.java	(working copy)
@@ -18,6 +18,7 @@
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.nutch.util.NutchConfiguration;
+import org.apache.nutch.util.ObjectCache;
 
 import junit.framework.TestCase;
 
@@ -56,7 +57,7 @@
     }
 
     //cache key
-    Object protocol=conf.getObject(Protocol.X_POINT_ID + "http");
+    Object protocol = ObjectCache.get(conf).getObject(Protocol.X_POINT_ID + "http");
     assertNotNull(protocol);
     assertEquals(httpProtocol, protocol);
     
Index: src/java/org/apache/nutch/analysis/AnalyzerFactory.java
===================================================================
--- src/java/org/apache/nutch/analysis/AnalyzerFactory.java	(revision 550027)
+++ src/java/org/apache/nutch/analysis/AnalyzerFactory.java	(working copy)
@@ -25,6 +25,7 @@
 import org.apache.nutch.plugin.ExtensionPoint;
 import org.apache.nutch.plugin.PluginRuntimeException;
 import org.apache.nutch.plugin.PluginRepository;
+import org.apache.nutch.util.ObjectCache;
 import org.apache.hadoop.conf.Configuration;
 
 
@@ -56,10 +57,11 @@
   }
 
   public static AnalyzerFactory get(Configuration conf) {
-    AnalyzerFactory factory = (AnalyzerFactory) conf.getObject(KEY);
+    ObjectCache objectCache = ObjectCache.get(conf);
+    AnalyzerFactory factory = (AnalyzerFactory) objectCache.getObject(KEY);
     if (factory == null) {
       factory = new AnalyzerFactory(conf);
-      conf.setObject(KEY, factory);
+      objectCache.setObject(KEY, factory);
     }
     return factory;
   }
@@ -87,13 +89,13 @@
   }
 
   private Extension getExtension(String lang) {
-
+    ObjectCache objectCache = ObjectCache.get(conf);
     if (lang == null) { return null; }
-    Extension extension = (Extension) this.conf.getObject(lang);
+    Extension extension = (Extension) objectCache.getObject(lang);
     if (extension == null) {
       extension = findExtension(lang);
       if (extension != null) {
-        this.conf.setObject(lang, extension);
+        objectCache.setObject(lang, extension);
       }
     }
     return extension;
Index: src/java/org/apache/nutch/analysis/CommonGrams.java
===================================================================
--- src/java/org/apache/nutch/analysis/CommonGrams.java	(revision 550027)
+++ src/java/org/apache/nutch/analysis/CommonGrams.java	(working copy)
@@ -30,6 +30,7 @@
 
 import org.apache.hadoop.conf.*;
 import org.apache.nutch.util.NutchConfiguration;
+import org.apache.nutch.util.ObjectCache;
 import org.apache.nutch.searcher.Query.*;
 
 /** Construct n-grams for frequently occuring terms and phrases while indexing.
@@ -140,8 +141,9 @@
 
   /** Construct using the provided config file. */
   private void init(Configuration conf) {
+    ObjectCache objectCache = ObjectCache.get(conf);
     // First, try to retrieve some commonTerms cached in configuration.
-    commonTerms = (HashMap) conf.getObject(KEY);
+    commonTerms = (HashMap) objectCache.getObject(KEY);
     if (commonTerms != null) { return; }
 
     // Otherwise, read the terms.file
@@ -182,7 +184,7 @@
         }
         table.add(gram);
       }
-      conf.setObject(KEY, commonTerms);
+      objectCache.setObject(KEY, commonTerms);
     } catch (IOException e) {
       throw new RuntimeException(e.toString());
     }
Index: src/java/org/apache/nutch/net/URLNormalizers.java
===================================================================
--- src/java/org/apache/nutch/net/URLNormalizers.java	(revision 550027)
+++ src/java/org/apache/nutch/net/URLNormalizers.java	(working copy)
@@ -35,6 +35,7 @@
 import org.apache.nutch.plugin.ExtensionPoint;
 import org.apache.nutch.plugin.PluginRepository;
 import org.apache.nutch.plugin.PluginRuntimeException;
+import org.apache.nutch.util.ObjectCache;
 
 /**
  * This class uses a "chained filter" pattern to run defined normalizers.
@@ -115,18 +116,19 @@
     this.conf = conf;
     this.extensionPoint = PluginRepository.get(conf).getExtensionPoint(
             URLNormalizer.X_POINT_ID);
-
+    ObjectCache objectCache = ObjectCache.get(conf);
+    
     if (this.extensionPoint == null) {
       throw new RuntimeException("x point " + URLNormalizer.X_POINT_ID
               + " not found.");
     }
 
-    normalizers = (URLNormalizer[])conf.getObject(URLNormalizer.X_POINT_ID + "_" + scope);
+    normalizers = (URLNormalizer[])objectCache.getObject(URLNormalizer.X_POINT_ID + "_" + scope);
     if (normalizers == null) {
       normalizers = getURLNormalizers(scope);
     }
     if (normalizers == EMPTY_NORMALIZERS) {
-      normalizers = (URLNormalizer[])conf.getObject(URLNormalizer.X_POINT_ID + "_" + SCOPE_DEFAULT);
+      normalizers = (URLNormalizer[])objectCache.getObject(URLNormalizer.X_POINT_ID + "_" + SCOPE_DEFAULT);
       if (normalizers == null) {
         normalizers = getURLNormalizers(SCOPE_DEFAULT);
       }
@@ -148,6 +150,7 @@
    */
   URLNormalizer[] getURLNormalizers(String scope) {
     List extensions = getExtensions(scope);
+    ObjectCache objectCache = ObjectCache.get(conf);
     
     if (extensions == EMPTY_EXTENSION_LIST) {
       return EMPTY_NORMALIZERS;
@@ -161,11 +164,11 @@
       URLNormalizer normalizer = null;
       try {
         // check to see if we've cached this URLNormalizer instance yet
-        normalizer = (URLNormalizer) this.conf.getObject(ext.getId());
+        normalizer = (URLNormalizer) objectCache.getObject(ext.getId());
         if (normalizer == null) {
           // go ahead and instantiate it and then cache it
           normalizer = (URLNormalizer) ext.getExtensionInstance();
-          this.conf.setObject(ext.getId(), normalizer);
+          objectCache.setObject(ext.getId(), normalizer);
         }
         normalizers.add(normalizer);
       } catch (PluginRuntimeException e) {
@@ -191,8 +194,8 @@
    * @throws PluginRuntimeException
    */
   private List getExtensions(String scope) {
-
-    List extensions = (List) this.conf.getObject(URLNormalizer.X_POINT_ID + "_x_"
+    ObjectCache objectCache = ObjectCache.get(conf);
+    List extensions = (List) objectCache.getObject(URLNormalizer.X_POINT_ID + "_x_"
             + scope);
 
     // Just compare the reference:
@@ -204,11 +207,11 @@
     if (extensions == null) {
       extensions = findExtensions(scope);
       if (extensions != null) {
-        this.conf.setObject(URLNormalizer.X_POINT_ID + "_x_" + scope, extensions);
+        objectCache.setObject(URLNormalizer.X_POINT_ID + "_x_" + scope, extensions);
       } else {
         // Put the empty extension list into cache
         // to remember we don't know any related extension.
-        this.conf.setObject(URLNormalizer.X_POINT_ID + "_x_" + scope, EMPTY_EXTENSION_LIST);
+        objectCache.setObject(URLNormalizer.X_POINT_ID + "_x_" + scope, EMPTY_EXTENSION_LIST);
         extensions = EMPTY_EXTENSION_LIST;
       }
     }
Index: src/java/org/apache/nutch/net/URLFilters.java
===================================================================
--- src/java/org/apache/nutch/net/URLFilters.java	(revision 550027)
+++ src/java/org/apache/nutch/net/URLFilters.java	(working copy)
@@ -24,6 +24,7 @@
 import org.apache.nutch.plugin.ExtensionPoint;
 import org.apache.nutch.plugin.PluginRuntimeException;
 import org.apache.nutch.plugin.PluginRepository;
+import org.apache.nutch.util.ObjectCache;
 
 import org.apache.hadoop.conf.Configuration;
 /** Creates and caches {@link URLFilter} implementing plugins.*/
@@ -34,7 +35,8 @@
 
   public URLFilters(Configuration conf) {
     String order = conf.get(URLFILTER_ORDER);
-    this.filters = (URLFilter[]) conf.getObject(URLFilter.class.getName());
+    ObjectCache objectCache = ObjectCache.get(conf);
+    this.filters = (URLFilter[]) objectCache.getObject(URLFilter.class.getName());
 
     if (this.filters == null) {
       String[] orderedFilters = null;
@@ -57,7 +59,7 @@
           }
         }
         if (orderedFilters == null) {
-          conf.setObject(URLFilter.class.getName(), filterMap.values().toArray(
+          objectCache.setObject(URLFilter.class.getName(), filterMap.values().toArray(
               new URLFilter[0]));
         } else {
           ArrayList filters = new ArrayList();
@@ -67,13 +69,13 @@
               filters.add(filter);
             }
           }
-          conf.setObject(URLFilter.class.getName(), filters
+          objectCache.setObject(URLFilter.class.getName(), filters
               .toArray(new URLFilter[filters.size()]));
         }
       } catch (PluginRuntimeException e) {
         throw new RuntimeException(e);
       }
-      this.filters = (URLFilter[]) conf.getObject(URLFilter.class.getName());
+      this.filters = (URLFilter[]) objectCache.getObject(URLFilter.class.getName());
     }
   }
 
Index: src/java/org/apache/nutch/searcher/QueryFilters.java
===================================================================
--- src/java/org/apache/nutch/searcher/QueryFilters.java	(revision 550027)
+++ src/java/org/apache/nutch/searcher/QueryFilters.java	(working copy)
@@ -22,6 +22,7 @@
 
 import org.apache.nutch.plugin.*;
 import org.apache.nutch.searcher.Query.Clause;
+import org.apache.nutch.util.ObjectCache;
 import org.apache.hadoop.conf.Configuration;
 
 import java.util.*;
@@ -50,7 +51,8 @@
   }
 
   public QueryFilters(Configuration conf) {
-    this.queryFilters = (QueryFilter[]) conf.getObject(QueryFilter.class
+    ObjectCache objectCache = ObjectCache.get(conf);
+    this.queryFilters = (QueryFilter[]) objectCache.getObject(QueryFilter.class
         .getName());
     if (this.queryFilters == null) {
       try {
@@ -76,20 +78,20 @@
           filters[i] = (QueryFilter) extension.getExtensionInstance();
           FIELD_NAMES.addAll(fieldNames);
           FIELD_NAMES.addAll(rawFieldNames);
-          conf.setObject("FIELD_NAMES", FIELD_NAMES);
+          objectCache.setObject("FIELD_NAMES", FIELD_NAMES);
           RAW_FIELD_NAMES.addAll(rawFieldNames);
-          conf.setObject("RAW_FIELD_NAMES", RAW_FIELD_NAMES);
+          objectCache.setObject("RAW_FIELD_NAMES", RAW_FIELD_NAMES);
         }
-        conf.setObject(QueryFilter.class.getName(), filters);
+        objectCache.setObject(QueryFilter.class.getName(), filters);
       } catch (PluginRuntimeException e) {
         throw new RuntimeException(e);
       }
-      this.queryFilters = (QueryFilter[]) conf.getObject(QueryFilter.class
+      this.queryFilters = (QueryFilter[]) objectCache.getObject(QueryFilter.class
           .getName());
     } else {
       // cache already filled
-      FIELD_NAMES = (HashSet) conf.getObject("FIELD_NAMES");
-      RAW_FIELD_NAMES = (HashSet) conf.getObject("RAW_FIELD_NAMES");
+      FIELD_NAMES = (HashSet) objectCache.getObject("FIELD_NAMES");
+      RAW_FIELD_NAMES = (HashSet) objectCache.getObject("RAW_FIELD_NAMES");
     }
   }              
 
Index: src/java/org/apache/nutch/indexer/IndexingFilters.java
===================================================================
--- src/java/org/apache/nutch/indexer/IndexingFilters.java	(revision 550027)
+++ src/java/org/apache/nutch/indexer/IndexingFilters.java	(working copy)
@@ -28,6 +28,7 @@
 
 import org.apache.nutch.plugin.*;
 import org.apache.nutch.parse.Parse;
+import org.apache.nutch.util.ObjectCache;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.nutch.crawl.CrawlDatum;
 import org.apache.nutch.crawl.Inlinks;
@@ -45,7 +46,8 @@
   public IndexingFilters(Configuration conf) {
     /* Get indexingfilter.order property */
     String order = conf.get(INDEXINGFILTER_ORDER);
-    this.indexingFilters = (IndexingFilter[]) conf
+    ObjectCache objectCache = ObjectCache.get(conf);
+    this.indexingFilters = (IndexingFilter[]) objectCache
         .getObject(IndexingFilter.class.getName());
     if (this.indexingFilters == null) {
       /*
@@ -79,7 +81,7 @@
          * indeterminate order
          */
         if (orderedFilters == null) {
-          conf.setObject(IndexingFilter.class.getName(),
+          objectCache.setObject(IndexingFilter.class.getName(),
               (IndexingFilter[]) filterMap.values().toArray(
                   new IndexingFilter[0]));
           /* Otherwise run the filters in the required order */
@@ -92,13 +94,13 @@
               filters.add(filter);
             }
           }
-          conf.setObject(IndexingFilter.class.getName(), filters
+          objectCache.setObject(IndexingFilter.class.getName(), filters
               .toArray(new IndexingFilter[filters.size()]));
         }
       } catch (PluginRuntimeException e) {
         throw new RuntimeException(e);
       }
-      this.indexingFilters = (IndexingFilter[]) conf
+      this.indexingFilters = (IndexingFilter[]) objectCache
           .getObject(IndexingFilter.class.getName());
     }
   }                  
Index: src/java/org/apache/nutch/protocol/ProtocolFactory.java
===================================================================
--- src/java/org/apache/nutch/protocol/ProtocolFactory.java	(revision 550027)
+++ src/java/org/apache/nutch/protocol/ProtocolFactory.java	(working copy)
@@ -25,6 +25,7 @@
 import org.apache.commons.logging.LogFactory;
 
 import org.apache.nutch.plugin.*;
+import org.apache.nutch.util.ObjectCache;
 
 import org.apache.hadoop.conf.Configuration;
 
@@ -63,6 +64,7 @@
    *           when Protocol can not be found for urlString
    */
   public Protocol getProtocol(String urlString) throws ProtocolNotFound {
+    ObjectCache objectCache = ObjectCache.get(conf);
     try {
       URL url = new URL(urlString);
       String protocolName = url.getProtocol();
@@ -70,8 +72,8 @@
       if (protocolName == null)
         throw new ProtocolNotFound(urlString);
 
-      if (conf.getObject(cacheId) != null) {
-        return (Protocol) conf.getObject(cacheId);
+      if (objectCache.getObject(cacheId) != null) {
+        return (Protocol) objectCache.getObject(cacheId);
       } else {
         Extension extension = findExtension(protocolName);
         if (extension == null) {
@@ -80,7 +82,7 @@
 
         Protocol protocol = (Protocol) extension.getExtensionInstance();
 
-        conf.setObject(cacheId, protocol);
+        objectCache.setObject(cacheId, protocol);
 
         return protocol;
       }
Index: src/java/org/apache/nutch/scoring/ScoringFilters.java
===================================================================
--- src/java/org/apache/nutch/scoring/ScoringFilters.java	(revision 550027)
+++ src/java/org/apache/nutch/scoring/ScoringFilters.java	(working copy)
@@ -30,6 +30,7 @@
 import org.apache.nutch.plugin.PluginRuntimeException;
 import org.apache.nutch.plugin.PluginRepository;
 import org.apache.nutch.protocol.Content;
+import org.apache.nutch.util.ObjectCache;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
@@ -46,8 +47,9 @@
 
   public ScoringFilters(Configuration conf) {
     super(conf);
+    ObjectCache objectCache = ObjectCache.get(conf);
     String order = conf.get("scoring.filter.order");
-    this.filters = (ScoringFilter[]) conf.getObject(ScoringFilter.class.getName());
+    this.filters = (ScoringFilter[]) objectCache.getObject(ScoringFilter.class.getName());
 
     if (this.filters == null) {
       String[] orderedFilters = null;
@@ -68,18 +70,18 @@
           }
         }
         if (orderedFilters == null) {
-          conf.setObject(ScoringFilter.class.getName(), filterMap.values().toArray(new ScoringFilter[0]));
+          objectCache.setObject(ScoringFilter.class.getName(), filterMap.values().toArray(new ScoringFilter[0]));
         } else {
           ScoringFilter[] filter = new ScoringFilter[orderedFilters.length];
           for (int i = 0; i < orderedFilters.length; i++) {
             filter[i] = (ScoringFilter) filterMap.get(orderedFilters[i]);
           }
-          conf.setObject(ScoringFilter.class.getName(), filter);
+          objectCache.setObject(ScoringFilter.class.getName(), filter);
         }
       } catch (PluginRuntimeException e) {
         throw new RuntimeException(e);
       }
-      this.filters = (ScoringFilter[]) conf.getObject(ScoringFilter.class.getName());
+      this.filters = (ScoringFilter[]) objectCache.getObject(ScoringFilter.class.getName());
     }
     if (this.filters == null || this.filters.length == 0)
       throw new RuntimeException("No scoring plugins - at least one scoring plugin is required!");
Index: src/java/org/apache/nutch/crawl/SignatureFactory.java
===================================================================
--- src/java/org/apache/nutch/crawl/SignatureFactory.java	(revision 550027)
+++ src/java/org/apache/nutch/crawl/SignatureFactory.java	(working copy)
@@ -23,6 +23,7 @@
 
 // Hadoop imports
 import org.apache.hadoop.conf.Configuration;
+import org.apache.nutch.util.ObjectCache;
 
 /**
  * Factory class, which instantiates a Signature implementation according to the
@@ -39,7 +40,8 @@
   /** Return the default Signature implementation. */
   public static Signature getSignature(Configuration conf) {
     String clazz = conf.get("db.signature.class", MD5Signature.class.getName());
-    Signature impl = (Signature)conf.getObject(clazz);
+    ObjectCache objectCache = ObjectCache.get(conf);
+    Signature impl = (Signature)objectCache.getObject(clazz);
     if (impl == null) {
       try {
         if (LOG.isInfoEnabled()) {
@@ -48,7 +50,7 @@
         Class implClass = Class.forName(clazz);
         impl = (Signature)implClass.newInstance();
         impl.setConf(conf);
-        conf.setObject(clazz, impl);
+        objectCache.setObject(clazz, impl);
       } catch (Exception e) {
         throw new RuntimeException("Couldn't create " + clazz, e);
       }
Index: src/java/org/apache/nutch/crawl/FetchScheduleFactory.java
===================================================================
--- src/java/org/apache/nutch/crawl/FetchScheduleFactory.java	(revision 550027)
+++ src/java/org/apache/nutch/crawl/FetchScheduleFactory.java	(working copy)
@@ -20,6 +20,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.nutch.util.ObjectCache;
 
 /** Creates and caches a {@link FetchSchedule} implementation. */
 public class FetchScheduleFactory {
@@ -31,14 +32,15 @@
   /** Return the FetchSchedule implementation. */
   public static FetchSchedule getFetchSchedule(Configuration conf) {
     String clazz = conf.get("db.fetch.schedule.class", DefaultFetchSchedule.class.getName());
-    FetchSchedule impl = (FetchSchedule)conf.getObject(clazz);
+    ObjectCache objectCache = ObjectCache.get(conf);
+    FetchSchedule impl = (FetchSchedule)objectCache.getObject(clazz);
     if (impl == null) {
       try {
         LOG.info("Using FetchSchedule impl: " + clazz);
         Class implClass = Class.forName(clazz);
         impl = (FetchSchedule)implClass.newInstance();
         impl.setConf(conf);
-        conf.setObject(clazz, impl);
+        objectCache.setObject(clazz, impl);
       } catch (Exception e) {
         throw new RuntimeException("Couldn't create " + clazz, e);
       }
Index: src/java/org/apache/nutch/parse/ParserFactory.java
===================================================================
--- src/java/org/apache/nutch/parse/ParserFactory.java	(revision 550027)
+++ src/java/org/apache/nutch/parse/ParserFactory.java	(working copy)
@@ -36,6 +36,7 @@
 import org.apache.nutch.plugin.PluginRuntimeException;
 import org.apache.nutch.plugin.PluginRepository;
 import org.apache.nutch.util.LogUtil;
+import org.apache.nutch.util.ObjectCache;
 import org.apache.nutch.util.mime.MimeType;
 import org.apache.nutch.util.mime.MimeTypeException;
 
@@ -57,12 +58,13 @@
 
   public ParserFactory(Configuration conf) {
     this.conf = conf;
+    ObjectCache objectCache = ObjectCache.get(conf);
     this.extensionPoint = PluginRepository.get(conf).getExtensionPoint(
         Parser.X_POINT_ID);
-    this.parsePluginList = (ParsePluginList)conf.getObject(ParsePluginList.class.getName());
+    this.parsePluginList = (ParsePluginList)objectCache.getObject(ParsePluginList.class.getName());
     if (this.parsePluginList == null) {
       this.parsePluginList = new ParsePluginsReader().parse(conf);
-      conf.setObject(ParsePluginList.class.getName(), this.parsePluginList);
+      objectCache.setObject(ParsePluginList.class.getName(), this.parsePluginList);
     }
 
     if (this.extensionPoint == null) {
@@ -105,6 +107,8 @@
     List parsers = null;
     List parserExts = null;
     
+    ObjectCache objectCache = ObjectCache.get(conf);
+    
     // TODO once the MimeTypes is available
     // parsers = getExtensions(MimeUtils.map(contentType));
     // if (parsers != null) {
@@ -124,11 +128,11 @@
       Parser p = null;
       try {
         //check to see if we've cached this parser instance yet
-        p = (Parser) this.conf.getObject(ext.getId());
+        p = (Parser) objectCache.getObject(ext.getId());
         if (p == null) {
           // go ahead and instantiate it and then cache it
           p = (Parser) ext.getExtensionInstance();
-          this.conf.setObject(ext.getId(),p);
+          objectCache.setObject(ext.getId(),p);
         }
         parsers.add(p);
       } catch (PluginRuntimeException e) {
@@ -170,6 +174,8 @@
     Extension[] extensions = this.extensionPoint.getExtensions();
     Extension parserExt = null;
 
+    ObjectCache objectCache = ObjectCache.get(conf);
+    
     if (id != null) {
       parserExt = getExtension(extensions, id);
     }
@@ -182,14 +188,14 @@
     }
     
     // first check the cache	    	   
-    if (this.conf.getObject(parserExt.getId()) != null) {
-      return (Parser) this.conf.getObject(parserExt.getId());
+    if (objectCache.getObject(parserExt.getId()) != null) {
+      return (Parser) objectCache.getObject(parserExt.getId());
 
     // if not found in cache, instantiate the Parser    
     } else {
       try {
         Parser p = (Parser) parserExt.getExtensionInstance();
-        this.conf.setObject(parserExt.getId(), p);
+        objectCache.setObject(parserExt.getId(), p);
         return p;
       } catch (PluginRuntimeException e) {
         if (LOG.isWarnEnabled()) {
@@ -211,6 +217,7 @@
    */
   protected List getExtensions(String contentType) {
     
+    ObjectCache objectCache = ObjectCache.get(conf);
     // First of all, tries to clean the content-type
     String type = null;
     try {
@@ -223,7 +230,7 @@
       type = contentType;
     }
 
-    List extensions = (List) this.conf.getObject(type);
+    List extensions = (List) objectCache.getObject(type);
 
     // Just compare the reference:
     // if this is the empty list, we know we will find no extension.
@@ -234,11 +241,11 @@
     if (extensions == null) {
       extensions = findExtensions(type);
       if (extensions != null) {
-        this.conf.setObject(type, extensions);
+        objectCache.setObject(type, extensions);
       } else {
       	// Put the empty extension list into cache
       	// to remember we don't know any related extension.
-      	this.conf.setObject(type, EMPTY_EXTENSION_LIST);
+        objectCache.setObject(type, EMPTY_EXTENSION_LIST);
       }
     }
     return extensions;
Index: src/java/org/apache/nutch/parse/HtmlParseFilters.java
===================================================================
--- src/java/org/apache/nutch/parse/HtmlParseFilters.java	(revision 550027)
+++ src/java/org/apache/nutch/parse/HtmlParseFilters.java	(working copy)
@@ -21,6 +21,7 @@
 
 import org.apache.nutch.protocol.Content;
 import org.apache.nutch.plugin.*;
+import org.apache.nutch.util.ObjectCache;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.io.Text;
 
@@ -32,7 +33,8 @@
   private HtmlParseFilter[] htmlParseFilters;
 
   public HtmlParseFilters(Configuration conf) {
-        this.htmlParseFilters = (HtmlParseFilter[]) conf.getObject(HtmlParseFilter.class.getName());
+        ObjectCache objectCache = ObjectCache.get(conf);
+        this.htmlParseFilters = (HtmlParseFilter[]) objectCache.getObject(HtmlParseFilter.class.getName());
         if (htmlParseFilters == null) {
             HashMap filters = new HashMap();
             try {
@@ -48,11 +50,11 @@
                     }
                 }
                 HtmlParseFilter[] htmlParseFilters = (HtmlParseFilter[]) filters.values().toArray(new HtmlParseFilter[filters.size()]);
-                conf.setObject(HtmlParseFilter.class.getName(), htmlParseFilters);
+                objectCache.setObject(HtmlParseFilter.class.getName(), htmlParseFilters);
             } catch (PluginRuntimeException e) {
                 throw new RuntimeException(e);
             }
-            this.htmlParseFilters = (HtmlParseFilter[]) conf.getObject(HtmlParseFilter.class.getName());
+            this.htmlParseFilters = (HtmlParseFilter[]) objectCache.getObject(HtmlParseFilter.class.getName());
         }
     }                  
 
Index: src/java/org/apache/nutch/util/ObjectCache.java
===================================================================
--- src/java/org/apache/nutch/util/ObjectCache.java	(revision 0)
+++ src/java/org/apache/nutch/util/ObjectCache.java	(revision 0)
@@ -0,0 +1,52 @@
+/**
+ * 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.
+ */
+package org.apache.nutch.util;
+
+import java.util.HashMap;
+import java.util.WeakHashMap;
+
+import org.apache.hadoop.conf.Configuration;
+
+public class ObjectCache {
+  
+  private static final WeakHashMap<Configuration, ObjectCache> CACHE = 
+    new WeakHashMap<Configuration, ObjectCache>();
+
+  private final HashMap<String, Object> objectMap;
+  
+  private ObjectCache() {
+    objectMap = new HashMap<String, Object>();
+  }
+  
+  public static ObjectCache get(Configuration conf) {
+    ObjectCache objectCache = CACHE.get(conf);
+    if (objectCache == null) {
+      objectCache = new ObjectCache();
+      CACHE.put(conf, objectCache);
+    }
+    return objectCache;
+  }
+  
+  public Object getObject(String key) {
+    return objectMap.get(key);
+  }
+  
+  public void setObject(String key, Object value) {
+    objectMap.put(key, value);
+  }
+}
+
Index: src/plugin/subcollection/src/java/org/apache/nutch/collection/CollectionManager.java
===================================================================
--- src/plugin/subcollection/src/java/org/apache/nutch/collection/CollectionManager.java	(revision 550027)
+++ src/plugin/subcollection/src/java/org/apache/nutch/collection/CollectionManager.java	(working copy)
@@ -35,6 +35,7 @@
 import org.apache.nutch.util.DomUtil;
 import org.apache.nutch.util.LogUtil;
 import org.apache.nutch.util.NutchConfiguration;
+import org.apache.nutch.util.ObjectCache;
 import org.apache.xerces.dom.DocumentImpl;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -104,14 +105,15 @@
   
   public static CollectionManager getCollectionManager(Configuration conf) {
     String key = "collectionmanager";
-    CollectionManager impl = (CollectionManager)conf.getObject(key);
+    ObjectCache objectCache = ObjectCache.get(conf);
+    CollectionManager impl = (CollectionManager)objectCache.getObject(key);
     if (impl == null) {
       try {
         if (LOG.isInfoEnabled()) {
           LOG.info("Instantiating CollectionManager");
         }
         impl=new CollectionManager(conf);
-        conf.setObject(key,impl);
+        objectCache.setObject(key,impl);
       } catch (Exception e) {
         throw new RuntimeException("Couldn't create CollectionManager",e);
       }
