diff --git a/dev/core/src/com/google/gwt/dev/CompilePerms.java b/dev/core/src/com/google/gwt/dev/CompilePerms.java
index cc1019e..0a0a5b6 100644
--- a/dev/core/src/com/google/gwt/dev/CompilePerms.java
+++ b/dev/core/src/com/google/gwt/dev/CompilePerms.java
@@ -333,7 +333,7 @@
 
     ModuleDef module = ModuleDefLoader.loadFromClassPath(logger, moduleName);
     PropertyPermutations allPermutations = new PropertyPermutations(
-        module.getProperties());
+        module.getProperties(), module.getActiveLinkerNames());
     int[] perms = options.getPermsToCompile();
     if (perms == null) {
       perms = new int[allPermutations.size()];
diff --git a/dev/core/src/com/google/gwt/dev/Link.java b/dev/core/src/com/google/gwt/dev/Link.java
index 8cf22f4..b585ccc 100644
--- a/dev/core/src/com/google/gwt/dev/Link.java
+++ b/dev/core/src/com/google/gwt/dev/Link.java
@@ -30,6 +30,7 @@
 import com.google.gwt.dev.cfg.BindingProperty;
 import com.google.gwt.dev.cfg.ModuleDef;
 import com.google.gwt.dev.cfg.ModuleDefLoader;
+import com.google.gwt.dev.cfg.PropertyPermutations;
 import com.google.gwt.dev.cfg.StaticPropertyOracle;
 import com.google.gwt.dev.jjs.JJSOptions;
 import com.google.gwt.dev.jjs.PermutationResult;
@@ -547,7 +548,7 @@
         Permutation[] perms = precomp.getPermutations();
         List<FileBackedObject<PermutationResult>> resultFiles = CompilePerms.makeResultFiles(
             compilerWorkDir, perms);
-        
+
         // Check that all files are present
         for (FileBackedObject<PermutationResult> file : resultFiles) {
           if (!file.getFile().exists()) {
@@ -582,7 +583,8 @@
   private boolean doLinkFinal(TreeLogger logger, File compilerWorkDir,
       ModuleDef module, JJSOptions precompileOptions)
       throws UnableToCompleteException {
-    int numPermutations = module.getProperties().numPermutations();
+    int numPermutations = new PropertyPermutations(module.getProperties(),
+        module.getActiveLinkerNames()).size();
     List<File> resultFiles = new ArrayList<File>(numPermutations);
     for (int i = 0; i < numPermutations; ++i) {
       File f = CompilePerms.makePermFilename(compilerWorkDir, i);
diff --git a/dev/core/src/com/google/gwt/dev/Precompile.java b/dev/core/src/com/google/gwt/dev/Precompile.java
index b2801f0..7a41eff 100644
--- a/dev/core/src/com/google/gwt/dev/Precompile.java
+++ b/dev/core/src/com/google/gwt/dev/Precompile.java
@@ -425,7 +425,7 @@
       JJSOptions jjsOptions, ModuleDef module, File genDir,
       File generatorResourcesDir, File dumpSignatureFile) {
     PropertyPermutations allPermutations = new PropertyPermutations(
-        module.getProperties());
+        module.getProperties(), module.getActiveLinkerNames());
     return precompile(logger, jjsOptions, module, 0, allPermutations, genDir,
         generatorResourcesDir, dumpSignatureFile);
   }
@@ -466,8 +466,8 @@
       ArtifactSet generatorArtifacts = new ArtifactSet();
       DistillerRebindPermutationOracle rpo = new DistillerRebindPermutationOracle(
           module, compilationState, generatorArtifacts,
-          new PropertyPermutations(module.getProperties()), genDir,
-          generatorResourcesDir);
+          new PropertyPermutations(module.getProperties(),
+              module.getActiveLinkerNames()), genDir, generatorResourcesDir);
       // Allow GC later.
       compilationState = null;
       if (dumpSignatureFile != null) {
@@ -624,7 +624,8 @@
         TreeLogger branch = logger.branch(TreeLogger.INFO,
             "Precompiling (minimal) module " + module.getName());
         Util.writeObjectAsFile(logger, precompilationFile, options);
-        int numPermutations = module.getProperties().numPermutations();
+        int numPermutations = new PropertyPermutations(module.getProperties(),
+            module.getActiveLinkerNames()).size();
         Util.writeStringAsFile(logger, new File(compilerWorkDir,
             PERM_COUNT_FILENAME), String.valueOf(numPermutations));
         branch.log(TreeLogger.INFO,
diff --git a/dev/core/src/com/google/gwt/dev/cfg/Condition.java b/dev/core/src/com/google/gwt/dev/cfg/Condition.java
index 3839abb..f44d2d7 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/Condition.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/Condition.java
@@ -15,10 +15,8 @@
  */
 package com.google.gwt.dev.cfg;
 
-import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
 import com.google.gwt.dev.util.collect.Sets;
 
 import java.io.Serializable;
@@ -36,28 +34,32 @@
     return Sets.create();
   }
 
-  public final boolean isTrue(TreeLogger logger, PropertyOracle propertyOracle,
-      TypeOracle typeOracle, String testType) throws UnableToCompleteException {
+  /**
+   * Test the condition with the given parameters. If <code>testType</code> is
+   * <code>null</code>, then this condition isn't being used to remap a type,
+   * and <code>typeOracle</code> can also be <code>null</code>.
+   */
+  public final boolean isTrue(TreeLogger logger, DeferredBindingQuery query)
+      throws UnableToCompleteException {
 
     boolean logDebug = logger.isLoggable(TreeLogger.DEBUG);
 
     if (logDebug) {
-      String startMsg = getEvalBeforeMessage(testType);
+      String startMsg = getEvalBeforeMessage(query.getTestType());
       logger = logger.branch(TreeLogger.DEBUG, startMsg, null);
     }
 
-    boolean result = doEval(logger, propertyOracle, typeOracle, testType);
+    boolean result = doEval(logger, query);
 
     if (logDebug) {
-      String afterMsg = getEvalAfterMessage(testType, result);
+      String afterMsg = getEvalAfterMessage(query.getTestType(), result);
       logger.log(TreeLogger.DEBUG, afterMsg, null);
     }
 
     return result;
   }
 
-  protected abstract boolean doEval(TreeLogger logger,
-      PropertyOracle propertyOracle, TypeOracle typeOracle, String testType)
+  protected abstract boolean doEval(TreeLogger logger, DeferredBindingQuery query)
       throws UnableToCompleteException;
 
   protected abstract String getEvalAfterMessage(String testType, boolean result);
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ConditionAll.java b/dev/core/src/com/google/gwt/dev/cfg/ConditionAll.java
index 94a47cb..c53ac97 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ConditionAll.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ConditionAll.java
@@ -15,10 +15,8 @@
  */
 package com.google.gwt.dev.cfg;
 
-import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
 
 import java.util.Iterator;
 
@@ -31,11 +29,11 @@
   public ConditionAll() {
   }
 
-  protected boolean doEval(TreeLogger logger, PropertyOracle propertyOracle,
-      TypeOracle typeOracle, String testType) throws UnableToCompleteException {
+  protected boolean doEval(TreeLogger logger, DeferredBindingQuery query)
+      throws UnableToCompleteException {
     for (Iterator<Condition> iter = getConditions().iterator(); iter.hasNext();) {
       Condition condition = iter.next();
-      if (!condition.isTrue(logger, propertyOracle, typeOracle, testType)) {
+      if (!condition.isTrue(logger, query)) {
         return false;
       }
     }
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ConditionAny.java b/dev/core/src/com/google/gwt/dev/cfg/ConditionAny.java
index edd34c0..2f474c2 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ConditionAny.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ConditionAny.java
@@ -15,10 +15,8 @@
  */
 package com.google.gwt.dev.cfg;
 
-import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
 
 import java.util.Iterator;
 
@@ -30,11 +28,11 @@
   public ConditionAny() {
   }
 
-  protected boolean doEval(TreeLogger logger, PropertyOracle propertyOracle,
-      TypeOracle typeOracle, String testType) throws UnableToCompleteException {
+  protected boolean doEval(TreeLogger logger, DeferredBindingQuery query)
+      throws UnableToCompleteException {
     for (Iterator<Condition> iter = getConditions().iterator(); iter.hasNext();) {
       Condition condition = iter.next();
-      if (condition.isTrue(logger, propertyOracle, typeOracle, testType)) {
+      if (condition.isTrue(logger, query)) {
         return true;
       }
     }
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ConditionNone.java b/dev/core/src/com/google/gwt/dev/cfg/ConditionNone.java
index a1c1133..3e1b959 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ConditionNone.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ConditionNone.java
@@ -15,10 +15,8 @@
  */
 package com.google.gwt.dev.cfg;
 
-import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
 
 import java.util.Iterator;
 
@@ -31,11 +29,11 @@
   public ConditionNone() {
   }
 
-  protected boolean doEval(TreeLogger logger, PropertyOracle propertyOracle,
-      TypeOracle typeOracle, String testType) throws UnableToCompleteException {
+  protected boolean doEval(TreeLogger logger, DeferredBindingQuery query)
+      throws UnableToCompleteException {
     for (Iterator<Condition> iter = getConditions().iterator(); iter.hasNext();) {
       Condition condition = iter.next();
-      if (condition.isTrue(logger, propertyOracle, typeOracle, testType)) {
+      if (condition.isTrue(logger, query)) {
         return false;
       }
     }
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenLinkerAdded.java b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenLinkerAdded.java
new file mode 100644
index 0000000..dd15934
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenLinkerAdded.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed 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 com.google.gwt.dev.cfg;
+
+import com.google.gwt.core.ext.TreeLogger;
+
+/**
+ * A condition that is true when the active linkers include the one specified.
+ */
+public class ConditionWhenLinkerAdded extends Condition {
+  private final String linkerName;
+
+  public ConditionWhenLinkerAdded(String linkerName) {
+    this.linkerName = linkerName;
+  }
+
+  @Override
+  public String toString() {
+    return "<when-linkers-include name='" + linkerName + "'/>";
+  }
+
+  @Override
+  protected boolean doEval(TreeLogger logger, DeferredBindingQuery query) {
+    return query.getLinkerNames().contains(linkerName);
+  }
+
+  @Override
+  protected String getEvalAfterMessage(String testType, boolean result) {
+    if (result) {
+      return "Yes, the requested linker is active";
+    } else {
+      return "No, the requested linker is not active";
+    }
+  }
+
+  @Override
+  protected String getEvalBeforeMessage(String testType) {
+    return toString();
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenPropertyIs.java b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenPropertyIs.java
index ac8205d..2148fcd 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenPropertyIs.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenPropertyIs.java
@@ -21,7 +21,6 @@
 import com.google.gwt.core.ext.SelectionProperty;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
 import com.google.gwt.dev.util.collect.Sets;
 
 import java.util.Set;
@@ -50,8 +49,9 @@
     return "<when-property-is name='" + propName + "' value='" + value + "'/>";
   }
 
-  protected boolean doEval(TreeLogger logger, PropertyOracle propertyOracle,
-      TypeOracle typeOracle, String testType) throws UnableToCompleteException {
+  protected boolean doEval(TreeLogger logger, DeferredBindingQuery query)
+      throws UnableToCompleteException {
+    PropertyOracle propertyOracle = query.getPropertyOracle();
     String testValue;
     try {
       try {
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenTypeAssignableTo.java b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenTypeAssignableTo.java
index 04d1df4..6bf00b9 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenTypeAssignableTo.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenTypeAssignableTo.java
@@ -15,7 +15,6 @@
  */
 package com.google.gwt.dev.cfg;
 
-import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.typeinfo.JClassType;
@@ -42,8 +41,10 @@
     return "<when-assignable class='" + assignableToTypeName + "'/>";
   }
 
-  protected boolean doEval(TreeLogger logger, PropertyOracle propertyOracle,
-      TypeOracle typeOracle, String testType) throws UnableToCompleteException {
+  protected boolean doEval(TreeLogger logger, DeferredBindingQuery query)
+      throws UnableToCompleteException {
+    TypeOracle typeOracle = query.getTypeOracle();
+    String testType = query.getTestType();
     JClassType fromType = typeOracle.findType(testType);
     if (fromType == null) {
       Util.logMissingTypeErrorWithHints(logger, testType);
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenTypeIs.java b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenTypeIs.java
index 68204b5..495b5fc 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenTypeIs.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ConditionWhenTypeIs.java
@@ -15,9 +15,7 @@
  */
 package com.google.gwt.dev.cfg;
 
-import com.google.gwt.core.ext.PropertyOracle;
 import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.typeinfo.TypeOracle;
 
 /**
  * A deferred binding condition to determine whether the type being rebound is
@@ -35,9 +33,8 @@
     return "<when-type-is class='" + exactTypeName + "'/>";
   }
 
-  protected boolean doEval(TreeLogger logger, PropertyOracle propertyOracle,
-      TypeOracle typeOracle, String testType) {
-    return exactTypeName.equals(testType);
+  protected boolean doEval(TreeLogger logger, DeferredBindingQuery query) {
+    return exactTypeName.equals(query.getTestType());
   }
 
   protected String getEvalAfterMessage(String testType, boolean result) {
diff --git a/dev/core/src/com/google/gwt/dev/cfg/DeferredBindingQuery.java b/dev/core/src/com/google/gwt/dev/cfg/DeferredBindingQuery.java
new file mode 100644
index 0000000..503ca94
--- /dev/null
+++ b/dev/core/src/com/google/gwt/dev/cfg/DeferredBindingQuery.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010 Google Inc.
+ * 
+ * Licensed 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 com.google.gwt.dev.cfg;
+
+import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+
+import java.util.Set;
+
+/**
+ * A query into the deferred binding system. A {@link Condition} can be tested
+ * against such a query.
+ */
+public class DeferredBindingQuery {
+  private final Set<String> linkerNames;
+  private final PropertyOracle propertyOracle;
+  private final String testType;
+  private final TypeOracle typeOracle;
+
+  /**
+   * Construct a query for contexts where a type is not available. Such a query
+   * also does not need a type oracle.
+   */
+  public DeferredBindingQuery(PropertyOracle propertyOracle,
+      Set<String> linkerNames) {
+    this(propertyOracle, linkerNames, null, null);
+  }
+
+  /**
+   * Construct a fully general query, including a query type and type oracle.
+   */
+  public DeferredBindingQuery(PropertyOracle propertyOracle,
+      Set<String> linkerNames, TypeOracle typeOracle, String testType) {
+    assert propertyOracle != null;
+    assert linkerNames != null;
+
+    this.propertyOracle = propertyOracle;
+    this.linkerNames = linkerNames;
+    this.typeOracle = typeOracle;
+    this.testType = testType;
+  }
+
+  public Set<String> getLinkerNames() {
+    return linkerNames;
+  }
+
+  public PropertyOracle getPropertyOracle() {
+    return propertyOracle;
+  }
+
+  public String getTestType() {
+    return testType;
+  }
+
+  public TypeOracle getTypeOracle() {
+    return typeOracle;
+  }
+}
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
index 5028e61..5db5c05 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ModuleDef.java
@@ -77,6 +77,8 @@
 
   private String activePrimaryLinker;
 
+  private final DefaultFilters defaultFilters;
+
   private final List<String> entryPointTypeNames = new ArrayList<String>();
 
   private final Set<File> gwtXmlFiles = new HashSet<File>();
@@ -110,9 +112,7 @@
   private final Map<String, String> servletClassNamesByPath = new HashMap<String, String>();
 
   private PathPrefixSet sourcePrefixSet = new PathPrefixSet();
-
   private final Styles styles = new Styles();
-  private final DefaultFilters defaultFilters;
 
   public ModuleDef(String name) {
     this.name = name;
@@ -133,10 +133,13 @@
 
     LinkerOrder order = clazz.getAnnotation(LinkerOrder.class);
     if (order.value() == Order.PRIMARY) {
+      if (activePrimaryLinker != null) {
+        activeLinkers.remove(activePrimaryLinker);
+      }
       activePrimaryLinker = name;
-    } else {
-      activeLinkers.add(name);
     }
+
+    activeLinkers.add(name);
   }
 
   public synchronized void addPublicPackage(String publicPackage,
@@ -249,6 +252,10 @@
     return null;
   }
 
+  public Set<String> getActiveLinkerNames() {
+    return new LinkedHashSet<String>(activeLinkers);
+  }
+
   public Set<Class<? extends Linker>> getActiveLinkers() {
     Set<Class<? extends Linker>> toReturn = new LinkedHashSet<Class<? extends Linker>>();
     for (String linker : activeLinkers) {
@@ -489,5 +496,4 @@
       throw new UnableToCompleteException();
     }
   }
-
 }
diff --git a/dev/core/src/com/google/gwt/dev/cfg/ModuleDefSchema.java b/dev/core/src/com/google/gwt/dev/cfg/ModuleDefSchema.java
index 9ca2cfc..c6ab34f 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/ModuleDefSchema.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/ModuleDefSchema.java
@@ -880,6 +880,8 @@
    * A limited number of conditional predicates based only on properties.
    */
   private class PropertyConditionSchema extends Schema {
+    protected final String __when_linker_added_1_name = null;
+
     protected final String __when_property_is_1_name = null;
 
     protected final String __when_property_is_2_value = null;
@@ -908,6 +910,14 @@
       return subSchema(cond);
     }
 
+    protected Schema __when_linker_added_begin(LinkerName linkerName) {
+      Condition cond = new ConditionWhenLinkerAdded(linkerName.name);
+      parentCondition.getConditions().add(cond);
+
+      // No children allowed.
+      return null;
+    }
+
     /*
      * We intentionally use the BindingProperty type here for tough-love on
      * module writers. It prevents them from trying to create property providers
@@ -1049,8 +1059,8 @@
   }
 
   /**
-   * Returns <code>true</code> if the string equals "true" or "yes" using a
-   * case insensitive comparison.
+   * Returns <code>true</code> if the string equals "true" or "yes" using a case
+   * insensitive comparison.
    */
   private static boolean toPrimitiveBoolean(String s) {
     return "yes".equalsIgnoreCase(s) || "true".equalsIgnoreCase(s);
diff --git a/dev/core/src/com/google/gwt/dev/cfg/Properties.java b/dev/core/src/com/google/gwt/dev/cfg/Properties.java
index be15e15..b3b6d86 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/Properties.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/Properties.java
@@ -74,15 +74,6 @@
     return map.values().iterator();
   }
 
-  /**
-   * Count the total number of permutations that this property set supports.
-   * This method can be expensive because it always recalculates the answer
-   * based on the current set of properties and values.
-   */
-  public int numPermutations() {
-    return new PropertyPermutations(this).size();
-  }
-
   private <T extends Property> T create(String name, boolean flag,
       boolean useFlagArgument, Class<T> clazz) {
     if (clazz == null) {
diff --git a/dev/core/src/com/google/gwt/dev/cfg/PropertyPermutations.java b/dev/core/src/com/google/gwt/dev/cfg/PropertyPermutations.java
index 682b2bf..be1a05a 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/PropertyPermutations.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/PropertyPermutations.java
@@ -40,12 +40,13 @@
    * Returns the list of all permutations. This method must return results in a
    * consistently sorted order over multiple invocations.
    */
-  private static List<String[]> allPermutationsOf(Properties properties) {
+  private static List<String[]> allPermutationsOf(Properties properties,
+      Set<String> activeLinkerNames) {
     BindingProperty[] bindingProperties = getOrderedPropertiesOf(properties);
 
     List<String[]> permutations = new ArrayList<String[]>();
     if (bindingProperties.length > 0) {
-      permute(bindingProperties, null, 0, permutations);
+      permute(bindingProperties, activeLinkerNames, null, 0, permutations);
     } else {
       permutations.add(new String[0]);
     }
@@ -93,8 +94,9 @@
         new BindingProperty[evaluationOrder.size()]);
   }
 
-  private static void permute(BindingProperty[] properties, String[] soFar,
-      int whichProp, List<String[]> permutations) {
+  private static void permute(BindingProperty[] properties,
+      Set<String> activeLinkerNames, String[] soFar, int whichProp,
+      List<String[]> permutations) {
     int lastProp = properties.length - 1;
 
     BindingProperty prop = properties[whichProp];
@@ -111,7 +113,8 @@
 
       for (Condition cond : prop.getConditionalValues().keySet()) {
         try {
-          if (cond.isTrue(TreeLogger.NULL, propertyOracle, null, null)) {
+          if (cond.isTrue(TreeLogger.NULL, new DeferredBindingQuery(
+              propertyOracle, activeLinkerNames))) {
             winner = cond;
           }
         } catch (UnableToCompleteException e) {
@@ -134,7 +137,8 @@
       nextStep[whichProp] = knownValue;
 
       if (whichProp < lastProp) {
-        permute(properties, nextStep, whichProp + 1, permutations);
+        permute(properties, activeLinkerNames, nextStep, whichProp + 1,
+            permutations);
       } else {
         // Finished this permutation.
         permutations.add(nextStep);
@@ -145,15 +149,10 @@
   private final Properties properties;
   private final List<String[]> values;
 
-  public PropertyPermutations(Properties properties) {
+  public PropertyPermutations(Properties properties,
+      Set<String> activeLinkerNames) {
     this.properties = properties;
-    this.values = allPermutationsOf(properties);
-  }
-
-  public PropertyPermutations(Properties properties, int firstPerm, int numPerms) {
-    this.properties = properties;
-    values = allPermutationsOf(properties).subList(firstPerm,
-        firstPerm + numPerms);
+    this.values = allPermutationsOf(properties, activeLinkerNames);
   }
 
   public PropertyPermutations(PropertyPermutations allPermutations,
diff --git a/dev/core/src/com/google/gwt/dev/cfg/Rule.java b/dev/core/src/com/google/gwt/dev/cfg/Rule.java
index 424a594..65d66b0 100644
--- a/dev/core/src/com/google/gwt/dev/cfg/Rule.java
+++ b/dev/core/src/com/google/gwt/dev/cfg/Rule.java
@@ -33,8 +33,9 @@
   public boolean isApplicable(TreeLogger logger,
       StandardGeneratorContext context, String typeName)
       throws UnableToCompleteException {
-    return rootCondition.isTrue(logger, context.getPropertyOracle(),
-        context.getTypeOracle(), typeName);
+    return rootCondition.isTrue(logger, new DeferredBindingQuery(
+        context.getPropertyOracle(), context.getActiveLinkerNames(),
+        context.getTypeOracle(), typeName));
   }
 
   public abstract String realize(TreeLogger logger,
diff --git a/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java b/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java
index 7c9ef59..0b2aff8 100644
--- a/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java
+++ b/dev/core/src/com/google/gwt/dev/javac/StandardGeneratorContext.java
@@ -378,6 +378,10 @@
     }
   }
 
+  public Set<String> getActiveLinkerNames() {
+    return module.getActiveLinkerNames();
+  }
+
   public final PropertyOracle getPropertyOracle() {
     return propOracle;
   }
diff --git a/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java b/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java
index 4b0d6b9..a27a624 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java
@@ -25,6 +25,7 @@
 import com.google.gwt.dev.cfg.BindingProperty;
 import com.google.gwt.dev.cfg.Condition;
 import com.google.gwt.dev.cfg.ConfigurationProperty;
+import com.google.gwt.dev.cfg.DeferredBindingQuery;
 import com.google.gwt.dev.cfg.Properties;
 import com.google.gwt.dev.cfg.Property;
 
@@ -32,6 +33,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.SortedSet;
 import java.util.TreeSet;
 
@@ -41,6 +43,8 @@
  */
 public class ModuleSpacePropertyOracle implements PropertyOracle {
 
+  private final Set<String> activeLinkerNames;
+
   private final Map<String, String> prevAnswers = new HashMap<String, String>();
 
   private final Properties props;
@@ -49,12 +53,11 @@
 
   /**
    * Create a property oracle that computes its properties from a module.
-   * 
-   * @param props
-   * @param space
    */
-  public ModuleSpacePropertyOracle(Properties props, ModuleSpace space) {
+  public ModuleSpacePropertyOracle(Properties props,
+      Set<String> activeLinkerNames, ModuleSpace space) {
     this.space = space;
+    this.activeLinkerNames = activeLinkerNames;
     this.props = props;
   }
 
@@ -132,8 +135,7 @@
       for (String v : cprop.getDefinedValues()) {
         possibleValues.add(v);
       }
-      return new DefaultSelectionProperty(value, fallback, name,
-          possibleValues);
+      return new DefaultSelectionProperty(value, fallback, name, possibleValues);
     } else {
       throw new BadPropertyValueException(propertyName);
     }
@@ -145,7 +147,8 @@
     Condition winner = null;
     for (Condition cond : prop.getConditionalValues().keySet()) {
       try {
-        if (cond.isTrue(logger, this, null, null)) {
+        if (cond.isTrue(logger, new DeferredBindingQuery(this,
+            activeLinkerNames))) {
           winner = cond;
         }
       } catch (UnableToCompleteException e) {
diff --git a/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java b/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java
index b119bdd..f69db8f 100644
--- a/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java
+++ b/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java
@@ -88,7 +88,7 @@
     // Establish an environment for JavaScript property providers to run.
     //
     ModuleSpacePropertyOracle propOracle = new ModuleSpacePropertyOracle(
-        module.getProperties(), readySpace);
+        module.getProperties(), module.getActiveLinkerNames(), readySpace);
 
     // Set up the rebind oracle for the module.
     // It has to wait until now because we need to inject javascript.
diff --git a/dev/core/test/com/google/gwt/dev/cfg/ConditionTest.java b/dev/core/test/com/google/gwt/dev/cfg/ConditionTest.java
new file mode 100644
index 0000000..8c438ec
--- /dev/null
+++ b/dev/core/test/com/google/gwt/dev/cfg/ConditionTest.java
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2009 Google Inc.
+ * 
+ * Licensed 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 com.google.gwt.dev.cfg;
+
+import com.google.gwt.core.ext.PropertyOracle;
+import com.google.gwt.core.ext.TreeLogger;
+import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.typeinfo.TypeOracle;
+import com.google.gwt.dev.javac.TypeOracleTestingUtils;
+
+import junit.framework.TestCase;
+
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * Test the {@link Condition} class.
+ */
+public class ConditionTest extends TestCase {
+  private PropertyOracle propertyOracle;
+  private TypeOracle typeOracle;
+  private static Set<String> activeLinkerNames = new LinkedHashSet<String>(
+      Arrays.asList("linker1", "linker2", "xs"));
+
+  @Override
+  public void setUp() {
+    ModuleDef module = new ModuleDef("fake");
+
+    ConfigurationProperty conf1 = module.getProperties().createConfiguration(
+        "conf1", false);
+    conf1.setValue("value1");
+
+    BindingProperty binding1 = module.getProperties().createBinding("binding1");
+    binding1.addDefinedValue(new ConditionAll(), "true");
+    binding1.addDefinedValue(new ConditionAll(), "false");
+
+    propertyOracle = new StaticPropertyOracle(new BindingProperty[] {binding1},
+        new String[] {"true"}, new ConfigurationProperty[] {conf1});
+
+    typeOracle = TypeOracleTestingUtils.buildStandardTypeOracleWith(TreeLogger.NULL);
+  }
+
+  public void testBasics() throws UnableToCompleteException {
+    assertTrue(isTrue(new ConditionAll(), null));
+    assertFalse(isTrue(new ConditionAny(), null));
+    assertTrue(isTrue(new ConditionNone(), null));
+
+    assertTrue(isTrue(new ConditionWhenPropertyIs("conf1", "value1"), null));
+    assertFalse(isTrue(new ConditionWhenPropertyIs("conf1", "value2"), null));
+    assertTrue(isTrue(new ConditionWhenPropertyIs("binding1", "true"), null));
+    assertFalse(isTrue(new ConditionWhenPropertyIs("binding1", "false"), null));
+
+    assertTrue(isTrue(new ConditionWhenLinkerAdded("linker1"), null));
+    assertFalse(isTrue(new ConditionWhenLinkerAdded("bogoLinker"), null));
+
+    ConditionWhenTypeAssignableTo assignableToObject = new ConditionWhenTypeAssignableTo(
+        "java.lang.Object");
+    assertTrue(isTrue(assignableToObject, "java.lang.String"));
+    assertFalse(isTrue(new ConditionWhenTypeAssignableTo("java.lang.String"),
+        "java.lang.Object"));
+    ConditionWhenTypeIs isObject = new ConditionWhenTypeIs("java.lang.Object");
+    assertTrue(isTrue(isObject, "java.lang.Object"));
+    assertFalse(isTrue(isObject, "java.lang.String"));
+
+    {
+      ConditionAll all = new ConditionAll();
+      all.getConditions().add(assignableToObject);
+      all.getConditions().add(isObject);
+
+      assertTrue(isTrue(all, "java.lang.Object"));
+      assertFalse(isTrue(all, "java.lang.String"));
+    }
+
+    {
+      ConditionAny any = new ConditionAny();
+      any.getConditions().add(assignableToObject);
+      any.getConditions().add(isObject);
+
+      assertTrue(isTrue(any, "java.lang.Object"));
+      assertTrue(isTrue(any, "java.lang.String"));
+    }
+
+    {
+      ConditionNone none = new ConditionNone();
+      none.getConditions().add(assignableToObject);
+      none.getConditions().add(isObject);
+
+      assertFalse(isTrue(none, "java.lang.Object"));
+      assertFalse(isTrue(none, "java.lang.String"));
+    }
+  }
+
+  private boolean isTrue(Condition cond, String testType)
+      throws UnableToCompleteException {
+    return cond.isTrue(TreeLogger.NULL, new DeferredBindingQuery(
+        propertyOracle, activeLinkerNames, typeOracle, testType));
+  }
+}
\ No newline at end of file
diff --git a/dev/core/test/com/google/gwt/dev/cfg/ModuleDefTest.java b/dev/core/test/com/google/gwt/dev/cfg/ModuleDefTest.java
index 157703c..cd3baab 100644
--- a/dev/core/test/com/google/gwt/dev/cfg/ModuleDefTest.java
+++ b/dev/core/test/com/google/gwt/dev/cfg/ModuleDefTest.java
@@ -42,8 +42,14 @@
     }
 
     @Override
+    public ArtifactSet link(TreeLogger logger, LinkerContext context,
+        ArtifactSet artifacts, boolean onePermutation) {
+      return null;
+    }
+
+    @Override
     public ArtifactSet relink(TreeLogger logger, LinkerContext context,
-        ArtifactSet newArtifacts) throws UnableToCompleteException {
+        ArtifactSet newArtifacts) {
       return null;
     }
   }
@@ -95,7 +101,7 @@
 
     Class<?>[] expectedClasses = {
         FakeLinkerPre2.class, FakeLinkerPre.class, FakeLinkerPost.class,
-        FakeLinkerPost2.class};
+        FakeLinkerPost2.class, FakeLinkerPrimary.class};
     assertEquals(FakeLinkerPrimary.class, def.getActivePrimaryLinker());
     // Test iteration order
     assertEquals(Arrays.asList(expectedClasses),
@@ -118,7 +124,8 @@
     // Intentional duplication
     def.addLinker("post");
 
-    Class<?>[] expectedClasses = {FakeLinkerPre2.class, FakeLinkerPost2.class};
+    Class<?>[] expectedClasses = {
+        FakeLinkerPre2.class, FakeLinkerPost2.class, FakeLinkerPrimary2.class};
     assertEquals(FakeLinkerPrimary2.class, def.getActivePrimaryLinker());
     // Test iteration order
     assertEquals(Arrays.asList(expectedClasses),
@@ -154,4 +161,25 @@
       // OK
     }
   }
+
+  public void testTwoPrimaries() throws UnableToCompleteException {
+    ModuleDef def = new ModuleDef("fake");
+
+    def.defineLinker(TreeLogger.NULL, "pre", FakeLinkerPre.class);
+    def.defineLinker(TreeLogger.NULL, "post", FakeLinkerPost.class);
+    def.defineLinker(TreeLogger.NULL, "primary", FakeLinkerPrimary.class);
+    def.defineLinker(TreeLogger.NULL, "primary2", FakeLinkerPrimary2.class);
+
+    def.addLinker("pre");
+    def.addLinker("post");
+    def.addLinker("primary");
+    def.addLinker("primary2");
+
+    Class<?>[] expectedClasses = {
+        FakeLinkerPre.class, FakeLinkerPost.class, FakeLinkerPrimary2.class};
+    assertEquals(FakeLinkerPrimary2.class, def.getActivePrimaryLinker());
+    // Test iteration order
+    assertEquals(Arrays.asList(expectedClasses),
+        new ArrayList<Class<? extends Linker>>(def.getActiveLinkers()));
+  }
 }
diff --git a/dev/core/test/com/google/gwt/dev/util/test/PropertyPermutationsTest.java b/dev/core/test/com/google/gwt/dev/util/test/PropertyPermutationsTest.java
index 97aa1c6..de54d84 100644
--- a/dev/core/test/com/google/gwt/dev/util/test/PropertyPermutationsTest.java
+++ b/dev/core/test/com/google/gwt/dev/util/test/PropertyPermutationsTest.java
@@ -25,6 +25,7 @@
 import junit.framework.TestCase;
 
 import java.util.Iterator;
+import java.util.Set;
 
 /**
  * Tests the PropertyPermutations code.
@@ -56,7 +57,7 @@
     }
 
     try {
-      new PropertyPermutations(props);
+      new PropertyPermutations(props, md.getActiveLinkerNames());
       fail();
     } catch (IllegalStateException e) {
       // OK
@@ -75,7 +76,8 @@
 
     // Permutations and their values are in stable alphabetical order.
     //
-    PropertyPermutations perms = new PropertyPermutations(md.getProperties());
+    PropertyPermutations perms = new PropertyPermutations(md.getProperties(),
+        md.getActiveLinkerNames());
     String[] perm;
     Iterator<String[]> iter = perms.iterator();
 
@@ -107,7 +109,8 @@
 
     // String[]s and their values are in stable alphabetical order.
     //
-    PropertyPermutations perms = new PropertyPermutations(md.getProperties());
+    PropertyPermutations perms = new PropertyPermutations(md.getProperties(),
+        md.getActiveLinkerNames());
     String[] perm;
     Iterator<String[]> iter = perms.iterator();
 
@@ -171,7 +174,7 @@
       prop.setAllowedValues(cond, "true", "false");
     }
 
-    validateTwoDimensionPerm(props);
+    validateTwoDimensionPerm(props, md.getActiveLinkerNames());
   }
 
   public void testTwoDimensionPermWithExtension() {
@@ -198,7 +201,7 @@
       prop.addDefinedValue(cond, "true");
     }
 
-    validateTwoDimensionPerm(props);
+    validateTwoDimensionPerm(props, md.getActiveLinkerNames());
   }
 
   public void testTwoDimensionPermWithRestriction() {
@@ -227,11 +230,13 @@
       prop.setAllowedValues(cond, "false");
     }
 
-    validateTwoDimensionPerm(props);
+    validateTwoDimensionPerm(props, md.getActiveLinkerNames());
   }
 
-  private void validateTwoDimensionPerm(Properties props) {
-    PropertyPermutations perms = new PropertyPermutations(props);
+  private void validateTwoDimensionPerm(Properties props,
+      Set<String> activeLinkerNames) {
+    PropertyPermutations perms = new PropertyPermutations(props,
+        activeLinkerNames);
 
     assertEquals(6, perms.size());
 
