diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/OverrideRuntimeModuleSetup.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/OverrideRuntimeModuleSetup.java
index b1d1146..251358f 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/OverrideRuntimeModuleSetup.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/OverrideRuntimeModuleSetup.java
@@ -7,10 +7,13 @@
  * http://www.eclipse.org/legal/epl-v10.html
  */
 package com.google.eclipse.protobuf.junit.core;
-import static com.google.inject.util.Modules.override;
+
+import static org.eclipse.xtext.util.Modules2.mixin;
 
 import com.google.eclipse.protobuf.*;
 import com.google.inject.*;
+
+
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
@@ -22,7 +25,7 @@
   }
 
   @Override public Injector createInjector() {
-    Module newModule = override(new ProtobufRuntimeModule()).with(module);
-    return Guice.createInjector(newModule);
+    Module mixin = mixin(new ProtobufRuntimeModule(), module);
+    return Guice.createInjector(mixin);
   }
 }
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/XtextRule.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/XtextRule.java
index 9a2ae03..13d06c1 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/XtextRule.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/XtextRule.java
@@ -46,15 +46,19 @@
   private Finder finder;
 
   public static XtextRule overrideRuntimeModuleWith(Module testModule) {
-    return new XtextRule(new OverrideRuntimeModuleSetup(testModule));
+    return createWith(new OverrideRuntimeModuleSetup(testModule));
   }
 
   public static XtextRule createWith(ISetup setup) {
-    return new XtextRule(setup);
+    return createWith(setup.createInjectorAndDoEMFRegistration());
   }
 
-  private XtextRule(ISetup setup) {
-    injector = setup.createInjectorAndDoEMFRegistration();
+  public static XtextRule createWith(Injector injector) {
+    return new XtextRule(injector);
+  }
+
+  private XtextRule(Injector injector) {
+    this.injector = injector;
     reader = new TestSourceReader();
   }
 
diff --git a/com.google.eclipse.protobuf.ui.functional.test/.classpath b/com.google.eclipse.protobuf.ui.functional.test/.classpath
new file mode 100644
index 0000000..ad32c83
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.functional.test/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/com.google.eclipse.protobuf.ui.functional.test/.gitignore b/com.google.eclipse.protobuf.ui.functional.test/.gitignore
new file mode 100644
index 0000000..5e56e04
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.functional.test/.gitignore
@@ -0,0 +1 @@
+/bin
diff --git a/com.google.eclipse.protobuf.ui.functional.test/.project b/com.google.eclipse.protobuf.ui.functional.test/.project
new file mode 100644
index 0000000..b0c832e
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.functional.test/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>com.google.eclipse.protobuf.ui.functional.test</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/com.google.eclipse.protobuf.ui.functional.test/.settings/org.eclipse.jdt.core.prefs b/com.google.eclipse.protobuf.ui.functional.test/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..dd7d0d5
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.functional.test/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Thu Dec 29 17:04:14 EST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/com.google.eclipse.protobuf.ui.functional.test/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf.ui.functional.test/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..cc5ba7d
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.functional.test/META-INF/MANIFEST.MF
@@ -0,0 +1,10 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Test
+Bundle-SymbolicName: com.google.eclipse.protobuf.ui.functional.test
+Bundle-Version: 1.0.0.qualifier
+Bundle-Vendor: Google Inc.
+Fragment-Host: com.google.eclipse.protobuf.ui;bundle-version="1.1.1"
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
+Require-Bundle: org.eclipse.swtbot.go;bundle-version="2.0.5",
+ org.mockito;bundle-version="1.8.5"
diff --git a/com.google.eclipse.protobuf.ui.functional.test/build.properties b/com.google.eclipse.protobuf.ui.functional.test/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.functional.test/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/junit/core/OverrideUiModuleSetup.java b/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/junit/core/OverrideUiModuleSetup.java
new file mode 100644
index 0000000..8552cef
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/junit/core/OverrideUiModuleSetup.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.junit.core;
+
+import static org.eclipse.xtext.util.Modules2.mixin;
+
+import org.eclipse.xtext.ISetup;
+import org.eclipse.xtext.ui.shared.SharedStateModule;
+
+import com.google.eclipse.protobuf.*;
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+import com.google.eclipse.protobuf.ui.ProtobufUiModule;
+import com.google.eclipse.protobuf.ui.internal.ProtobufActivator;
+import com.google.inject.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class OverrideUiModuleSetup extends ProtobufStandaloneSetup {
+  private final Module module;
+
+  public static XtextRule overrideUiModuleWith(Module module) {
+    ISetup setup = new OverrideUiModuleSetup(module);
+    return XtextRule.createWith(setup);
+  }
+
+  OverrideUiModuleSetup(Module module) {
+    this.module = module;
+  }
+
+  @Override public Injector createInjector() {
+    Module mixin = mixin(new ProtobufRuntimeModule(),
+                         new SharedStateModule(),
+                         new ProtobufUiModule(ProtobufActivator.getInstance()),
+                         module);
+    return Guice.createInjector(mixin);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser_doParse_Test.java b/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser_doParse_Test.java
new file mode 100644
index 0000000..c01d672
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser_doParse_Test.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.parser;
+
+import static com.google.eclipse.protobuf.junit.core.XtextRule.createWith;
+import static com.google.eclipse.protobuf.ui.Internals.injector;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
+import static org.junit.Assert.*;
+
+import org.antlr.runtime.CharStream;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.nodemodel.impl.NodeModelBuilder;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+import org.junit.*;
+
+import com.google.eclipse.protobuf.junit.core.XtextRule;
+import com.google.eclipse.protobuf.junit.util.MultiLineTextBuilder;
+import com.google.eclipse.protobuf.parser.NonProto2Protobuf;
+import com.google.eclipse.protobuf.protobuf.Protobuf;
+
+/**
+ * Tests for <code>{@link PreferenceDrivenProtobufParser#doParse(String, CharStream, NodeModelBuilder, int)}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class PreferenceDrivenProtobufParser_doParse_Test {
+  private static String proto1;
+
+  @BeforeClass public static void setUpOnce() {
+    MultiLineTextBuilder proto = new MultiLineTextBuilder();
+    proto.append("// ignore errors")
+         .append("c++header #include 'test/common/proto_class.h'");
+    proto1 = proto.toString();
+  }
+
+  @Rule public XtextRule xtext = createWith(injector());
+
+  private IPreferenceStore store;
+
+  @Before public void setUp() {
+    IPreferenceStoreAccess storeAccess = xtext.getInstanceOf(IPreferenceStoreAccess.class);
+    store = storeAccess.getWritablePreferenceStore();
+  }
+
+  @Test public void should_recognize_proto1_syntax() {
+    store.setValue("parser.checkProto2Only", true);
+    xtext.parseText(proto1);
+    Protobuf root = xtext.root();
+    assertThat(root, instanceOf(NonProto2Protobuf.class));
+  }
+
+  @Test public void should_not_recognize_proto1_syntax() {
+    store.setValue("parser.checkProto2Only", false);
+    xtext.parseText(proto1);
+    Protobuf root = xtext.root();
+    assertNull(root);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
index 51e8274..76d3e0e 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/ProtobufUiModule.java
@@ -17,6 +17,7 @@
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
 import org.eclipse.xtext.documentation.IEObjectDocumentationProvider;
+import org.eclipse.xtext.parser.IParser;
 import org.eclipse.xtext.ui.LanguageSpecific;
 import org.eclipse.xtext.ui.editor.*;
 import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
@@ -36,11 +37,13 @@
 import com.google.eclipse.protobuf.ui.editor.syntaxcoloring.*;
 import com.google.eclipse.protobuf.ui.internal.ProtobufActivator;
 import com.google.eclipse.protobuf.ui.outline.*;
+import com.google.eclipse.protobuf.ui.parser.PreferenceDrivenProtobufParser;
 import com.google.eclipse.protobuf.ui.preferences.PreferenceStoreAccess;
 import com.google.eclipse.protobuf.ui.preferences.compiler.core.CompilerPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.editor.numerictag.core.NumericTagPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.editor.save.core.SaveActionsPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.general.core.GeneralPreferenceStoreInitializer;
+import com.google.eclipse.protobuf.ui.preferences.parser.core.ParserChecksPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.paths.core.PathsPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.quickfix.ProtobufQuickAssistProcessor;
 import com.google.eclipse.protobuf.ui.scoping.FileUriResolver;
@@ -80,6 +83,10 @@
     return ProtobufHyperlinkDetector.class;
   }
 
+  public Class<? extends IParser> bindIParser() {
+    return PreferenceDrivenProtobufParser.class;
+  }
+
   public Class<? extends IPreferenceStoreAccess> bindIPreferenceStoreAccess() {
     return PreferenceStoreAccess.class;
   }
@@ -127,6 +134,7 @@
     configurePreferenceInitializer(binder, "compilerPreferences", CompilerPreferenceStoreInitializer.class);
     configurePreferenceInitializer(binder, "generalPreferences", GeneralPreferenceStoreInitializer.class);
     configurePreferenceInitializer(binder, "numericTagPreferences", NumericTagPreferenceStoreInitializer.class);
+    configurePreferenceInitializer(binder, "parserChecksPreferences", ParserChecksPreferenceStoreInitializer.class);
     configurePreferenceInitializer(binder, "pathsPreferences", PathsPreferenceStoreInitializer.class);
     configurePreferenceInitializer(binder, "saveActionsPreferences", SaveActionsPreferenceStoreInitializer.class);
   }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/Proto2OnlyParser.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser.java
similarity index 72%
rename from com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/Proto2OnlyParser.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser.java
index b456a0d..4cb578d 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/Proto2OnlyParser.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/parser/PreferenceDrivenProtobufParser.java
@@ -6,33 +6,36 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.parser;
+package com.google.eclipse.protobuf.ui.parser;
 
 import org.antlr.runtime.CharStream;
 import org.eclipse.xtext.nodemodel.*;
 import org.eclipse.xtext.nodemodel.impl.NodeModelBuilder;
 import org.eclipse.xtext.parser.*;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
+import com.google.eclipse.protobuf.parser.NonProto2Protobuf;
 import com.google.eclipse.protobuf.parser.antlr.ProtobufParser;
 import com.google.eclipse.protobuf.protobuf.Protobuf;
+import com.google.eclipse.protobuf.ui.preferences.parser.core.ParserChecksPreferences;
 import com.google.inject.Inject;
 
 /**
- * Parser that only parses protocol buffers with "proto2" syntax, older syntax is ignored completely.
- *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class Proto2OnlyParser extends ProtobufParser {
+public class PreferenceDrivenProtobufParser extends ProtobufParser {
   private static final String[] ERRORS_TO_LOOK_FOR = { "missing EOF at 'c'", "missing EOF at 'java'",
       "missing EOF at 'parsed'", "missing EOF at 'python'", "no viable alternative at input '<'" };
 
-  @Inject private ParserChecksSettingsProvider settingsProvider;
+  @Inject private IPreferenceStoreAccess storeAccess;
 
+  // @Inject private ParserChecksSettingsProvider settingsProvider;
   @Override protected IParseResult doParse(String ruleName, CharStream in, NodeModelBuilder builder,
       int initialLookAhead) {
     IParseResult result = super.doParse(ruleName, in, builder, initialLookAhead);
-    if (settingsProvider.shouldCheckProto2Only() && isNotProto2(result)) {
-     return new ParseResult(new NonProto2Protobuf(), result.getRootNode(), false);
+    ParserChecksPreferences preferences = new ParserChecksPreferences(storeAccess);
+    if (preferences.enableProto2OnlyChecks().getValue() && isNotProto2(result)) {
+      return new ParseResult(new NonProto2Protobuf(), result.getRootNode(), false);
     }
     return result;
   }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/core/ParserChecksPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/core/ParserChecksPreferenceStoreInitializer.java
new file mode 100644
index 0000000..240342a
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/core/ParserChecksPreferenceStoreInitializer.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.preferences.parser.core;
+
+import org.eclipse.xtext.ui.editor.preferences.*;
+
+/**
+ * Initializes default values for the "parser checks" preferences.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ParserChecksPreferenceStoreInitializer implements IPreferenceStoreInitializer {
+  @Override public void initialize(IPreferenceStoreAccess storeAccess) {
+    ParserChecksPreferences preferences = new ParserChecksPreferences(storeAccess);
+    preferences.enableProto2OnlyChecks().setDefaultValue(false);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/core/ParserChecksPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/core/ParserChecksPreferences.java
new file mode 100644
index 0000000..795155b
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/parser/core/ParserChecksPreferences.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ *
+ * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
+ * Public License v1.0 which accompanies this distribution, and is available at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ */
+package com.google.eclipse.protobuf.ui.preferences.parser.core;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
+
+/**
+ * "Parser checks" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ParserChecksPreferences {
+  private final BooleanPreference enableProto2OnlyChecks;
+
+  /**
+   * Creates a new <code>{@link ParserChecksPreferences}</code>.
+   * @param storeAccess simplified access to Eclipse's preferences.
+   */
+  public ParserChecksPreferences(IPreferenceStoreAccess storeAccess) {
+    this(storeAccess.getWritablePreferenceStore());
+  }
+
+  /**
+   * Creates a new <code>{@link ParserChecksPreferences}</code>.
+   * @param store a table mapping named preferences to values.
+   */
+  public ParserChecksPreferences(IPreferenceStore store) {
+    enableProto2OnlyChecks = new BooleanPreference("parser.checkProto2Only", store);
+  }
+
+  /**
+   * Returns the setting that specifies if "proto2" only files are allowed.
+   * @return the setting that specifies if "proto2" only files are allowed.
+   */
+  public BooleanPreference enableProto2OnlyChecks() {
+    return enableProto2OnlyChecks;
+  }
+}
diff --git a/com.google.eclipse.protobuf/plugin.xml b/com.google.eclipse.protobuf/plugin.xml
index 79c091c..abdcd04 100644
--- a/com.google.eclipse.protobuf/plugin.xml
+++ b/com.google.eclipse.protobuf/plugin.xml
@@ -5,7 +5,6 @@
     id="descriptorSource"
     name="descriptor-source"
     schema="schema/descriptor-source.exsd" />
-  <extension-point id="parserChecks" name="parser-checks" schema="schema/parser-checks.exsd"/>
   <extension point="org.eclipse.emf.ecore.generated_package">
     <package
       uri="http://www.google.com/eclipse/protobuf/Protobuf"
diff --git a/com.google.eclipse.protobuf/schema/parser-checks.exsd b/com.google.eclipse.protobuf/schema/parser-checks.exsd
deleted file mode 100644
index e0b6653..0000000
--- a/com.google.eclipse.protobuf/schema/parser-checks.exsd
+++ /dev/null
@@ -1,67 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="com.google.eclipse.protobuf" xmlns="http://www.w3.org/2001/XMLSchema">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="com.google.eclipse.protobuf" id="parserChecks" name="parser-checks"/>
-      </appInfo>
-      <documentation>Parser checks for proto files.</documentation>
-   </annotation>
-   <element name="extension">
-      <annotation>
-         <appInfo>
-            <meta.element />
-         </appInfo>
-      </annotation>
-      <complexType>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation></documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation></documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation></documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-   <element name="checks">
-      <complexType>
-         <attribute name="proto2OnlyCheck" type="boolean" use="default" value="false">
-            <annotation>
-               <documentation></documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>1.3</documentation>
-   </annotation>
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-Copyright (c) 2011 Google, Inc.
-
-All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at 
-
-http://www.eclipse.org/legal/epl-v10.html
-
-Contributors:
-Google, Inc. - initial API and implementation
-      </documentation>
-   </annotation>
-</schema>
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
index 585e0e2..4a1d22a 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/ProtobufRuntimeModule.java
@@ -11,7 +11,6 @@
 import org.eclipse.core.runtime.IExtensionRegistry;
 import org.eclipse.xtext.conversion.IValueConverterService;
 import org.eclipse.xtext.naming.IQualifiedNameProvider;
-import org.eclipse.xtext.parser.IParser;
 import org.eclipse.xtext.parser.antlr.ISyntaxErrorMessageProvider;
 import org.eclipse.xtext.resource.*;
 import org.eclipse.xtext.scoping.impl.ImportUriResolver;
@@ -20,7 +19,6 @@
 import com.google.eclipse.protobuf.conversion.ProtobufTerminalConverters;
 import com.google.eclipse.protobuf.linking.ProtobufResource;
 import com.google.eclipse.protobuf.naming.ProtobufQualifiedNameProvider;
-import com.google.eclipse.protobuf.parser.Proto2OnlyParser;
 import com.google.eclipse.protobuf.resource.ResourceServiceProvider;
 import com.google.eclipse.protobuf.scoping.*;
 import com.google.eclipse.protobuf.validation.*;
@@ -38,10 +36,6 @@
     return ProtobufImportUriResolver.class;
   }
 
-  @Override public Class<? extends IParser> bindIParser() {
-    return Proto2OnlyParser.class;
-  }
-
   @Override public Class<? extends IQualifiedNameProvider> bindIQualifiedNameProvider() {
     return ProtobufQualifiedNameProvider.class;
   }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/ParserChecksSettingsProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/ParserChecksSettingsProvider.java
deleted file mode 100644
index 5bd2a67..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/parser/ParserChecksSettingsProvider.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
- * Public License v1.0 which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package com.google.eclipse.protobuf.parser;
-
-import org.eclipse.core.runtime.*;
-
-import com.google.inject.*;
-
-/**
- * Provider of settings of parser checks.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-@Singleton public class ParserChecksSettingsProvider {
-  private static final String EXTENSION_ID = "com.google.eclipse.protobuf.parserChecks";
-
-  @Inject private IExtensionRegistry registry;
-
-  private boolean initialized;
-  private boolean proto2OnlyCheck;
-
-  private final Object lock = new Object();
-
-  /**
-   * Indicates whether the parser should ensure .proto files have "proto2" syntax.
-   * @return {@code true} if the parser should ensure .proto files have "proto2" syntax, {@code false} otherwise.
-   */
-  public boolean shouldCheckProto2Only() {
-    ensureIsInitialized();
-    return proto2OnlyCheck;
-  }
-
-  private void ensureIsInitialized() {
-    synchronized (lock) {
-      if (initialized) {
-        return;
-      }
-      initialized = true;
-      initializeFromExtensionPoint();
-    }
-  }
-
-  private void initializeFromExtensionPoint() {
-    IConfigurationElement[] config = registry.getConfigurationElementsFor(EXTENSION_ID);
-    if (config == null) {
-      return;
-    }
-    for (IConfigurationElement e : config) {
-      String proto2OnlyCheckAttribure = e.getAttribute("proto2OnlyCheck");
-      proto2OnlyCheck = Boolean.parseBoolean(proto2OnlyCheckAttribure);
-    }
-  }
-}
