Index: lucene/contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/utils/Algorithm.java
===================================================================
--- lucene/contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/utils/Algorithm.java	(revision 1080130)
+++ lucene/contrib/benchmark/src/java/org/apache/lucene/benchmark/byTask/utils/Algorithm.java	(working copy)
@@ -21,6 +21,7 @@
 import java.io.StringReader;
 import java.lang.reflect.Constructor;
 import java.util.ArrayList;
+import java.util.Arrays;
 
 import org.apache.lucene.benchmark.byTask.PerfRunData;
 import org.apache.lucene.benchmark.byTask.tasks.PerfTask;
@@ -33,15 +34,22 @@
 public class Algorithm {
   
   private TaskSequence sequence;
+  private final String taskPackage;
+  private String[] altTaskPackages;
   
   /**
    * Read algorithm from file
+   * Property examined: alt.tasks.packages == comma separated list of 
+   * alternate package names where tasks would be searched for, in addition 
+   * to the default package (that of {@link PerfTask}{@link #getClass()}).
    * @param runData perf-run-data used at running the tasks.
    * @throws Exception if errors while parsing the algorithm 
    */
   @SuppressWarnings("fallthrough")
   public Algorithm (PerfRunData runData) throws Exception {
-    String algTxt = runData.getConfig().getAlgorithmText();
+    taskPackage = PerfTask.class.getPackage().getName() + ".";
+    Config config = runData.getConfig();
+    String algTxt = config.getAlgorithmText();
     sequence = new TaskSequence(runData,null,null,false);
     TaskSequence currSequence = sequence;
     PerfTask prevTask = null;
@@ -55,14 +63,13 @@
     boolean colonOk = false; 
     boolean isDisableCountNextTask = false; // only for primitive tasks
     currSequence.setDepth(0);
-    String taskPackage = PerfTask.class.getPackage().getName() + ".";
     
     while (stok.nextToken() != StreamTokenizer.TT_EOF) { 
       switch(stok.ttype) {
   
         case StreamTokenizer.TT_WORD:
           String s = stok.sval;
-          Constructor<? extends PerfTask> cnstr = Class.forName(taskPackage+s+"Task")
+          Constructor<? extends PerfTask> cnstr = taskClass(config,s)
             .asSubclass(PerfTask.class).getConstructor(PerfRunData.class);
           PerfTask task = cnstr.newInstance(runData);
           task.setDisableCounting(isDisableCountNextTask);
@@ -248,6 +255,30 @@
     }
   }
 
+  private Class<?> taskClass(Config config, String taskName)
+      throws ClassNotFoundException {
+    try {
+      return Class.forName(taskPackage+taskName+"Task");
+    } catch (ClassNotFoundException e) {
+      if (altTaskPackages == null) { // tested for the first time
+        String alt = config.get("alt.tasks.packages", "");
+        if (alt!=null && alt.length()>0) {
+          altTaskPackages = alt.split(",");
+        }
+      }
+      if (altTaskPackages.length > 0) {
+        for (String altpkg : altTaskPackages) {
+          try {
+            return Class.forName(altpkg+'.'+taskName+"Task");
+          } catch (ClassNotFoundException e2) {
+          }
+        }
+        throw new ClassNotFoundException(taskName+" not found, also in alt pkgs "+Arrays.toString(altTaskPackages), e);
+      }
+      throw e;
+    }
+  }
+
   /* (non-Javadoc)
    * @see java.lang.Object#toString()
    */
