diff --git a/lib/manager.dart b/lib/manager.dart
new file mode 100644
index 0000000..4fd6e73
--- /dev/null
+++ b/lib/manager.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library plugin.manager;
+
+import 'package:plugin/src/plugin_impl.dart';
+import 'package:plugin/plugin.dart';
+
+/**
+ * An object that manages the extension points for the host application.
+ */
+abstract class ExtensionManager {
+  /**
+   * Initialize a newly created manager.
+   */
+  factory ExtensionManager() = ExtensionManagerImpl;
+
+  /**
+   * Process each of the given [plugins] by allowing them to register extension
+   * points and extensions.
+   *
+   * An [ExtensionError] will be thrown if any of the plugins throws such an
+   * exception while registering with this manager.
+   */
+  void processPlugins(List<Plugin> plugins);
+}
diff --git a/lib/plugin.dart b/lib/plugin.dart
index 019acd2..b0176f8 100644
--- a/lib/plugin.dart
+++ b/lib/plugin.dart
@@ -85,8 +85,8 @@
 }
 
 /**
- * A contribution to the analysis server that can extend the behavior of the
- * server while also allowing other plugins to extend it's behavior.
+ * A contribution to the host application that can extend the behavior of the
+ * application while also allowing other plugins to extend it's behavior.
  *
  * Clients are expected to subtype this class when implementing plugins.
  */
diff --git a/lib/src/plugin_impl.dart b/lib/src/plugin_impl.dart
index 70a76e5..a65a0d3 100644
--- a/lib/src/plugin_impl.dart
+++ b/lib/src/plugin_impl.dart
@@ -6,13 +6,13 @@
 
 import 'dart:collection';
 
+import 'package:plugin/manager.dart';
 import 'package:plugin/plugin.dart';
 
 /**
- * An object that manages the extension points for a single instance of the
- * analysis server.
+ * A concrete implementation of an [ExtensionManager].
  */
-class ExtensionManager {
+class ExtensionManagerImpl implements ExtensionManager {
   /**
    * A table mapping the id's of extension points to the corresponding
    * extension points.
@@ -20,13 +20,7 @@
   Map<String, ExtensionPointImpl> extensionPoints =
       new HashMap<String, ExtensionPointImpl>();
 
-  /**
-   * Process each of the given [plugins] by allowing them to register extension
-   * points and extensions.
-   *
-   * An [ExtensionError] will be thrown if any of the plugins throws such an
-   * exception while registering with this manager.
-   */
+  @override
   void processPlugins(List<Plugin> plugins) {
     for (Plugin plugin in plugins) {
       plugin.registerExtensionPoints((String identifier,
diff --git a/test/plugin_impl_test.dart b/test/plugin_impl_test.dart
index d28ebb0..5d2902f 100644
--- a/test/plugin_impl_test.dart
+++ b/test/plugin_impl_test.dart
@@ -15,7 +15,7 @@
     test('processPlugins', () {
       TestPlugin plugin1 = new TestPlugin('plugin1');
       TestPlugin plugin2 = new TestPlugin('plugin1');
-      ExtensionManager manager = new ExtensionManager();
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
       manager.processPlugins([plugin1, plugin2]);
       expect(plugin1.extensionPointsRegistered, true);
       expect(plugin1.extensionsRegistered, true);
@@ -25,7 +25,7 @@
 
     test('registerExtension - valid', () {
       Plugin plugin = new TestPlugin('plugin');
-      ExtensionManager manager = new ExtensionManager();
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
       ExtensionPoint point =
           manager.registerExtensionPoint(plugin, 'point', null);
       expect(point, isNotNull);
@@ -38,7 +38,7 @@
     });
 
     test('registerExtension - non existent', () {
-      ExtensionManager manager = new ExtensionManager();
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
       expect(() => manager.registerExtension('does not exist', 'extension'),
           throwsA(new isInstanceOf<ExtensionError>()));
       ;
@@ -47,7 +47,7 @@
     test('registerExtensionPoint - non-conflicting', () {
       Plugin plugin1 = new TestPlugin('plugin1');
       Plugin plugin2 = new TestPlugin('plugin2');
-      ExtensionManager manager = new ExtensionManager();
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
       expect(
           manager.registerExtensionPoint(plugin1, 'point1', null), isNotNull);
       expect(
@@ -60,7 +60,7 @@
 
     test('registerExtensionPoint - conflicting - same plugin', () {
       Plugin plugin1 = new TestPlugin('plugin1');
-      ExtensionManager manager = new ExtensionManager();
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
       expect(
           manager.registerExtensionPoint(plugin1, 'point1', null), isNotNull);
       expect(() => manager.registerExtensionPoint(plugin1, 'point1', null),
@@ -70,7 +70,7 @@
     test('registerExtensionPoint - conflicting - different plugins', () {
       Plugin plugin1 = new TestPlugin('plugin1');
       Plugin plugin2 = new TestPlugin('plugin1');
-      ExtensionManager manager = new ExtensionManager();
+      ExtensionManagerImpl manager = new ExtensionManagerImpl();
       expect(
           manager.registerExtensionPoint(plugin1, 'point1', null), isNotNull);
       expect(() => manager.registerExtensionPoint(plugin2, 'point1', null),
