diff --git a/src/com/google/inject/Binding.java b/src/com/google/inject/Binding.java
index 0326c92..4836b6b 100644
--- a/src/com/google/inject/Binding.java
+++ b/src/com/google/inject/Binding.java
@@ -19,7 +19,7 @@
 import com.google.inject.util.ToStringBuilder;
 
 /**
- * A binding from a {@link Key} (type and name) to an implementation.
+ * A binding from a {@link Key} (type and name) to an instance locator.
  *
  * @author crazybob@google.com (Bob Lee)
  */
@@ -53,16 +53,16 @@
     return source;
   }
 
-  volatile Factory<T> factory;
+  volatile Locator<T> locator;
 
   /**
-   * Gets the factory which returns instances of {@code T}.
+   * Gets the locator which returns instances of {@code T}.
    */
-  public Factory<T> getFactory() {
-    if (factory == null) {
-      factory = container.getFactory(key);
+  public Locator<T> getLocator() {
+    if (locator == null) {
+      locator = container.getLocator(key);
     }
-    return factory;
+    return locator;
   }
 
   InternalFactory<? extends T> getInternalFactory() {
@@ -85,7 +85,7 @@
     return new ToStringBuilder(Binding.class)
         .add("key", key)
         .add("source", source)
-        .add("factory", internalFactory)
+        .add("locator", internalFactory)
         .toString();
   }
 }
\ No newline at end of file
diff --git a/src/com/google/inject/Container.java b/src/com/google/inject/Container.java
index e0de052..87c2d85 100644
--- a/src/com/google/inject/Container.java
+++ b/src/com/google/inject/Container.java
@@ -40,9 +40,9 @@
   void injectMembers(Object o);
 
   /**
-   * Gets the factory bound to the given key.
+   * Gets the locator bound to the given key.
    */
-  <T> Factory<T> getFactory(Key<T> key);
+  <T> Locator<T> getLocator(Key<T> key);
 
   /**
    * Gets all bindings.
@@ -60,75 +60,71 @@
   <T> List<Binding<T>> findBindingsByType(TypeLiteral<T> type);
 
   /**
-   * Gets the factory bound to the given type.
+   * Gets the locator bound to the given type.
    */
-  <T> Factory<T> getFactory(Class<T> type);
+  <T> Locator<T> getLocator(Class<T> type);
 
   /**
-   * Gets the factory bound to the given type.
+   * Gets the locator bound to the given type.
    */
-  <T> Factory<T> getFactory(TypeLiteral<T> type);
+  <T> Locator<T> getLocator(TypeLiteral<T> type);
 
   /**
-   * Gets an instance from the factory bound to the given type.
+   * Gets an instance from the locator bound to the given type.
    */
   <T> T getInstance(TypeLiteral<T> type);
 
   /**
-   * Gets an instance from the factory bound to the given type.
+   * Gets an instance from the locator bound to the given type.
    */
   <T> T getInstance(Class<T> type);
 
   /**
-   * Gets an instance from the factory bound to the given key.
+   * Gets an instance from the locator bound to the given key.
    */
   <T> T getInstance(Key<T> key);
 
   /**
-   * Gets an instance from the factory bound to the given type and annotation.
+   * Gets an instance from the locator bound to the given type and annotation.
    */
-  <T> T getInstance(TypeLiteral<T> type,
-      Annotation annotation);
+  <T> T getInstance(TypeLiteral<T> type, Annotation annotation);
 
   /**
-   * Gets an instance from the factory bound to the given type and annotation.
+   * Gets an instance from the locator bound to the given type and annotation.
    */
-  <T> T getInstance(Class<T> type,
-      Annotation annotation);
+  <T> T getInstance(Class<T> type, Annotation annotation);
 
   /**
-   * Gets the factory bound to the given type and annotation.
+   * Gets the locator bound to the given type and annotation.
    */
-  <T> Factory<T> getFactory(Class<T> type,
-      Annotation annotation);
+  <T> Locator<T> getLocator(Class<T> type, Annotation annotation);
 
   /**
-   * Gets the factory bound to the given type and annotation.
+   * Gets the locator bound to the given type and annotation.
    */
-  <T> Factory<T> getFactory(TypeLiteral<T> type,
-      Annotation annotation);
+  <T> Locator<T> getLocator(TypeLiteral<T> type, Annotation annotation);
 
   /**
-   * Gets an instance from the factory bound to the given type and annotation.
+   * Gets an instance from the locator bound to the given type and annotation.
    */
   <T> T getInstance(TypeLiteral<T> type,
       Class<? extends Annotation> annotationType);
 
   /**
-   * Gets an instance from the factory bound to the given type and annotation.
+   * Gets an instance from the locator bound to the given type and annotation.
    */
   <T> T getInstance(Class<T> type,
       Class<? extends Annotation> annotationType);
 
   /**
-   * Gets the factory bound to the given type and annotation.
+   * Gets the locator bound to the given type and annotation.
    */
-  <T> Factory<T> getFactory(Class<T> type,
+  <T> Locator<T> getLocator(Class<T> type,
       Class<? extends Annotation> annotationType);
 
   /**
-   * Gets the factory bound to the given type and annotation.
+   * Gets the locator bound to the given type and annotation.
    */
-  <T> Factory<T> getFactory(TypeLiteral<T> type,
+  <T> Locator<T> getLocator(TypeLiteral<T> type,
       Class<? extends Annotation> annotationType);
 }
diff --git a/src/com/google/inject/ContainerBuilder.java b/src/com/google/inject/ContainerBuilder.java
index dd37ae3..21a59b1 100644
--- a/src/com/google/inject/ContainerBuilder.java
+++ b/src/com/google/inject/ContainerBuilder.java
@@ -43,7 +43,7 @@
  * <p>Creates several bindings by default:
  *
  * <ul>
- * <li>A {@code Factory<T>} for each binding of type {@code T}
+ * <li>A {@code Locator<T>} for each binding of type {@code T}
  * <li>The {@link Container} iself
  * <li>The {@link Logger} for the class being injected
  * <li>The {@link Stage} passed to the builder's constructor
@@ -84,7 +84,7 @@
     }
 
     public String toString() {
-      return "ContainerFactory";
+      return "Locator<Container>";
     }
   };
 
@@ -98,7 +98,7 @@
     }
 
     public String toString() {
-      return "LoggerFactory";
+      return "Locator<Logger>";
     }
   };
 
@@ -288,12 +288,12 @@
    * Creates a {@link Container} instance. Injects static members for classes
    * which were registered using {@link #requestStaticInjection(Class...)}.
    *
-   * @throws ContainerCreationException if configuration errors are found. The
+   * @throws CreationException if configuration errors are found. The
    *     expectation is that the application will log this exception and exit.
    * @throws IllegalStateException if called more than once
    */
   public synchronized Container create()
-      throws ContainerCreationException {
+      throws CreationException {
     stopwatch.resetAndLog(logger, "Configuration");
 
     // Create the container.
@@ -331,7 +331,7 @@
 
     // Blow up if we encountered errors.
     if (!errorMessages.isEmpty()) {
-      throw new ContainerCreationException(errorMessages);
+      throw new CreationException(errorMessages);
     }
 
     // Switch to runtime error handling.
@@ -451,9 +451,9 @@
     Map<Key<?>, Binding<?>> bindings = container.internalBindings();
     Binding<?> original = bindings.get(key);
 
-    // Binding to Factory<?> is not allowed.
-    if (key.getRawType().equals(Factory.class)) {
-      addError(binding.getSource(), ErrorMessages.CANNOT_BIND_TO_FACTORY);
+    // Binding to Locator<?> is not allowed.
+    if (key.getRawType().equals(Locator.class)) {
+      addError(binding.getSource(), ErrorMessages.CANNOT_BIND_TO_LOCATOR);
       return;
     }
 
@@ -555,18 +555,9 @@
       ensureImplementationIsNotSet();
       this.implementation = implementation;
       final DefaultFactory<I> defaultFactory
-          = new DefaultFactory<I>(key, implementation);
+          = new DefaultFactory<I>(key, implementation, errorHandler);
       this.factory = defaultFactory;
-      creationListeners.add(new CreationListener() {
-        public void notify(final ContainerImpl container) {
-          container.withErrorHandler(errorHandler, new Runnable() {
-            public void run() {
-              defaultFactory.setConstructor(
-                  container.getConstructor(implementation));
-            }
-          });
-        }
-      });
+      creationListeners.add(defaultFactory);
       return this;
     }
 
@@ -625,10 +616,10 @@
         final Key<? extends Generator<T>> generatorKey) {
       ensureImplementationIsNotSet();
 
-      final BoundGenerator<T> delegatingFactory =
+      final BoundGenerator<T> boundGenerator =
           new BoundGenerator<T>(generatorKey, errorHandler);
-      creationListeners.add(delegatingFactory);
-      this.factory = delegatingFactory;
+      creationListeners.add(boundGenerator);
+      this.factory = boundGenerator;
 
       return this;
     }
@@ -763,20 +754,28 @@
   /**
    * Injects new instances of the specified implementation class.
    */
-  private static class DefaultFactory<T> implements InternalFactory<T> {
+  private static class DefaultFactory<T> implements InternalFactory<T>,
+      CreationListener {
 
     private final TypeLiteral<T> implementation;
     private final Key<? super T> key;
+    private final ErrorHandler errorHandler;
 
     ConstructorInjector<T> constructor;
 
-    DefaultFactory(Key<? super T> key, TypeLiteral<T> implementation) {
+    DefaultFactory(Key<? super T> key, TypeLiteral<T> implementation,
+        ErrorHandler errorHandler) {
       this.key = key;
       this.implementation = implementation;
+      this.errorHandler = errorHandler;
     }
 
-    void setConstructor(ConstructorInjector<T> constructor) {
-      this.constructor = constructor;
+    public void notify(final ContainerImpl container) {
+      container.withErrorHandler(errorHandler, new Runnable() {
+        public void run() {
+          constructor = container.getConstructor(implementation);
+        }
+      });
     }
 
     public T get(InternalContext context) {
@@ -785,7 +784,7 @@
     }
 
     public String toString() {
-      return new ToStringBuilder(Factory.class)
+      return new ToStringBuilder(Locator.class)
           .add("implementation", implementation)
           .toString();
     }
diff --git a/src/com/google/inject/ContainerImpl.java b/src/com/google/inject/ContainerImpl.java
index 477beb3..3fffc3e 100644
--- a/src/com/google/inject/ContainerImpl.java
+++ b/src/com/google/inject/ContainerImpl.java
@@ -158,20 +158,20 @@
     Class<? super T> rawType = key.getType().getRawType();
 
     // Handle cases where T is a Factory<?>.
-    if (rawType.equals(Factory.class)) {
-      Type factoryType = key.getType().getType();
-      if (!(factoryType instanceof ParameterizedType)) {
+    if (rawType.equals(Locator.class)) {
+      Type locatorType = key.getType().getType();
+      if (!(locatorType instanceof ParameterizedType)) {
         return null;
       }
       Type entryType
-          = ((ParameterizedType) factoryType).getActualTypeArguments()[0];
+          = ((ParameterizedType) locatorType).getActualTypeArguments()[0];
 
       try {
-        final Factory<?> factory = getFactory(key.ofType(entryType));
+        final Locator<?> locator = getLocator(key.ofType(entryType));
         return new InternalFactory<T>() {
           @SuppressWarnings("unchecked")
           public T get(InternalContext context) {
-            return (T) factory;
+            return (T) locator;
           }
         };
       }
@@ -612,65 +612,65 @@
 
   public <T> T getInstance(TypeLiteral<T> type,
       Annotation annotation) {
-    return getFactory(Key.get(type, annotation)).get();
+    return getLocator(Key.get(type, annotation)).get();
   }
 
   public <T> T getInstance(Class<T> type,
       Annotation annotation) {
-    return getFactory(Key.get(type, annotation)).get();
+    return getLocator(Key.get(type, annotation)).get();
   }
 
-  public <T> Factory<T> getFactory(Class<T> type,
+  public <T> Locator<T> getLocator(Class<T> type,
       Annotation annotation) {
-    return getFactory(Key.get(type, annotation));
+    return getLocator(Key.get(type, annotation));
   }
 
-  public <T> Factory<T> getFactory(TypeLiteral<T> type,
+  public <T> Locator<T> getLocator(TypeLiteral<T> type,
       Annotation annotation) {
-    return getFactory(Key.get(type, annotation));
+    return getLocator(Key.get(type, annotation));
   }
 
   public <T> T getInstance(TypeLiteral<T> type,
       Class<? extends Annotation> annotationType) {
-    return getFactory(Key.get(type, annotationType)).get();
+    return getLocator(Key.get(type, annotationType)).get();
   }
 
   public <T> T getInstance(Class<T> type,
       Class<? extends Annotation> annotationType) {
-    return getFactory(Key.get(type, annotationType)).get();
+    return getLocator(Key.get(type, annotationType)).get();
   }
 
-  public <T> Factory<T> getFactory(Class<T> type,
+  public <T> Locator<T> getLocator(Class<T> type,
       Class<? extends Annotation> annotationType) {
-    return getFactory(Key.get(type, annotationType));
+    return getLocator(Key.get(type, annotationType));
   }
 
-  public <T> Factory<T> getFactory(TypeLiteral<T> type,
+  public <T> Locator<T> getLocator(TypeLiteral<T> type,
       Class<? extends Annotation> annotationType) {
-    return getFactory(Key.get(type, annotationType));
+    return getLocator(Key.get(type, annotationType));
   }
 
   public <T> T getInstance(TypeLiteral<T> type) {
-    return getFactory(Key.get(type)).get();
+    return getLocator(Key.get(type)).get();
   }
 
   public <T> T getInstance(Class<T> type) {
-    return getFactory(Key.get(type)).get();
+    return getLocator(Key.get(type)).get();
   }
 
   public <T> T getInstance(Key<T> key) {
-    return getFactory(key).get();
+    return getLocator(key).get();
   }
 
-  public <T> Factory<T> getFactory(Class<T> type) {
-    return getFactory(Key.get(type));
+  public <T> Locator<T> getLocator(Class<T> type) {
+    return getLocator(Key.get(type));
   }
 
-  public <T> Factory<T> getFactory(TypeLiteral<T> type) {
-    return getFactory(Key.get(type));
+  public <T> Locator<T> getLocator(TypeLiteral<T> type) {
+    return getLocator(Key.get(type));
   }
 
-  public <T> Factory<T> getFactory(final Key<T> key) {
+  public <T> Locator<T> getLocator(final Key<T> key) {
     final InternalFactory<? extends T> factory = getInternalFactory(null, key);
 
     if (factory == null) {
@@ -678,7 +678,7 @@
           "Missing binding to " + ErrorMessages.convert(key) + ".");
     }
 
-    return new Factory<T>() {
+    return new Locator<T>() {
       public T get() {
         return callInContext(new ContextualCallable<T>() {
           public T call(InternalContext context) {
diff --git a/src/com/google/inject/Context.java b/src/com/google/inject/Context.java
index 52265cf..c4a83e2 100644
--- a/src/com/google/inject/Context.java
+++ b/src/com/google/inject/Context.java
@@ -33,7 +33,7 @@
   /**
    * Gets the field, method or constructor which is being injected. Returns
    * {@code null} if the object isn't being injected into anywhere (i.e. it's
-   * preloaded, returned from {@link Factory#get()}, etc.).
+   * preloaded, returned from {@link Locator#get()}, etc.).
    */
   Member getMember();
 
diff --git a/src/com/google/inject/ContainerCreationException.java b/src/com/google/inject/CreationException.java
similarity index 94%
rename from src/com/google/inject/ContainerCreationException.java
rename to src/com/google/inject/CreationException.java
index fd9c42b..c7a443b 100644
--- a/src/com/google/inject/ContainerCreationException.java
+++ b/src/com/google/inject/CreationException.java
@@ -31,14 +31,14 @@
  *
  * @author crazybob@google.com (Bob Lee)
  */
-public class ContainerCreationException extends Exception {
+public class CreationException extends Exception {
 
   final List<Message> errorMessages;
 
   /**
    * Constructs a new exception for the given errors.
    */
-  public ContainerCreationException(Collection<Message> errorMessages) {
+  public CreationException(Collection<Message> errorMessages) {
     super();
 
     // Sort the messages by source. 
diff --git a/src/com/google/inject/ErrorMessages.java b/src/com/google/inject/ErrorMessages.java
index 5905112..7f536f9 100644
--- a/src/com/google/inject/ErrorMessages.java
+++ b/src/com/google/inject/ErrorMessages.java
@@ -50,7 +50,7 @@
     }
   }
 
-  static final String CANNOT_BIND_TO_FACTORY = "Binding to Factory<?> is not"
+  static final String CANNOT_BIND_TO_LOCATOR = "Binding to Locator<?> is not"
       + " allowed.";
 
   static final String SCOPE_NOT_FOUND = "No scope is bound to %s.";
diff --git a/src/com/google/inject/InternalFactoryToFactoryAdapter.java b/src/com/google/inject/InternalFactoryToLocatorAdapter.java
similarity index 74%
rename from src/com/google/inject/InternalFactoryToFactoryAdapter.java
rename to src/com/google/inject/InternalFactoryToLocatorAdapter.java
index 9abae5f..a4707d6 100644
--- a/src/com/google/inject/InternalFactoryToFactoryAdapter.java
+++ b/src/com/google/inject/InternalFactoryToLocatorAdapter.java
@@ -19,19 +19,19 @@
 /**
  * @author crazybob@google.com (Bob Lee)
 */
-class InternalFactoryToFactoryAdapter<T> implements InternalFactory<T> {
+class InternalFactoryToLocatorAdapter<T> implements InternalFactory<T> {
 
-  private final Factory<? extends T> factory;
+  private final Locator<? extends T> locator;
 
-  public InternalFactoryToFactoryAdapter(Factory<? extends T> factory) {
-    this.factory = factory;
+  public InternalFactoryToLocatorAdapter(Locator<? extends T> locator) {
+    this.locator = locator;
   }
   
   public T get(InternalContext context) {
-    return factory.get();
+    return locator.get();
   }
 
   public String toString() {
-    return factory.toString();
+    return locator.toString();
   }
 }
diff --git a/src/com/google/inject/Factory.java b/src/com/google/inject/Locator.java
similarity index 86%
rename from src/com/google/inject/Factory.java
rename to src/com/google/inject/Locator.java
index 23666d2..2db9605 100644
--- a/src/com/google/inject/Factory.java
+++ b/src/com/google/inject/Locator.java
@@ -17,14 +17,14 @@
 package com.google.inject;
 
 /**
- * Gets instances of {@code T}.
+ * Locates bound instances of {@code T}.
  *
  * @author crazybob@google.com (Bob Lee)
  */
-public interface Factory<T> {
+public interface Locator<T> {
 
   /**
-   * Gets an instance of {@code T}.
+   * Locates an instance of {@code T}.
    */
   T get();
 }
diff --git a/src/com/google/inject/FactoryToInternalFactoryAdapter.java b/src/com/google/inject/LocatorToInternalFactoryAdapter.java
similarity index 90%
rename from src/com/google/inject/FactoryToInternalFactoryAdapter.java
rename to src/com/google/inject/LocatorToInternalFactoryAdapter.java
index 6f4149c..2eb5078 100644
--- a/src/com/google/inject/FactoryToInternalFactoryAdapter.java
+++ b/src/com/google/inject/LocatorToInternalFactoryAdapter.java
@@ -19,13 +19,13 @@
 /**
  * @author crazybob@google.com (Bob Lee)
  */
-class FactoryToInternalFactoryAdapter<T> implements Factory<T> {
+class LocatorToInternalFactoryAdapter<T> implements Locator<T> {
 
   private final ContainerImpl container;
 
   private final InternalFactory<? extends T> internalFactory;
 
-  public FactoryToInternalFactoryAdapter(ContainerImpl container,
+  public LocatorToInternalFactoryAdapter(ContainerImpl container,
       InternalFactory<? extends T> internalFactory) {
     this.container = container;
     this.internalFactory = internalFactory;
diff --git a/src/com/google/inject/ProxyFactory.java b/src/com/google/inject/ProxyFactory.java
index 7dfea56..7fdb060 100644
--- a/src/com/google/inject/ProxyFactory.java
+++ b/src/com/google/inject/ProxyFactory.java
@@ -62,10 +62,10 @@
    * exceptions in {@link RuntimeException} including
    * {@link InvocationTargetException}.
    */
-  public <T> Factory<T> getFactory(Class<T> type) throws NoSuchMethodException {
+  public <T> Locator<T> getFactory(Class<T> type) throws NoSuchMethodException {
     final ConstructionProxy<T> constructionProxy
         = createConstructionProxy(type.getDeclaredConstructor());
-    return new Factory<T>() {
+    return new Locator<T>() {
       public T get() {
         try {
           return constructionProxy.newInstance();
diff --git a/src/com/google/inject/Scope.java b/src/com/google/inject/Scope.java
index 2dece30..37a7130 100644
--- a/src/com/google/inject/Scope.java
+++ b/src/com/google/inject/Scope.java
@@ -17,11 +17,11 @@
 package com.google.inject;
 
 /**
- * A scope which bound objects can reside in.
+ * A scope which bound objects can reside in. Scopes a given {@link Locator}.
  *
  * <p>Scope implementations should override {@code toString()} in the returned
- * factory and include the creator's {@code toString()} output. Doing so aids
- * debugging. They should also override their own {@code toString()}
+ * locator and include the unscoped locator's {@code toString()} output. Doing
+ * so aids debugging. They should also override their own {@code toString()}
  * method.
  *
  * @author crazybob@google.com (Bob Lee)
@@ -29,14 +29,16 @@
 public interface Scope {
 
   /**
-   * Scopes a factory. The returned factory returns objects from this scope. If
-   * an object does not exist in this scope, the factory can use the given
-   * creator to create one.
+   * Scopes a locator. The returned locator returns objects from this scope. If
+   * an object does not exist in this scope, the locator can use the given
+   * unscoped locator to retrieve one.
    *
    * @param key binding key
-   * @param creator creates new instances as needed
-   * @return a new factory which only delegates to the given factory when an
-   *     instance of the requested object doesn't already exist in the scope
+   * @param unscoped locates an instance when one doesn't already exist in this
+   *  scope.
+   * @return a new locator which only delegates to the given unscoped locator
+   *  when an instance of the requested object doesn't already exist in this
+   *  scope
    */
-  public <T> Factory<T> scope(Key<T> key, Factory<T> creator);
+  public <T> Locator<T> scope(Key<T> key, Locator<T> unscoped);
 }
diff --git a/src/com/google/inject/Scopes.java b/src/com/google/inject/Scopes.java
index ff3d068..755e9d9 100644
--- a/src/com/google/inject/Scopes.java
+++ b/src/com/google/inject/Scopes.java
@@ -32,7 +32,7 @@
    * The default scope, one instance per injection.
    */
   public static final Scope DEFAULT = new Scope() {
-    public <T> Factory<T> scope(Key<T> key, Factory<T> creator) {
+    public <T> Locator<T> scope(Key<T> key, Locator<T> creator) {
       return creator;
     }
 
@@ -45,8 +45,8 @@
    * One instance per container. Also see {@code @}{@link ContainerScoped}.
    */
   public static final Scope CONTAINER = new Scope() {
-    public <T> Factory<T> scope(Key<T> key, final Factory<T> creator) {
-      return new Factory<T>() {
+    public <T> Locator<T> scope(Key<T> key, final Locator<T> creator) {
+      return new Locator<T>() {
 
         private volatile T instance;
 
@@ -116,8 +116,8 @@
     if (scope == null || scope == DEFAULT) {
       return creator;
     }
-    Factory<T> scoped = scope.scope(key,
-        new FactoryToInternalFactoryAdapter<T>(container, creator));
-    return new InternalFactoryToFactoryAdapter<T>(scoped);
+    Locator<T> scoped = scope.scope(key,
+        new LocatorToInternalFactoryAdapter<T>(container, creator));
+    return new InternalFactoryToLocatorAdapter<T>(scoped);
   }
 }
diff --git a/src/com/google/inject/package-info.java b/src/com/google/inject/package-info.java
index 198cfda..8750d8a 100644
--- a/src/com/google/inject/package-info.java
+++ b/src/com/google/inject/package-info.java
@@ -38,12 +38,10 @@
  * <dd>The object that Guice passes into your {@link com.google.inject.Module}
  *     to collect these bindings.
  *
- * <dt>{@link com.google.inject.Factory} and
- *     {@link com.google.inject.Generator}
+ * <dt>{@link com.google.inject.Generator}
  * <dd>The interface you will implement when you need to customize exactly how
- *     Guice creates instances for a particular binding.  These differ only in
- *     whether a {@link com.google.inject.Context} is made available to the
- *     factory.
+ *     Guice creates instances for a particular binding.
+ *
  * <dt>{@link com.google.inject.Container}
  * <dd>An object which creates and manages all the instances that make
  *     up your application.  It is created by a
diff --git a/src/com/google/inject/servlet/ServletModule.java b/src/com/google/inject/servlet/ServletModule.java
index 8bf734e..63df37b 100644
--- a/src/com/google/inject/servlet/ServletModule.java
+++ b/src/com/google/inject/servlet/ServletModule.java
@@ -17,7 +17,6 @@
 package com.google.inject.servlet;
 
 import com.google.inject.AbstractModule;
-import com.google.inject.Factory;
 import com.google.inject.TypeLiteral;
 import com.google.inject.Generator;
 import com.google.inject.Context;
diff --git a/src/com/google/inject/servlet/ServletScopes.java b/src/com/google/inject/servlet/ServletScopes.java
index 1dfa780..aa07da8 100644
--- a/src/com/google/inject/servlet/ServletScopes.java
+++ b/src/com/google/inject/servlet/ServletScopes.java
@@ -17,7 +17,7 @@
 package com.google.inject.servlet;
 
 import com.google.inject.Scope;
-import com.google.inject.Factory;
+import com.google.inject.Locator;
 import com.google.inject.Key;
 
 import javax.servlet.http.HttpServletRequest;
@@ -36,9 +36,9 @@
    * HTTP servlet request scope.
    */
   public static final Scope REQUEST = new Scope() {
-    public <T> Factory<T> scope(Key<T> key, final Factory<T> creator) {
+    public <T> Locator<T> scope(Key<T> key, final Locator<T> creator) {
       final String name = key.toString();
-      return new Factory<T>() {
+      return new Locator<T>() {
         public T get() {
           HttpServletRequest request = GuiceFilter.getRequest();
           synchronized (request) {
@@ -63,9 +63,9 @@
    * HTTP session scope.
    */
   public static final Scope SESSION = new Scope() {
-    public <T> Factory<T> scope(Key<T> key, final Factory<T> creator) {
+    public <T> Locator<T> scope(Key<T> key, final Locator<T> creator) {
       final String name = key.toString();
-      return new Factory<T>() {
+      return new Locator<T>() {
         public T get() {
           HttpSession session = GuiceFilter.getRequest().getSession();
           synchronized (session) {
diff --git a/src/com/google/inject/tools/jmx/ManagedBinding.java b/src/com/google/inject/tools/jmx/ManagedBinding.java
index f25da83..ffa0896 100644
--- a/src/com/google/inject/tools/jmx/ManagedBinding.java
+++ b/src/com/google/inject/tools/jmx/ManagedBinding.java
@@ -34,7 +34,7 @@
     return binding.getKey().toString();
   }
 
-  public String getFactory() {
-    return binding.getFactory().toString();
+  public String getLocator() {
+    return binding.getLocator().toString();
   }
 }
diff --git a/src/com/google/inject/tools/jmx/ManagedBindingMBean.java b/src/com/google/inject/tools/jmx/ManagedBindingMBean.java
index 229cd2b..4b187d7 100644
--- a/src/com/google/inject/tools/jmx/ManagedBindingMBean.java
+++ b/src/com/google/inject/tools/jmx/ManagedBindingMBean.java
@@ -29,9 +29,9 @@
   String getSource();
 
   /**
-   * Gets the factory to which this binding is bound.
+   * Gets the locator to which this binding is bound.
    */
-  String getFactory();
+  String getLocator();
 
   /**
    * Gets the binding key.
diff --git a/test/com/google/inject/AllTests.java b/test/com/google/inject/AllTests.java
index c97fc7b..be10283 100644
--- a/test/com/google/inject/AllTests.java
+++ b/test/com/google/inject/AllTests.java
@@ -42,14 +42,14 @@
     suite.addTestSuite(CircularDependencyTest.class);
     suite.addTestSuite(StaticInjectionTest.class);
     suite.addTestSuite(NotRequiredTest.class);
-    suite.addTestSuite(FactoryTest.class);
+    suite.addTestSuite(GeneratorTest.class);
     suite.addTestSuite(SuperclassTest.class);
-    suite.addTestSuite(FactoryInjectionTest.class);
+    suite.addTestSuite(LocatorInjectionTest.class);
     suite.addTestSuite(PreloadingTest.class);
     suite.addTestSuite(ReflectionTest.class);
     suite.addTestSuite(ScopesTest.class);
     suite.addTestSuite(ImplicitBindingTest.class);
-    suite.addTestSuite(GeneratorTest.class);
+    suite.addTestSuite(BoundGeneratorTest.class);
 
     suite.addTestSuite(MatcherTest.class);
     suite.addTestSuite(ProxyFactoryTest.class);
diff --git a/test/com/google/inject/GeneratorTest.java b/test/com/google/inject/BoundGeneratorTest.java
similarity index 94%
rename from test/com/google/inject/GeneratorTest.java
rename to test/com/google/inject/BoundGeneratorTest.java
index d0b4b09..8a67e43 100644
--- a/test/com/google/inject/GeneratorTest.java
+++ b/test/com/google/inject/BoundGeneratorTest.java
@@ -21,9 +21,9 @@
 /**
  * @author crazybob@google.com (Bob Lee)
  */
-public class GeneratorTest extends TestCase {
+public class BoundGeneratorTest extends TestCase {
 
-  public void testFooGenerator() throws ContainerCreationException {
+  public void testFooGenerator() throws CreationException {
     ContainerBuilder cb = new ContainerBuilder();
     cb.bind(Foo.class).toGenerator(FooGenerator.class);
     Container c = cb.create();
@@ -39,7 +39,7 @@
   }
 
   public void testContainerScopedFooGenerator()
-      throws ContainerCreationException {
+      throws CreationException {
     ContainerBuilder cb = new ContainerBuilder();
     cb.bind(Foo.class).toGenerator(ContainerScopedFooGenerator.class);
     Container c = cb.create();
diff --git a/test/com/google/inject/CircularDependencyTest.java b/test/com/google/inject/CircularDependencyTest.java
index 6ae306b..33952f5 100644
--- a/test/com/google/inject/CircularDependencyTest.java
+++ b/test/com/google/inject/CircularDependencyTest.java
@@ -24,13 +24,13 @@
 public class CircularDependencyTest extends TestCase {
 
   public void testCircularlyDependentConstructors()
-      throws ContainerCreationException {
+      throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.bind(A.class).to(AImpl.class);
     builder.bind(B.class).to(BImpl.class);
 
     Container container = builder.create();
-    A a = container.getFactory(AImpl.class).get();
+    A a = container.getLocator(AImpl.class).get();
     assertNotNull(a.getB().getA());
   }
 
diff --git a/test/com/google/inject/ConstantConversionTest.java b/test/com/google/inject/ConstantConversionTest.java
index a610e79..7506ed5 100644
--- a/test/com/google/inject/ConstantConversionTest.java
+++ b/test/com/google/inject/ConstantConversionTest.java
@@ -61,12 +61,12 @@
     TEE, BAZ, BOB;
   }
 
-  public void testOneConstantInjection() throws ContainerCreationException {
+  public void testOneConstantInjection() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.bindConstant(NumericValue.class).to("5");
     builder.bind(Simple.class);
     Container container = builder.create();
-    Simple simple = container.getFactory(Simple.class).get();
+    Simple simple = container.getLocator(Simple.class).get();
     assertEquals(5, simple.i);
   }
 
@@ -74,14 +74,14 @@
     @Inject @NumericValue int i;
   }
 
-  public void testConstantInjection() throws ContainerCreationException {
+  public void testConstantInjection() throws CreationException {
     ContainerBuilder b = new ContainerBuilder();
     b.bindConstant(NumericValue.class).to("5");
     b.bindConstant(BooleanValue.class).to("true");
     b.bindConstant(EnumValue.class).to("TEE");
     b.bindConstant(ClassName.class).to(Foo.class.getName());
     Container c = b.create();
-    Foo foo = c.getFactory(Foo.class).get();
+    Foo foo = c.getLocator(Foo.class).get();
 
     checkNumbers(
       foo.integerField,
@@ -108,12 +108,12 @@
     }
   }
 
-  public void testInvalidInteger() throws ContainerCreationException {
+  public void testInvalidInteger() throws CreationException {
     ContainerBuilder b = new ContainerBuilder();
     b.bindConstant(NumericValue.class).to("invalid");
     Container c = b.create();
     try {
-      c.getFactory(InvalidInteger.class).get();
+      c.getLocator(InvalidInteger.class).get();
       fail();
     } catch (ConfigurationException e) { /* expected */ }
   }
@@ -122,12 +122,12 @@
     @Inject @NumericValue Integer integerField;
   }
 
-  public void testInvalidCharacter() throws ContainerCreationException {
+  public void testInvalidCharacter() throws CreationException {
     ContainerBuilder b = new ContainerBuilder();
     b.bindConstant(NumericValue.class).to("invalid");
     Container c = b.create();
     try {
-      c.getFactory(InvalidCharacter.class).get();
+      c.getLocator(InvalidCharacter.class).get();
       fail();
     } catch (ConfigurationException e) { /* expected */ }
   }
@@ -136,12 +136,12 @@
     @Inject @NumericValue char foo;
   }
 
-  public void testInvalidEnum() throws ContainerCreationException {
+  public void testInvalidEnum() throws CreationException {
     ContainerBuilder b = new ContainerBuilder();
     b.bindConstant(NumericValue.class).to("invalid");
     Container c = b.create();
     try {
-      c.getFactory(InvalidEnum.class).get();
+      c.getLocator(InvalidEnum.class).get();
       fail();
     } catch (ConfigurationException e) { /* expected */ }
   }
diff --git a/test/com/google/inject/ContainerTest.java b/test/com/google/inject/ContainerTest.java
index b181be6..24eeb63 100644
--- a/test/com/google/inject/ContainerTest.java
+++ b/test/com/google/inject/ContainerTest.java
@@ -34,7 +34,7 @@
   @Retention(RUNTIME)
   @Binder @interface I {}
 
-  public void testFactoryMethods() throws ContainerCreationException {
+  public void testLocatorMethods() throws CreationException {
     Singleton singleton = new Singleton();
     Singleton other = new Singleton();
 
@@ -46,20 +46,20 @@
     Container container = builder.create();
 
     assertSame(singleton,
-        container.getFactory(Key.get(Singleton.class)).get());
-    assertSame(singleton, container.getFactory(Singleton.class).get());
+        container.getLocator(Key.get(Singleton.class)).get());
+    assertSame(singleton, container.getLocator(Singleton.class).get());
     assertSame(singleton,
-        container.getFactory(new TypeLiteral<Singleton>() {}).get());
+        container.getLocator(new TypeLiteral<Singleton>() {}).get());
     assertSame(singleton, container.getInstance(Key.get(Singleton.class)));
     assertSame(singleton, container.getInstance(Singleton.class));
     assertSame(singleton,
         container.getInstance(new TypeLiteral<Singleton>() {}));
 
     assertSame(other,
-        container.getFactory(Key.get(Singleton.class, Other.class)).get());
-    assertSame(other, container.getFactory(Singleton.class, Other.class).get());
+        container.getLocator(Key.get(Singleton.class, Other.class)).get());
+    assertSame(other, container.getLocator(Singleton.class, Other.class).get());
     assertSame(other,
-        container.getFactory(new TypeLiteral<Singleton>() {}, Other.class).get());
+        container.getLocator(new TypeLiteral<Singleton>() {}, Other.class).get());
     assertSame(other, container.getInstance(Key.get(Singleton.class, Other.class)));
     assertSame(other, container.getInstance(Singleton.class, Other.class));
     assertSame(other,
@@ -68,9 +68,9 @@
 
   static class Singleton {}
 
-  public void testInjection() throws ContainerCreationException {
+  public void testInjection() throws CreationException {
     Container container = createFooContainer();
-    Foo foo = container.getFactory(Foo.class).get();
+    Foo foo = container.getLocator(Foo.class).get();
 
     assertEquals("test", foo.s);
     assertEquals("test", foo.bar.getTee().getS());
@@ -82,7 +82,7 @@
     assertSame(foo.bar, foo.bar.getTee().getBar());
   }
 
-  private Container createFooContainer() throws ContainerCreationException {
+  private Container createFooContainer() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
 
     builder.install(new AbstractModule() {
@@ -97,20 +97,20 @@
     return builder.create();
   }
 
-  public void testGetInstance() throws ContainerCreationException {
+  public void testGetInstance() throws CreationException {
     Container container = createFooContainer();
 
-    Bar bar = container.getFactory(Key.get(Bar.class)).get();
+    Bar bar = container.getLocator(Key.get(Bar.class)).get();
     assertEquals("test", bar.getTee().getS());
     assertEquals(5, bar.getI());
   }
 
   public void testIntAndIntegerAreInterchangeable()
-      throws ContainerCreationException {
+      throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.bindConstant(I.class).to(5);
     Container container = builder.create();
-    IntegerWrapper iw = container.getFactory(IntegerWrapper.class).get();
+    IntegerWrapper iw = container.getLocator(IntegerWrapper.class).get();
     assertEquals(5, (int) iw.i);
   }
 
@@ -186,13 +186,13 @@
   }
 
   public void testCircularlyDependentConstructors()
-      throws ContainerCreationException {
+      throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.bind(A.class).to(AImpl.class);
     builder.bind(B.class).to(BImpl.class);
 
     Container container = builder.create();
-    A a = container.getFactory(AImpl.class).get();
+    A a = container.getLocator(AImpl.class).get();
     assertNotNull(a.getB().getA());
   }
 
@@ -225,7 +225,7 @@
     }
   }
 
-  public void testInjectStatics() throws ContainerCreationException {
+  public void testInjectStatics() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.bindConstant(S.class).to("test");
     builder.bindConstant(I.class).to(5);
diff --git a/test/com/google/inject/ErrorHandlingTest.java b/test/com/google/inject/ErrorHandlingTest.java
index fda482f..432e1ed 100644
--- a/test/com/google/inject/ErrorHandlingTest.java
+++ b/test/com/google/inject/ErrorHandlingTest.java
@@ -25,7 +25,7 @@
  */
 public class ErrorHandlingTest {
 
-  public static void main(String[] args) throws ContainerCreationException {
+  public static void main(String[] args) throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.install(new MyModule());
     builder.create();
diff --git a/test/com/google/inject/FactoryTest.java b/test/com/google/inject/GeneratorTesy.java
similarity index 100%
rename from test/com/google/inject/FactoryTest.java
rename to test/com/google/inject/GeneratorTesy.java
diff --git a/test/com/google/inject/GenericInjectionTest.java b/test/com/google/inject/GenericInjectionTest.java
index 1f8c9bb..08d069b 100644
--- a/test/com/google/inject/GenericInjectionTest.java
+++ b/test/com/google/inject/GenericInjectionTest.java
@@ -26,12 +26,12 @@
  */
 public class GenericInjectionTest extends TestCase {
 
-  public void testGenericInjection() throws ContainerCreationException {
+  public void testGenericInjection() throws CreationException {
     List<String> names = Arrays.asList("foo", "bar", "bob");
     ContainerBuilder builder = new ContainerBuilder();
     builder.bind(new TypeLiteral<List<String>>() {}).to(names);
     Container container = builder.create();
-    Foo foo = container.getFactory(Foo.class).get();
+    Foo foo = container.getLocator(Foo.class).get();
     assertEquals(names, foo.names);
   }
 
diff --git a/test/com/google/inject/ImplicitBindingTest.java b/test/com/google/inject/ImplicitBindingTest.java
index 7d4d33b..326a1e0 100644
--- a/test/com/google/inject/ImplicitBindingTest.java
+++ b/test/com/google/inject/ImplicitBindingTest.java
@@ -23,7 +23,7 @@
  */
 public class ImplicitBindingTest extends TestCase {
 
-  public void testCircularDependency() throws ContainerCreationException {
+  public void testCircularDependency() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     Container container = builder.create();
     Foo foo = container.getInstance(Foo.class);
diff --git a/test/com/google/inject/IntegrationTest.java b/test/com/google/inject/IntegrationTest.java
index 7201dcb..ed785f3 100644
--- a/test/com/google/inject/IntegrationTest.java
+++ b/test/com/google/inject/IntegrationTest.java
@@ -28,7 +28,7 @@
  */
 public class IntegrationTest extends TestCase {
 
-  public void testIntegration() throws ContainerCreationException {
+  public void testIntegration() throws CreationException {
     CountingInterceptor counter = new CountingInterceptor();
 
     ContainerBuilder containerBuilder = new ContainerBuilder();
@@ -36,12 +36,12 @@
     containerBuilder.intercept(any(), any(), counter);
     Container container = containerBuilder.create();
 
-    Foo foo = container.getFactory(Key.get(Foo.class)).get();
+    Foo foo = container.getLocator(Key.get(Foo.class)).get();
     foo.foo();
     assertTrue(foo.invoked);
     assertEquals(1, counter.count);
 
-    foo = container.getFactory(Foo.class).get();
+    foo = container.getLocator(Foo.class).get();
     foo.foo();
     assertTrue(foo.invoked);
     assertEquals(2, counter.count);
diff --git a/test/com/google/inject/FactoryInjectionTest.java b/test/com/google/inject/LocatorInjectionTest.java
similarity index 68%
rename from test/com/google/inject/FactoryInjectionTest.java
rename to test/com/google/inject/LocatorInjectionTest.java
index ab0bebf..5dc99ef 100644
--- a/test/com/google/inject/FactoryInjectionTest.java
+++ b/test/com/google/inject/LocatorInjectionTest.java
@@ -21,9 +21,9 @@
 /**
  * @author crazybob@google.com (Bob Lee)
  */
-public class FactoryInjectionTest extends TestCase {
+public class LocatorInjectionTest extends TestCase {
 
-  public void testFactoryInjection() throws ContainerCreationException {
+  public void testLocatorInjection() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
 
     builder.bind(Bar.class);
@@ -31,20 +31,20 @@
 
     Container container = builder.create();
 
-    Foo foo = container.getFactory(Foo.class).get();
+    Foo foo = container.getLocator(Foo.class).get();
 
-    Bar bar = foo.barFactory.get();
+    Bar bar = foo.barLocator.get();
     assertNotNull(bar);
-    assertNotSame(bar, foo.barFactory.get());
+    assertNotSame(bar, foo.barLocator.get());
 
-    ContainerScoped containerScoped = foo.containerScopedFactory.get();
+    ContainerScoped containerScoped = foo.containerScopedLocator.get();
     assertNotNull(containerScoped);
-    assertSame(containerScoped, foo.containerScopedFactory.get());
+    assertSame(containerScoped, foo.containerScopedLocator.get());
   }
 
   static class Foo {
-    @Inject Factory<Bar> barFactory;
-    @Inject Factory<ContainerScoped> containerScopedFactory;
+    @Inject Locator<Bar> barLocator;
+    @Inject Locator<ContainerScoped> containerScopedLocator;
   }
 
   static class Bar {}
diff --git a/test/com/google/inject/NotRequiredTest.java b/test/com/google/inject/NotRequiredTest.java
index e6dd10d..b287c80 100644
--- a/test/com/google/inject/NotRequiredTest.java
+++ b/test/com/google/inject/NotRequiredTest.java
@@ -23,18 +23,18 @@
  */
 public class NotRequiredTest extends TestCase {
 
-  public void testProvided() throws ContainerCreationException {
+  public void testProvided() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.bind(Bar.class).to(BarImpl.class);
     Container c = builder.create();
-    Foo foo = c.getFactory(Foo.class).get();
+    Foo foo = c.getLocator(Foo.class).get();
     assertNotNull(foo.bar);
     assertNotNull(foo.fromMethod);
   }
 
-  public void testNotProvided() throws ContainerCreationException {
+  public void testNotProvided() throws CreationException {
     Container c = new ContainerBuilder().create();
-    Foo foo = c.getFactory(Foo.class).get();
+    Foo foo = c.getLocator(Foo.class).get();
     assertNull(foo.bar);
     assertNull(foo.fromMethod);
   }
diff --git a/test/com/google/inject/PerformanceComparison.java b/test/com/google/inject/PerformanceComparison.java
index 9f91e09..eb3c54a 100644
--- a/test/com/google/inject/PerformanceComparison.java
+++ b/test/com/google/inject/PerformanceComparison.java
@@ -94,7 +94,7 @@
   };
 
   static final Callable<Foo> juiceFactory = new Callable<Foo>() {
-    final Factory<Foo> fooFactory;
+    final Locator<Foo> fooLocator;
     {
       ContainerBuilder builder = new ContainerBuilder();
 
@@ -109,14 +109,14 @@
       });
 
       try {
-        fooFactory = builder.create().getFactory(Foo.class);
-      } catch (ContainerCreationException e) {
+        fooLocator = builder.create().getLocator(Foo.class);
+      } catch (CreationException e) {
         throw new RuntimeException(e);
       }
     }
 
     public Foo call() throws Exception {
-      return fooFactory.get();
+      return fooLocator.get();
     }
   };
 
diff --git a/test/com/google/inject/PreloadingTest.java b/test/com/google/inject/PreloadingTest.java
index 3b57202..eafce4e 100644
--- a/test/com/google/inject/PreloadingTest.java
+++ b/test/com/google/inject/PreloadingTest.java
@@ -30,14 +30,14 @@
     Bar.count = 0;
   }
 
-  public void testPreloadSome() throws ContainerCreationException {
+  public void testPreloadSome() throws CreationException {
     ContainerBuilder builder = createContainerBuilder(Stage.DEVELOPMENT);
     builder.create();
     assertEquals(1, Foo.count);
     assertEquals(0, Bar.count);
   }
 
-  public void testPreloadAll() throws ContainerCreationException {
+  public void testPreloadAll() throws CreationException {
     ContainerBuilder builder = createContainerBuilder(Stage.PRODUCTION);
     builder.create();
     assertEquals(1, Foo.count);
@@ -57,7 +57,7 @@
     try {
       builder.create();
       fail();
-    } catch (ContainerCreationException e) { /* expected */ }
+    } catch (CreationException e) { /* expected */ }
   }
 
   static class Foo {
diff --git a/test/com/google/inject/ProxyFactoryTest.java b/test/com/google/inject/ProxyFactoryTest.java
index 5c4487b..6d6bc1a 100644
--- a/test/com/google/inject/ProxyFactoryTest.java
+++ b/test/com/google/inject/ProxyFactoryTest.java
@@ -18,7 +18,7 @@
 
 import com.google.inject.ConstructionProxy;
 import static com.google.inject.matcher.Matchers.*;
-import com.google.inject.Factory;
+import com.google.inject.Locator;
 
 import junit.framework.TestCase;
 
@@ -42,7 +42,7 @@
     builder.intercept(any(), any(), interceptor);
     ProxyFactory factory = builder.create();
 
-    Factory<Simple> creator = factory.getFactory(Simple.class);
+    Locator<Simple> creator = factory.getFactory(Simple.class);
 
     Simple simple = creator.get();
     simple.invoke();
diff --git a/test/com/google/inject/ReflectionTest.java b/test/com/google/inject/ReflectionTest.java
index 3e6cc54..a86ad6c 100644
--- a/test/com/google/inject/ReflectionTest.java
+++ b/test/com/google/inject/ReflectionTest.java
@@ -28,37 +28,37 @@
   @Retention(RUNTIME)
   @Binder @interface I {}
 
-  public void testNormalBinding() throws ContainerCreationException {
+  public void testNormalBinding() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     Foo foo = new Foo();
     builder.bind(Foo.class).to(foo);
     Container container = builder.create();
     Binding<Foo> fooBinding = container.getBinding(Key.get(Foo.class));
-    assertSame(foo, fooBinding.getFactory().get());
+    assertSame(foo, fooBinding.getLocator().get());
     assertNotNull(fooBinding.getSource());
     assertEquals(Key.get(Foo.class), fooBinding.getKey());
     assertFalse(fooBinding.isConstant());
   }
 
-  public void testConstantBinding() throws ContainerCreationException {
+  public void testConstantBinding() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.bindConstant(I.class).to(5);
     Container container = builder.create();
     Binding<?> i = container.getBinding(Key.get(int.class, I.class));
-    assertEquals(5, i.getFactory().get());
+    assertEquals(5, i.getLocator().get());
     assertNotNull(i.getSource());
     assertEquals(Key.get(int.class, I.class), i.getKey());
     assertTrue(i.isConstant());
   }
 
-  public void testLinkedBinding() throws ContainerCreationException {
+  public void testLinkedBinding() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     Bar bar = new Bar();
     builder.bind(Bar.class).to(bar);
     builder.link(Key.get(Foo.class)).to(Key.get(Bar.class));
     Container container = builder.create();
     Binding<Foo> fooBinding = container.getBinding(Key.get(Foo.class));
-    assertSame(bar, fooBinding.getFactory().get());
+    assertSame(bar, fooBinding.getLocator().get());
     assertNotNull(fooBinding.getSource());
     assertEquals(Key.get(Foo.class), fooBinding.getKey());
     assertFalse(fooBinding.isConstant());
diff --git a/test/com/google/inject/ScopesTest.java b/test/com/google/inject/ScopesTest.java
index 18e16fc..25785bb 100644
--- a/test/com/google/inject/ScopesTest.java
+++ b/test/com/google/inject/ScopesTest.java
@@ -24,7 +24,7 @@
 public class ScopesTest extends TestCase {
 
   public void testContainerScopedAnnotation()
-      throws ContainerCreationException {
+      throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     Object bindingBuilder
         = builder.bind(Singleton.class);
@@ -37,7 +37,7 @@
   static class Singleton {}
 
   public void testOverriddingAnnotation()
-      throws ContainerCreationException {
+      throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     Object bindingBuilder
         = builder.bind(Singleton.class).in(Scopes.DEFAULT);
@@ -52,6 +52,6 @@
     try {
       builder.create();
       fail();
-    } catch (ContainerCreationException e) { /* expected */ }
+    } catch (CreationException e) { /* expected */ }
   }
 }
diff --git a/test/com/google/inject/StaticInjectionTest.java b/test/com/google/inject/StaticInjectionTest.java
index c7fe09b..c0925f1 100644
--- a/test/com/google/inject/StaticInjectionTest.java
+++ b/test/com/google/inject/StaticInjectionTest.java
@@ -31,7 +31,7 @@
   @Retention(RUNTIME)
   @Binder @interface S {}
 
-  public void testInjectStatics() throws ContainerCreationException {
+  public void testInjectStatics() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.bindConstant(S.class).to("test");
     builder.bindConstant(I.class).to(5);
diff --git a/test/com/google/inject/SuperclassTest.java b/test/com/google/inject/SuperclassTest.java
index 9b9b975..a9aa8d7 100644
--- a/test/com/google/inject/SuperclassTest.java
+++ b/test/com/google/inject/SuperclassTest.java
@@ -23,11 +23,11 @@
  */
 public class SuperclassTest extends TestCase {
 
-  public void testSuperclassInjection() throws ContainerCreationException {
+  public void testSuperclassInjection() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.bind(Foo.class);
     Container container = builder.create();
-    Factory<Sub> creator = container.getFactory(Sub.class);
+    Locator<Sub> creator = container.getLocator(Sub.class);
     Sub sub = creator.get();
     sub = creator.get();
     sub = creator.get();
diff --git a/test/com/google/inject/servlet/ServletTest.java b/test/com/google/inject/servlet/ServletTest.java
index b72332a..26b8c3d 100644
--- a/test/com/google/inject/servlet/ServletTest.java
+++ b/test/com/google/inject/servlet/ServletTest.java
@@ -18,7 +18,7 @@
 
 import com.google.inject.Container;
 import com.google.inject.ContainerBuilder;
-import com.google.inject.ContainerCreationException;
+import com.google.inject.CreationException;
 import com.google.inject.Key;
 
 import junit.framework.TestCase;
@@ -45,7 +45,7 @@
 public class ServletTest extends TestCase {
 
   public void testNewRequestObject()
-      throws ContainerCreationException, IOException, ServletException {
+      throws CreationException, IOException, ServletException {
     final Container container = createContainer();
 
     GuiceFilter filter = new GuiceFilter();
@@ -75,7 +75,7 @@
   }
 
   public void testExistingRequestObject()
-      throws ContainerCreationException, IOException, ServletException {
+      throws CreationException, IOException, ServletException {
     final Container container = createContainer();
 
     GuiceFilter filter = new GuiceFilter();
@@ -106,7 +106,7 @@
   }
 
   public void testNewSessionObject()
-      throws ContainerCreationException, IOException, ServletException {
+      throws CreationException, IOException, ServletException {
     final Container container = createContainer();
 
     GuiceFilter filter = new GuiceFilter();
@@ -139,7 +139,7 @@
   }
 
   public void testExistingSessionObject()
-      throws ContainerCreationException, IOException, ServletException {
+      throws CreationException, IOException, ServletException {
     final Container container = createContainer();
 
     GuiceFilter filter = new GuiceFilter();
@@ -173,7 +173,7 @@
     assertTrue(invoked[0]);
   }
 
-  private Container createContainer() throws ContainerCreationException {
+  private Container createContainer() throws CreationException {
     ContainerBuilder builder = new ContainerBuilder();
     builder.install(new ServletModule());
     builder.bind(InSession.class);
