diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java
index d1c59ee..b118d40 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/stubs/resources/FileStub.java
@@ -543,4 +543,9 @@
     }
     markers.add(marker);
   }
+
+  /** {@inheritDoc} */
+  @Override public void accept(IResourceProxyVisitor visitor, int depth, int memberFlags) throws CoreException {
+    throw new UnsupportedOperationException();
+  }
 }
diff --git a/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ImportHyperlinking_Test.java b/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ImportHyperlinking_Test.java
index 61636dd..ad7e51c 100644
--- a/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ImportHyperlinking_Test.java
+++ b/com.google.eclipse.protobuf.ui.functional.test/src/com/google/eclipse/protobuf/ui/editor/hyperlinking/ImportHyperlinking_Test.java
@@ -13,7 +13,6 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEclipseEditor;
 import org.junit.*;
-import org.junit.rules.TemporaryFolder;
 
 import com.google.eclipse.protobuf.ui.junit.CommentReaderRule;
 import com.google.eclipse.protobuf.ui.swtbot.ProtobufBot;
@@ -33,7 +32,6 @@
   }
 
   @Rule public CommentReaderRule commentReader = new CommentReaderRule();
-  @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
   // import 'google/protobuf/descriptor.proto';
   @Test public void should_open_file_in_plugIn() throws InterruptedException {
@@ -45,6 +43,8 @@
 
   private void navigateToImportedFile(SWTBotEclipseEditor editor) {
     editor.navigateTo(0, 10);
+    // for "F3" to work on Mac OS, go to "System Preferences" > "Keyboard" and ensure
+    // "Use all F1, F2, etc keys as standard function keys" is checked
     editor.pressShortcut(F3);
   }
 }
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/protoc/output/ProtocMarkerFactory_createErrorIfNecessary_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/protoc/output/ProtocMarkerFactory_createErrorIfNecessary_Test.java
index 4f52d6a..c3fe98e 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/protoc/output/ProtocMarkerFactory_createErrorIfNecessary_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/protoc/output/ProtocMarkerFactory_createErrorIfNecessary_Test.java
@@ -9,7 +9,7 @@
 package com.google.eclipse.protobuf.ui.protoc.output;
 
 import static com.google.eclipse.protobuf.junit.stubs.resources.MarkerStub.error;
-import static com.google.eclipse.protobuf.ui.validation.ProtobufResourceUIValidatorExtension.EDITOR_CHECK;
+import static com.google.eclipse.protobuf.ui.validation.MarkerTypes.EDITOR_CHECK;
 import static org.hamcrest.core.IsEqual.equalTo;
 import static org.junit.Assert.assertThat;
 
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/validation/ProtobufResourceUIValidatorExtension_createMarkers_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/validation/ProtobufResourceUIValidatorExtension_createMarkers_Test.java
deleted file mode 100644
index dc74956..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/validation/ProtobufResourceUIValidatorExtension_createMarkers_Test.java
+++ /dev/null
@@ -1,54 +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.ui.validation;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static com.google.eclipse.protobuf.ui.validation.ProtobufResourceUIValidatorExtension.EDITOR_CHECK;
-import static org.mockito.Mockito.*;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.*;
-import org.eclipse.xtext.ui.editor.validation.MarkerCreator;
-import org.eclipse.xtext.validation.Issue;
-import org.junit.*;
-
-/**
- * Tests for <code>{@link ProtobufResourceUIValidatorExtension#createMarkers(IFile, List, IProgressMonitor)}</code>
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProtobufResourceUIValidatorExtension_createMarkers_Test {
-  private static IFile file;
-  private static List<Issue> issues;
-  private static IProgressMonitor monitor;
-
-  @BeforeClass public static void setUpOnce() {
-    file = mock(IFile.class);
-    issues = newArrayList(mock(Issue.class), mock(Issue.class));
-    monitor = mock(IProgressMonitor.class);
-  }
-
-  private MarkerCreator markerCreator;
-  private ProtobufResourceUIValidatorExtension validator;
-
-  @Before public void setUp() {
-    markerCreator = mock(MarkerCreator.class);
-    validator = new ProtobufResourceUIValidatorExtension();
-    validator.markerCreator = markerCreator;
-  }
-
-  @Test public void should_create_markers_using_proto_editor_marker_type() throws CoreException {
-    validator.createMarkers(file, issues, monitor);
-    for (Issue issue : issues) {
-      verify(markerCreator).createMarker(issue, file, EDITOR_CHECK);
-    }
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/validation/ProtobufResourceUIValidatorExtension_deleteMarkers_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/validation/ProtobufResourceUIValidatorExtension_deleteMarkers_Test.java
deleted file mode 100644
index 67faf47..0000000
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/validation/ProtobufResourceUIValidatorExtension_deleteMarkers_Test.java
+++ /dev/null
@@ -1,53 +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.ui.validation;
-
-import static com.google.eclipse.protobuf.ui.validation.ProtobufResourceUIValidatorExtension.EDITOR_CHECK;
-import static org.eclipse.core.resources.IResource.DEPTH_ZERO;
-import static org.eclipse.xtext.ui.MarkerTypes.*;
-import static org.mockito.Mockito.*;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.*;
-import org.eclipse.xtext.validation.CheckMode;
-import org.junit.*;
-
-/**
- * Tests for <code>{@link ProtobufResourceUIValidatorExtension#deleteMarkers(IFile, CheckMode, IProgressMonitor)}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProtobufResourceUIValidatorExtension_deleteMarkers_Test {
-  private static CheckMode checkMode;
-  private static IProgressMonitor monitor;
-
-  @BeforeClass public static void setUpOnce() {
-    checkMode = mock(CheckMode.class);
-    monitor = mock(IProgressMonitor.class);
-  }
-
-  private IFile file;
-  private ProtobufResourceUIValidatorExtension validator;
-
-  @Before public void setUp() {
-    file = mock(IFile.class);
-    validator = new ProtobufResourceUIValidatorExtension();
-  }
-
-  @Test public void should_delete_all_xtext_and_protocol_buffer_editor_markers() throws CoreException {
-    validator.deleteMarkers(file, checkMode, monitor);
-    verifyDeletionOfMarkers(FAST_VALIDATION, NORMAL_VALIDATION, EDITOR_CHECK);
-  }
-
-  private void verifyDeletionOfMarkers(String...markerTypes) throws CoreException {
-    for (String markerType : markerTypes) {
-      verify(file).deleteMarkers(markerType, true, DEPTH_ZERO);
-    }
-  }
-}
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 e01066f..b956f9a 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
@@ -13,7 +13,6 @@
 import static org.eclipse.ui.PlatformUI.isWorkbenchRunning;
 
 import org.eclipse.jface.text.hyperlink.IHyperlinkDetector;
-import org.eclipse.jface.text.reconciler.IReconciler;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
@@ -25,9 +24,8 @@
 import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
 import org.eclipse.xtext.ui.editor.outline.actions.IOutlineContribution;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
-import org.eclipse.xtext.ui.editor.quickfix.XtextQuickAssistProcessor;
 import org.eclipse.xtext.ui.editor.syntaxcoloring.*;
-import org.eclipse.xtext.ui.validation.IResourceUIValidatorExtension;
+import org.eclipse.xtext.ui.validation.MarkerTypeProvider;
 
 import com.google.eclipse.protobuf.resource.IResourceVerifier;
 import com.google.eclipse.protobuf.scoping.IFileUriResolver;
@@ -36,7 +34,6 @@
 import com.google.eclipse.protobuf.ui.editor.*;
 import com.google.eclipse.protobuf.ui.editor.hyperlinking.ProtobufHyperlinkDetector;
 import com.google.eclipse.protobuf.ui.editor.model.ProtobufDocumentProvider;
-import com.google.eclipse.protobuf.ui.editor.spelling.ProtobufReconciler;
 import com.google.eclipse.protobuf.ui.editor.syntaxcoloring.*;
 import com.google.eclipse.protobuf.ui.internal.ProtobufActivator;
 import com.google.eclipse.protobuf.ui.outline.*;
@@ -48,7 +45,6 @@
 import com.google.eclipse.protobuf.ui.preferences.general.GeneralPreferences;
 import com.google.eclipse.protobuf.ui.preferences.misc.MiscellaneousPreferences;
 import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
-import com.google.eclipse.protobuf.ui.quickfix.ProtobufQuickAssistProcessor;
 import com.google.eclipse.protobuf.ui.resource.*;
 import com.google.eclipse.protobuf.ui.scoping.FileUriResolver;
 import com.google.eclipse.protobuf.ui.validation.*;
@@ -91,10 +87,6 @@
     return PreferenceDrivenProtobufParser.class;
   }
 
-  @Override public Class<? extends IReconciler> bindIReconciler() {
-    return ProtobufReconciler.class;
-  }
-
   public Class<? extends IResourceServiceProvider> bindIResourceServiceProvider() {
     return ProtobufServiceProvider.class;
   }
@@ -103,10 +95,6 @@
     return ResourceVerifier.class;
   }
 
-  public Class<? extends IResourceUIValidatorExtension> bindIResourceUIValidatorExtension() {
-    return ProtobufResourceUIValidatorExtension.class;
-  }
-
   public Class<? extends ISemanticHighlightingCalculator> bindISemanticHighlightingCalculator() {
     return ProtobufSemanticHighlightingCalculator.class;
   }
@@ -115,12 +103,12 @@
     return AutoAddNatureEditorCallback.class;
   }
 
-  public Class<? extends XtextDocumentProvider> bindXtextDocumentProvider() {
-    return ProtobufDocumentProvider.class;
+  @Override public Class<? extends MarkerTypeProvider> bindMarkerTypeProvider() {
+    return ProtobufMarkerTypeProvider.class;
   }
 
-  public Class<? extends XtextQuickAssistProcessor> bindXtextQuickAssistProcessor(){
-    return ProtobufQuickAssistProcessor.class;
+  public Class<? extends XtextDocumentProvider> bindXtextDocumentProvider() {
+    return ProtobufDocumentProvider.class;
   }
 
   public void configureFileOutsideWorkspaceIconUpdater(Binder binder) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufReconcileStrategy.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufReconcileStrategy.java
deleted file mode 100644
index 949f840..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufReconcileStrategy.java
+++ /dev/null
@@ -1,64 +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.ui.editor.spelling;
-
-import org.eclipse.jface.text.*;
-import org.eclipse.jface.text.reconciler.DirtyRegion;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.ui.texteditor.spelling.SpellingService;
-import org.eclipse.xtext.ui.editor.reconciler.XtextDocumentReconcileStrategy;
-
-import com.google.eclipse.protobuf.model.util.INodes;
-import com.google.inject.Inject;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProtobufReconcileStrategy extends XtextDocumentReconcileStrategy {
-  private ProtobufSpelling spellingStrategy;
-
-  @Inject private INodes nodes;
-
-  @Override public void reconcile(DirtyRegion dirtyRegion, IRegion subRegion) {
-    super.reconcile(dirtyRegion, subRegion);
-    if (spellingStrategy == null) {
-      return;
-    }
-    spellingStrategy.reconcile(dirtyRegion, subRegion);
-  }
-
-  @Override public void reconcile(IRegion subRegion) {
-    super.reconcile(subRegion);
-    initialReconcile();
-  }
-
-  @Override public void setDocument(IDocument document) {
-    super.setDocument(document);
-    if (spellingStrategy == null) {
-      return;
-    }
-    spellingStrategy.setDocument(document);
-    initialReconcile();
-  }
-
-  private void initialReconcile() {
-    if (spellingStrategy == null) {
-      return;
-    }
-    spellingStrategy.initialReconcile();
-  }
-
-  void addSpellSupport(ISourceViewer viewer, SpellingService spellingService) {
-    if (spellingStrategy != null) {
-      return;
-    }
-    spellingStrategy = new ProtobufSpelling(viewer, spellingService, nodes);
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufReconciler.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufReconciler.java
deleted file mode 100644
index 0b4a145..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufReconciler.java
+++ /dev/null
@@ -1,42 +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.ui.editor.spelling;
-
-import static org.eclipse.ui.editors.text.EditorsUI.getSpellingService;
-
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.xtext.ui.editor.reconciler.XtextReconciler;
-
-import com.google.inject.Inject;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProtobufReconciler extends XtextReconciler {
-  private boolean installed;
-
-  @Inject public ProtobufReconciler(ProtobufReconcileStrategy strategy) {
-    super(strategy);
-  }
-
-  @Override public void install(ITextViewer textViewer) {
-    if (installed) {
-      return;
-    }
-    super.install(textViewer);
-    if (textViewer instanceof ISourceViewer) {
-      ISourceViewer viewer = (ISourceViewer) textViewer;
-      ProtobufReconcileStrategy strategy = (ProtobufReconcileStrategy) getReconcilingStrategy("");
-      strategy.addSpellSupport(viewer, getSpellingService());
-    }
-    installed = true;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufSpelling.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufSpelling.java
deleted file mode 100644
index 14bdda8..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufSpelling.java
+++ /dev/null
@@ -1,101 +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.ui.editor.spelling;
-
-import static org.eclipse.xtext.nodemodel.util.NodeModelUtils.*;
-
-import java.util.Iterator;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.text.*;
-import org.eclipse.jface.text.source.*;
-import org.eclipse.ui.texteditor.spelling.*;
-import org.eclipse.xtext.nodemodel.*;
-import org.eclipse.xtext.parser.IParseResult;
-import org.eclipse.xtext.resource.XtextResource;
-import org.eclipse.xtext.ui.editor.model.XtextDocument;
-import org.eclipse.xtext.util.concurrent.IUnitOfWork;
-
-import com.google.eclipse.protobuf.model.util.INodes;
-import com.google.eclipse.protobuf.protobuf.Import;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class ProtobufSpelling extends SpellingReconcileStrategy {
-  private final INodes nodes;
-
-  ProtobufSpelling(ISourceViewer viewer, SpellingService spellingService, INodes nodes) {
-    super(viewer, spellingService);
-    this.nodes = nodes;
-  }
-
-  @Override public void setDocument(IDocument document) {
-    super.setDocument(document);
-  }
-
-  @Override public void reconcile(IRegion region) {
-    IAnnotationModel model = getAnnotationModel();
-    if (model == null) {
-      return;
-    }
-    super.reconcile(new Region(0, xtextDocument().getLength()));
-    removeUnwantedAnnotations(model);
-  }
-
-  private void removeUnwantedAnnotations(final IAnnotationModel model) {
-    xtextDocument().readOnly(new IUnitOfWork.Void<XtextResource>() {
-      @Override public void process(XtextResource resource) throws Exception {
-        IParseResult parseResult = resource.getParseResult();
-        if (parseResult != null) {
-          removeUnwantedAnnotations(parseResult.getRootNode(), model);
-        }
-      }
-    });
-  }
-
-  private XtextDocument xtextDocument() {
-    return (XtextDocument) super.getDocument();
-  }
-
-  @SuppressWarnings("unchecked")
-  private void removeUnwantedAnnotations(INode rootNode, IAnnotationModel model) {
-    Iterator<Annotation> iterator = model.getAnnotationIterator();
-    while (iterator.hasNext()) {
-      Annotation annotation = iterator.next();
-      if (shouldRemoveFromModel(annotation, model, rootNode)) {
-        model.removeAnnotation(annotation);
-      }
-    }
-  }
-
-  private boolean shouldRemoveFromModel(Annotation annotation, IAnnotationModel model, INode rootNode) {
-    if (!(annotation instanceof SpellingAnnotation)) {
-      return false;
-    }
-    SpellingAnnotation spellingAnnotation = (SpellingAnnotation) annotation;
-    Position position = model.getPosition(spellingAnnotation);
-    ILeafNode node = findLeafNodeAtOffset(rootNode, position.getOffset());
-    return !shouldSpellCheck(node);
-  }
-
-  private boolean shouldSpellCheck(INode node) {
-    if (node == null) {
-      return false;
-    }
-    if (nodes.isComment(node)) {
-      return true;
-    }
-    if (nodes.isString(node)) {
-      EObject o = findActualSemanticObjectFor(node);
-      return !(o instanceof Import);
-    }
-    return false;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/NumericTagPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/NumericTagPreferencePage.java
index 5326644..f661367 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/NumericTagPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/NumericTagPreferencePage.java
@@ -10,6 +10,7 @@
 
 import static com.google.eclipse.protobuf.ui.preferences.editor.numerictag.AddOrEditPatternDialog.*;
 import static com.google.eclipse.protobuf.ui.preferences.editor.numerictag.Messages.*;
+import static com.google.eclipse.protobuf.ui.preferences.editor.numerictag.PreferenceNames.NUMERIC_TAG_PATTERNS;
 import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToListItems.bindItemsOf;
 import static org.eclipse.jface.window.Window.OK;
 
@@ -19,7 +20,7 @@
 import org.eclipse.swt.layout.*;
 import org.eclipse.swt.widgets.*;
 
-import com.google.eclipse.protobuf.ui.preferences.*;
+import com.google.eclipse.protobuf.ui.preferences.StringSplitter;
 import com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage;
 import com.google.eclipse.protobuf.ui.preferences.pages.binding.*;
 
@@ -119,7 +120,7 @@
 
   @Override protected void setupBinding(PreferenceBinder binder, PreferenceFactory factory) {
     StringSplitter splitter = NumericTagPatternSplitter.instance();
-    binder.add(bindItemsOf(lstPaths).to(factory.newStringListPreference(PREFERENCE_PAGE_ID, splitter)));
+    binder.add(bindItemsOf(lstPaths).to(factory.newStringListPreference(NUMERIC_TAG_PATTERNS, splitter)));
   }
 
   @Override protected void onProjectSettingsActivation(boolean projectSettingsActive) {}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/output/ProtocMarkerFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/output/ProtocMarkerFactory.java
index 58f2af2..2b5e833 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/output/ProtocMarkerFactory.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/output/ProtocMarkerFactory.java
@@ -8,7 +8,7 @@
  */
 package com.google.eclipse.protobuf.ui.protoc.output;
 
-import static com.google.eclipse.protobuf.ui.validation.ProtobufResourceUIValidatorExtension.EDITOR_CHECK;
+import static com.google.eclipse.protobuf.ui.validation.MarkerTypes.*;
 import static org.eclipse.core.resources.IMarker.*;
 import static org.eclipse.core.resources.IResource.DEPTH_INFINITE;
 
@@ -21,8 +21,6 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class ProtocMarkerFactory {
-  private static final String PROTOC_CHECK = "com.google.eclipse.protobuf.ui.protocMarker";
-
   private final IFile protoFile;
   private final IMarker[] markers;
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/quickfix/ProtobufQuickAssistProcessor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/quickfix/ProtobufQuickAssistProcessor.java
deleted file mode 100644
index 2b4296b..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/quickfix/ProtobufQuickAssistProcessor.java
+++ /dev/null
@@ -1,51 +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.ui.quickfix;
-
-import static com.google.common.collect.Lists.newArrayList;
-import static java.util.Collections.emptyList;
-
-import java.util.List;
-
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.quickassist.IQuickAssistInvocationContext;
-import org.eclipse.ui.texteditor.spelling.SpellingCorrectionProcessor;
-import org.eclipse.xtext.ui.editor.quickfix.XtextQuickAssistProcessor;
-
-import com.google.inject.Inject;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProtobufQuickAssistProcessor extends XtextQuickAssistProcessor {
-  @Inject private SpellingCorrectionProcessor spellingCorrectionProcessor;
-
-  @Override public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext context) {
-    List<ICompletionProposal> proposals = newArrayList();
-    proposals.addAll(spellingFixes(context));
-    proposals.addAll(newArrayList(super.computeQuickAssistProposals(context)));
-    return proposals.toArray(new ICompletionProposal[proposals.size()]);
-  }
-
-  private List<ICompletionProposal> spellingFixes(IQuickAssistInvocationContext context) {
-    ICompletionProposal[] spellingFixes = spellingCorrectionProcessor.computeQuickAssistProposals(context);
-    if (spellingFixes.length == 0) {
-      return emptyList();
-    }
-    if (spellingFixes.length == 1 && isNoCompletionsProposal(spellingFixes[0])) {
-      return emptyList();
-    }
-    return newArrayList(spellingFixes);
-  }
-
-  private boolean isNoCompletionsProposal(ICompletionProposal p) {
-    return p.getClass().getSimpleName().equals("NoCompletionsProposal");
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/MarkerTypes.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/MarkerTypes.java
new file mode 100644
index 0000000..20b3937
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/MarkerTypes.java
@@ -0,0 +1,19 @@
+/*
+ * Copyright (c) 2012 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.validation;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public final class MarkerTypes {
+  public static final String EDITOR_CHECK = "com.google.eclipse.protobuf.ui.editorMarker";
+  public static final String PROTOC_CHECK = "com.google.eclipse.protobuf.ui.protocMarker";
+
+  private MarkerTypes() {}
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufMarkerTypeProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufMarkerTypeProvider.java
new file mode 100644
index 0000000..230dcfe
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufMarkerTypeProvider.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2012 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.validation;
+
+import static com.google.eclipse.protobuf.ui.validation.MarkerTypes.EDITOR_CHECK;
+
+import org.eclipse.xtext.ui.validation.MarkerTypeProvider;
+import org.eclipse.xtext.validation.Issue;
+
+import com.google.inject.Singleton;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@Singleton
+public class ProtobufMarkerTypeProvider extends MarkerTypeProvider {
+  @Override public String getMarkerType(Issue issue) {
+    return EDITOR_CHECK;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufResourceUIValidatorExtension.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufResourceUIValidatorExtension.java
deleted file mode 100644
index 621d9a6..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ProtobufResourceUIValidatorExtension.java
+++ /dev/null
@@ -1,45 +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.ui.validation;
-
-import static org.eclipse.core.resources.IResource.DEPTH_ZERO;
-
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.*;
-import org.eclipse.xtext.ui.editor.validation.MarkerCreator;
-import org.eclipse.xtext.ui.validation.DefaultResourceUIValidatorExtension;
-import org.eclipse.xtext.validation.*;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.inject.Inject;
-
-/**
- * Creates/deletes markers of type "Protocol Buffer Problem" instead of the default "Xtext Check."
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class ProtobufResourceUIValidatorExtension extends DefaultResourceUIValidatorExtension {
-  public static final String EDITOR_CHECK = "com.google.eclipse.protobuf.ui.editorMarker";
-
-  @VisibleForTesting @Inject MarkerCreator markerCreator;
-
-  @Override protected void createMarkers(IFile file, List<Issue> list, IProgressMonitor monitor) throws CoreException {
-    for (Issue issue : list) {
-      markerCreator.createMarker(issue, file, EDITOR_CHECK);
-    }
-  }
-
-  @Override protected void deleteMarkers(IFile file, CheckMode checkMode, IProgressMonitor monitor)
-      throws CoreException {
-    super.deleteMarkers(file, checkMode, monitor);
-    file.deleteMarkers(EDITOR_CHECK, true, DEPTH_ZERO);
-  }
-}
