diff --git a/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF
index 4fe1fde..2b47b55 100644
--- a/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF
+++ b/com.google.eclipse.protobuf.ui/META-INF/MANIFEST.MF
@@ -19,8 +19,9 @@
  org.eclipse.core.resources,
  org.eclipse.core.filesystem;bundle-version="1.3.100",
  org.eclipse.compare.core;bundle-version="3.5.200"
-Import-Package: org.apache.log4j,
- org.apache.commons.logging
+Import-Package: org.apache.commons.logging,
+ org.apache.log4j,
+ org.eclipse.ui.texteditor.spelling
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Export-Package: com.google.eclipse.protobuf.ui.contentassist.antlr
 Bundle-Activator: com.google.eclipse.protobuf.ui.internal.ProtobufActivator
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 9d316c3..7e4698f 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
@@ -12,6 +12,7 @@
 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.*;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
@@ -21,6 +22,7 @@
 import org.eclipse.xtext.ui.editor.model.XtextDocumentProvider;
 import org.eclipse.xtext.ui.editor.outline.actions.IOutlineContribution;
 import org.eclipse.xtext.ui.editor.preferences.*;
+import org.eclipse.xtext.ui.editor.quickfix.XtextQuickAssistProcessor;
 import org.eclipse.xtext.ui.editor.syntaxcoloring.*;
 
 import com.google.eclipse.protobuf.scoping.IFileUriResolver;
@@ -29,6 +31,7 @@
 import com.google.eclipse.protobuf.ui.editor.ProtobufUriEditorOpener;
 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.*;
@@ -38,6 +41,7 @@
 import com.google.eclipse.protobuf.ui.preferences.pages.editor.save.SaveActionsPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.pages.general.GeneralPreferenceStoreInitializer;
 import com.google.eclipse.protobuf.ui.preferences.pages.paths.PathsPreferenceStoreInitializer;
+import com.google.eclipse.protobuf.ui.quickfix.ProtobufQuickAssistProcessor;
 import com.google.eclipse.protobuf.ui.scoping.FileUriResolver;
 import com.google.eclipse.protobuf.ui.validation.ValidateOnActivation;
 import com.google.inject.Binder;
@@ -61,56 +65,48 @@
     w.getPartService().addPartListener(new ValidateOnActivation());
   }
 
+  public Class<? extends IFileUriResolver> bindFileUriResolver() {
+    return FileUriResolver.class;
+  }
+
+  public Class<? extends IHighlightingConfiguration> bindHighlightingConfiguration() {
+    return HighlightingConfiguration.class;
+  }
+
   @Override public Class<? extends IContentOutlinePage> bindIContentOutlinePage() {
     return ProtobufOutlinePage.class;
   }
-
+  
   @Override public Class<? extends IHyperlinkDetector> bindIHyperlinkDetector() {
     return ProtobufHyperlinkDetector.class;
   }
-
+  
+  @Override public Class<? extends IReconciler> bindIReconciler() {
+    return ProtobufReconciler.class;
+  }
+  
   @Override public Class<? extends IXtextEditorCallback> bindIXtextEditorCallback() {
     return AutoAddNatureEditorCallback.class;
   }
-
-  /** {@inheritDoc} */
-  @Override public void configureToggleLinkWithEditorOutlineContribution(Binder binder) {
-    binder.bind(IOutlineContribution.class)
-          .annotatedWith(IOutlineContribution.LinkWithEditor.class)
-          .to(LinkWithEditor.class);
+  
+  public Class<? extends IEObjectDocumentationProvider> bindObjectDocumentationProvider() {
+    return ProtobufDocumentationProvider.class;
   }
 
-  public void configureGeneralSettingsPreferencesInitializer(Binder binder) {
-    configurePreferenceInitializer(binder, "generalPreferences", GeneralPreferenceStoreInitializer.class);
+  public Class<? extends IPreferenceStoreAccess> bindPreferenceStoreAccess() {
+    return PreferenceStoreAccess.class;
   }
 
-  public void configureCompilerPreferencesInitializer(Binder binder) {
-    configurePreferenceInitializer(binder, "compilerPreferences", CompilerPreferenceStoreInitializer.class);
+  public Class<? extends ISemanticHighlightingCalculator> bindSemanticHighlightingCalculator() {
+    return ProtobufSemanticHighlightingCalculator.class;
   }
 
-  public void configurePathsPreferencesInitializer(Binder binder) {
-    configurePreferenceInitializer(binder, "pathsPreferences", PathsPreferenceStoreInitializer.class);
+  public Class<? extends XtextDocumentProvider> bindXtextDocumentProvider() {
+    return ProtobufDocumentProvider.class;
   }
 
-  public void configureNumericTagPreferencesInitializer(Binder binder) {
-    configurePreferenceInitializer(binder, "numericTagPreferences", NumericTagPreferenceStoreInitializer.class);
-  }
-
-  public void configureSaveActionsPreferencesInitializer(Binder binder) {
-    configurePreferenceInitializer(binder, "saveActionsPreferences", SaveActionsPreferenceStoreInitializer.class);
-  }
-
-  private void configurePreferenceInitializer(Binder binder, String name,
-      Class<? extends IPreferenceStoreInitializer> initializerType) {
-    binder.bind(IPreferenceStoreInitializer.class).annotatedWith(named(name)).to(initializerType);
-  }
-
-  public void configureFileUriResolver(Binder binder) {
-    binder.bind(IFileUriResolver.class).to(FileUriResolver.class);
-  }
-
-  public void configureDocumentProvider(Binder binder) {
-    binder.bind(XtextDocumentProvider.class).to(ProtobufDocumentProvider.class);
+  public Class<? extends XtextQuickAssistProcessor> bindXtextQuickAssistProcessor(){
+    return ProtobufQuickAssistProcessor.class;
   }
 
   @Override public void configureLanguageSpecificURIEditorOpener(Binder binder) {
@@ -120,19 +116,22 @@
           .to(ProtobufUriEditorOpener.class);
   }
 
-  public void configureSemanticHighlightingCalculator(Binder binder) {
-    binder.bind(ISemanticHighlightingCalculator.class).to(ProtobufSemanticHighlightingCalculator.class);
+  public void configurePreferencesInitializers(Binder binder) {
+    configurePreferenceInitializer(binder, "compilerPreferences", CompilerPreferenceStoreInitializer.class);
+    configurePreferenceInitializer(binder, "generalPreferences", GeneralPreferenceStoreInitializer.class);
+    configurePreferenceInitializer(binder, "numericTagPreferences", NumericTagPreferenceStoreInitializer.class);
+    configurePreferenceInitializer(binder, "pathsPreferences", PathsPreferenceStoreInitializer.class);
+    configurePreferenceInitializer(binder, "saveActionsPreferences", SaveActionsPreferenceStoreInitializer.class);
   }
 
-  public void configurePreferenceStoreAccess(Binder binder) {
-    binder.bind(IPreferenceStoreAccess.class).to(PreferenceStoreAccess.class);
+  private void configurePreferenceInitializer(Binder binder, String name,
+      Class<? extends IPreferenceStoreInitializer> initializerType) {
+    binder.bind(IPreferenceStoreInitializer.class).annotatedWith(named(name)).to(initializerType);
   }
 
-  public void configureHighlightingConfiguration(Binder binder) {
-    binder.bind(IHighlightingConfiguration.class).to(HighlightingConfiguration.class);
-  }
-
-  public void configureEObjectDocumentationProvider(Binder binder) {
-    binder.bind(IEObjectDocumentationProvider.class).to(ProtobufDocumentationProvider.class);
+  @Override public void configureToggleLinkWithEditorOutlineContribution(Binder binder) {
+    binder.bind(IOutlineContribution.class)
+          .annotatedWith(IOutlineContribution.LinkWithEditor.class)
+          .to(LinkWithEditor.class);
   }
 }
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
new file mode 100644
index 0000000..25220b7
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufReconcileStrategy.java
@@ -0,0 +1,52 @@
+/*
+ * 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.*;
+import org.eclipse.xtext.ui.editor.reconciler.XtextDocumentReconcileStrategy;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProtobufReconcileStrategy extends XtextDocumentReconcileStrategy {
+
+  private SpellingReconcileStrategy spellingStrategy;
+
+  @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 SpellingReconcileStrategy(viewer, spellingService);
+  }
+}
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
new file mode 100644
index 0000000..ba6496f
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/spelling/ProtobufReconciler.java
@@ -0,0 +1,41 @@
+/*
+ * 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 com.google.inject.Inject;
+
+import org.eclipse.jface.text.ITextViewer;
+import org.eclipse.jface.text.source.ISourceViewer;
+import org.eclipse.xtext.ui.editor.reconciler.XtextReconciler;
+
+/**
+ * @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/quickfix/ProtobufQuickAssistProcessor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/quickfix/ProtobufQuickAssistProcessor.java
new file mode 100644
index 0000000..15aa610
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/quickfix/ProtobufQuickAssistProcessor.java
@@ -0,0 +1,36 @@
+/*
+ * 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 java.util.Arrays.asList;
+
+import com.google.inject.Inject;
+
+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 java.util.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class ProtobufQuickAssistProcessor extends XtextQuickAssistProcessor {
+
+  @Inject private SpellingCorrectionProcessor spellingCorrectionProcessor;
+
+  @Override public ICompletionProposal[] computeQuickAssistProposals(IQuickAssistInvocationContext invocationContext) {
+    List<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>();
+    proposals.addAll(asList(spellingCorrectionProcessor.computeQuickAssistProposals(invocationContext)));
+    proposals.addAll(asList(super.computeQuickAssistProposals(invocationContext)));
+    return proposals.toArray(new ICompletionProposal[proposals.size()]);
+  }
+}
