Index: src/java/org/apache/nutch/crawl/AdaptiveFetchSchedule.java
===================================================================
--- src/java/org/apache/nutch/crawl/AdaptiveFetchSchedule.java	(revision 1550034)
+++ src/java/org/apache/nutch/crawl/AdaptiveFetchSchedule.java	(working copy)
@@ -18,8 +18,12 @@
 package org.apache.nutch.crawl;
 
 import org.apache.hadoop.conf.Configuration;
+import org.apache.nutch.metadata.Nutch;
 import org.apache.nutch.storage.WebPage;
+import org.apache.nutch.util.Bytes;
 
+import java.nio.ByteBuffer;
+
 /**
  * This class implements an adaptive re-fetch algorithm. This works as follows:
  * <ul>
@@ -80,34 +84,39 @@
           long fetchTime, long modifiedTime, int state) {
     super.setFetchSchedule(url, page, prevFetchTime, prevModifiedTime,
         fetchTime, modifiedTime, state);
+    
+    int interval = page.getFetchInterval();
     long refTime = fetchTime;
-    if (modifiedTime <= 0) modifiedTime = fetchTime;
-    int interval = page.getFetchInterval();
-    switch (state) {
-      case FetchSchedule.STATUS_MODIFIED:
-        interval *= (1.0f - DEC_RATE);
-        break;
-      case FetchSchedule.STATUS_NOTMODIFIED:
-        interval *= (1.0f + INC_RATE);
-        break;
-      case FetchSchedule.STATUS_UNKNOWN:
-        break;
+    
+    ByteBuffer intervalRaw = page.getFromMetadata(Nutch.FIXED_INTERVAL_KEY);
+    if (intervalRaw != null) {
+      // Is fetch interval preset in CrawlDatum MD? Then use preset interval
+      interval = Bytes.toInt(intervalRaw.array(), intervalRaw.arrayOffset() + intervalRaw.position());
+    } else {
+      if (modifiedTime <= 0) modifiedTime = fetchTime;
+      switch (state) {
+        case FetchSchedule.STATUS_MODIFIED:
+          interval *= (1.0f - DEC_RATE);
+          break;
+        case FetchSchedule.STATUS_NOTMODIFIED:
+          interval *= (1.0f + INC_RATE);
+          break;
+        case FetchSchedule.STATUS_UNKNOWN:
+          break;
+      }
+      if (SYNC_DELTA) {
+        // try to synchronize with the time of change
+        // TODO: different from normal class (is delta in seconds)?
+        int delta = (int) ((fetchTime - modifiedTime) / 1000L) ;
+        if (delta > interval) interval = delta;
+        refTime = fetchTime - Math.round(delta * SYNC_DELTA_RATE);
+      }
+      if (interval < MIN_INTERVAL) interval = MIN_INTERVAL;
+      if (interval > MAX_INTERVAL) interval = MAX_INTERVAL;
     }
-    if (SYNC_DELTA) {
-      // try to synchronize with the time of change
-      // TODO: different from normal class (is delta in seconds)?
-      int delta = (int) ((fetchTime - modifiedTime) / 1000L) ;
-      if (delta > interval) interval = delta;
-      refTime = fetchTime - Math.round(delta * SYNC_DELTA_RATE);
-    }
-    if (interval < MIN_INTERVAL) interval = MIN_INTERVAL;
-    if (interval > MAX_INTERVAL) interval = MAX_INTERVAL;
-   
     page.setFetchInterval(interval);
     page.setFetchTime(refTime + interval * 1000L);
     page.setModifiedTime(modifiedTime);
     page.setPrevModifiedTime(prevModifiedTime);
   }
-
-
 }
Index: src/java/org/apache/nutch/crawl/InjectorJob.java
===================================================================
--- src/java/org/apache/nutch/crawl/InjectorJob.java	(revision 1550034)
+++ src/java/org/apache/nutch/crawl/InjectorJob.java	(working copy)
@@ -47,6 +47,7 @@
 import org.apache.nutch.storage.Mark;
 import org.apache.nutch.storage.StorageUtils;
 import org.apache.nutch.storage.WebPage;
+import org.apache.nutch.util.Bytes;
 import org.apache.nutch.util.NutchConfiguration;
 import org.apache.nutch.util.NutchJob;
 import org.apache.nutch.util.NutchTool;
@@ -85,6 +86,11 @@
    */
   public static String nutchFetchIntervalMDName = "nutch.fetchInterval";
   
+  /** 
+   * metadata key reserved for setting a fixed custom fetchInterval for a specific URL 
+   */
+  public static String nutchFixedFetchIntervalMDName = "nutch.fetchInterval.fixed";
+
   public static class UrlMapper extends
       Mapper<LongWritable, Text, String, WebPage> {
     private URLNormalizers urlNormalizers;
@@ -121,6 +127,7 @@
       // must be name=value and separated by \t
       float customScore = -1f;
       int customInterval = interval;
+      int fixedInterval = -1;
       Map<String, String> metadata = new TreeMap<String, String>();
       if (url.indexOf("\t") != -1) {
         String[] splits = url.split("\t");
@@ -144,6 +151,11 @@
               customInterval = Integer.parseInt(metavalue);
             } catch (NumberFormatException nfe) {
             }
+          } else if (metaname.equals(nutchFixedFetchIntervalMDName)) {
+            try {
+              fixedInterval = Integer.parseInt(metavalue);
+            } catch (NumberFormatException nfe) {
+            }
           } else
             metadata.put(metaname, metavalue);
         }
@@ -162,7 +174,13 @@
       String reversedUrl = TableUtil.reverseUrl(url);  // collect it
       WebPage row = new WebPage();
       row.setFetchTime(curTime);
-      row.setFetchInterval(customInterval);
+      if (fixedInterval > -1) {
+        // Set writable using float. Flaot is used by AdaptiveFetchSchedule
+        row.putToMetadata(Nutch.FIXED_INTERVAL_KEY, ByteBuffer.wrap(Bytes.toBytes(fixedInterval)));
+        row.setFetchInterval(fixedInterval);
+      } else {
+        row.setFetchInterval(customInterval);
+      }
 
       // now add the metadata
       Iterator<String> keysIter = metadata.keySet().iterator();
Index: src/java/org/apache/nutch/metadata/Nutch.java
===================================================================
--- src/java/org/apache/nutch/metadata/Nutch.java	(revision 1550034)
+++ src/java/org/apache/nutch/metadata/Nutch.java	(working copy)
@@ -69,7 +69,12 @@
   public static final String REPR_URL_KEY = "_repr_";
 
   public static final Text WRITABLE_REPR_URL_KEY = new Text(REPR_URL_KEY);
+  
+  /** Used by AdaptiveFetchSchedule to maintain custom fetch interval */
+  public static final String FIXED_INTERVAL_KEY_STR = "fixedInterval";
 
+  public static final Utf8 FIXED_INTERVAL_KEY = new Utf8(FIXED_INTERVAL_KEY_STR);
+
   public static final String ALL_BATCH_ID_STR = "-all";
 
   public static final Utf8 ALL_CRAWL_ID = new Utf8(ALL_BATCH_ID_STR);
