diff --git a/com.google.eclipse.protobuf.ui/OSGI-INF/l10n/bundle.properties b/com.google.eclipse.protobuf.ui/OSGI-INF/l10n/bundle.properties
index 92ec2f9..273a9fe 100644
--- a/com.google.eclipse.protobuf.ui/OSGI-INF/l10n/bundle.properties
+++ b/com.google.eclipse.protobuf.ui/OSGI-INF/l10n/bundle.properties
@@ -8,6 +8,7 @@
 page.name.2 = Compiler
 page.name.3 = Import Paths
 page.name.4 = Editor
+page.name.5 = Save Actions
 keyword.label = Protocol Buffer
 command.description = Trigger expensive validation
 command.name = Validate
diff --git a/com.google.eclipse.protobuf.ui/plugin.xml b/com.google.eclipse.protobuf.ui/plugin.xml
index 57344bd..6fdc940 100644
--- a/com.google.eclipse.protobuf.ui/plugin.xml
+++ b/com.google.eclipse.protobuf.ui/plugin.xml
@@ -69,8 +69,12 @@
     </page>
     <page category="com.google.eclipse.protobuf.Protobuf"
       class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.editor.EditorPreferencePage"
-      id="com.google.eclipse.protobuf.ui.preferences.pages.editor"
-      name="%page.name.4">
+      id="com.google.eclipse.protobuf.ui.preferences.pages.editor" name="%page.name.4">
+      <keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
+    </page>
+    <page category="com.google.eclipse.protobuf.ui.preferences.pages.editor"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.pages.editor.save.SaveActionsPreferencePage"
+      id="com.google.eclipse.protobuf.ui.preferences.pages.editor" name="%page.name.5">
       <keywordReference id="com.google.eclipse.protobuf.ui.keyword_Protobuf" />
     </page>
   </extension>
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 43c431f..32ff714 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
@@ -40,6 +40,7 @@
 import com.google.eclipse.protobuf.ui.outline.ProtobufOutlinePage;
 import com.google.eclipse.protobuf.ui.preferences.PreferenceStoreAccess;
 import com.google.eclipse.protobuf.ui.preferences.pages.compiler.CompilerPreferenceStoreInitializer;
+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.scoping.FileUriResolver;
@@ -96,6 +97,10 @@
     configurePreferenceInitializer(binder, "pathsPreferences", PathsPreferenceStoreInitializer.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);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocCommandFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocCommandFactory.java
index efa8277..ec2694d 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocCommandFactory.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/ProtocCommandFactory.java
@@ -10,12 +10,11 @@
 
 import static com.google.eclipse.protobuf.util.CommonWords.space;
 
-import java.util.*;
+import com.google.eclipse.protobuf.ui.preferences.pages.compiler.SupportedLanguage;
 
 import org.eclipse.core.resources.*;
 
-import com.google.eclipse.protobuf.ui.preferences.pages.compiler.SupportedLanguage;
-import com.google.eclipse.protobuf.util.CommonWords;
+import java.util.*;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
index 096238b..72388c3 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
@@ -1,9 +1,10 @@
 /*
  * 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
- *
+ * 
+ * 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.model;
@@ -16,27 +17,30 @@
 import static org.eclipse.core.runtime.IStatus.ERROR;
 import static org.eclipse.emf.common.util.URI.createURI;
 import static org.eclipse.emf.ecore.resource.ContentHandler.UNSPECIFIED_CONTENT_TYPE;
+import static org.eclipse.text.undo.DocumentUndoManagerRegistry.getDocumentUndoManager;
 import static org.eclipse.xtext.EcoreUtil2.resolveLazyCrossReferences;
 import static org.eclipse.xtext.resource.XtextResource.OPTION_ENCODING;
 import static org.eclipse.xtext.util.CancelIndicator.NullImpl;
 
-import java.io.*;
-import java.net.URI;
+import com.google.eclipse.protobuf.ui.util.Resources;
+import com.google.inject.Inject;
 
 import org.eclipse.core.filesystem.*;
 import org.eclipse.core.runtime.*;
 import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.*;
 import org.eclipse.jface.text.source.IAnnotationModel;
-import org.eclipse.ui.IURIEditorInput;
+import org.eclipse.text.edits.TextEdit;
+import org.eclipse.text.undo.IDocumentUndoManager;
+import org.eclipse.ui.*;
 import org.eclipse.ui.ide.FileStoreEditorInput;
 import org.eclipse.xtext.resource.XtextResource;
 import org.eclipse.xtext.ui.editor.model.*;
 import org.eclipse.xtext.ui.resource.IResourceSetProvider;
 import org.eclipse.xtext.util.StringInputStream;
 
-import com.google.eclipse.protobuf.ui.util.*;
-import com.google.inject.Inject;
+import java.io.*;
+import java.net.URI;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -45,6 +49,7 @@
 
   @Inject private IResourceSetProvider resourceSetProvider;
   @Inject private Resources resources;
+  @Inject private SaveActions saveActions;
 
   @Override protected ElementInfo createElementInfo(Object element) throws CoreException {
     if (element instanceof FileStoreEditorInput) return createElementInfo((FileStoreEditorInput) element);
@@ -138,4 +143,29 @@
     resolveLazyCrossReferences(resource, NullImpl);
     return resource;
   }
+
+  @Override protected void doSaveDocument(IProgressMonitor monitor, Object element, IDocument document,
+      boolean overwrite) throws CoreException {
+    if (element instanceof IFileEditorInput) performSaveActions(document);
+    super.doSaveDocument(monitor, element, document, overwrite);
+  }
+
+  private void performSaveActions(IDocument document) throws CoreException {
+    TextEdit edit = saveActions.createSaveAction(document, new IRegion[] { allOf(document) });
+    if (edit == null) return;
+    try {
+      IDocumentUndoManager manager = getDocumentUndoManager(document);
+      manager.beginCompoundChange();
+      edit.apply(document);
+      manager.endCompoundChange();
+    } catch (Exception e) {
+      String message = e.getMessage();
+      if (message == null) message = e.getClass().getSimpleName();
+      throw new CoreException(new Status(ERROR, PLUGIN_ID, message, e));
+    }
+  }
+
+  private Region allOf(IDocument document) {
+    return new Region(0, document.getLength());
+  }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/SaveActions.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/SaveActions.java
new file mode 100644
index 0000000..e72b868
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/SaveActions.java
@@ -0,0 +1,71 @@
+/*
+ * 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.model;
+
+import static java.lang.Character.isWhitespace;
+import static org.eclipse.jface.text.IDocumentExtension3.DEFAULT_PARTITIONING;
+import static org.eclipse.jface.text.TextUtilities.getPartition;
+
+import com.google.eclipse.protobuf.ui.preferences.pages.editor.save.*;
+import com.google.inject.*;
+
+import org.apache.log4j.Logger;
+import org.eclipse.jface.text.*;
+import org.eclipse.text.edits.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+@Singleton
+class SaveActions {
+
+  @Inject private SaveActionsPreferencesFactory preferencesFactory;
+  
+  private static Logger logger = Logger.getLogger(SaveActions.class);
+  
+  TextEdit createSaveAction(IDocument document, IRegion[] changedRegions) {
+    SaveActionsPreferences preferences = preferencesFactory.preferences();
+    if (!preferences.shouldRemoveTrailingSpace()) return null;
+    TextEdit rootEdit = null;
+    try {
+      for (IRegion region : changedRegions) {
+        int lastLine = document.getLineOfOffset(region.getOffset() + region.getLength());
+        for (int line = firstLine(region, document); line <= lastLine; line++) {
+          IRegion lineRegion = document.getLineInformation(line);
+          if (lineRegion.getLength() == 0) continue;
+          int lineStart = lineRegion.getOffset();
+          int lineEnd = lineStart + lineRegion.getLength();
+          int charPos = rightMostNonWhitespaceChar(document, lineStart, lineEnd);
+          if (charPos >= lineEnd) continue;
+          // check partition - don't remove whitespace inside strings
+          ITypedRegion partition = getPartition(document, DEFAULT_PARTITIONING, charPos, false);
+          if ("__string".equals(partition.getType())) continue;
+          if (rootEdit == null) rootEdit = new MultiTextEdit();
+          rootEdit.addChild(new DeleteEdit(charPos, lineEnd - charPos));
+        }
+      }
+    } catch (BadLocationException e) {
+      logger.warn("Unable to create save actions", e);
+    }
+    return rootEdit;
+  }
+
+  private int firstLine(IRegion region, IDocument document) throws BadLocationException {
+    return document.getLineOfOffset(region.getOffset());
+  }
+
+  private int rightMostNonWhitespaceChar(IDocument document, int lineStart, int lineEnd) throws BadLocationException {
+    int charPos = lineEnd - 1;
+    while (charPos >= lineStart && isWhitespace(document.getChar(charPos))) {
+      charPos--;
+    }
+    return ++charPos;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElement.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElement.java
index 03b555e..258065a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElement.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/grammar/CompoundElement.java
@@ -12,7 +12,6 @@
 import static com.google.eclipse.protobuf.util.CommonWords.space;
 
 import com.google.eclipse.protobuf.grammar.CommonKeyword;
-import com.google.eclipse.protobuf.util.CommonWords;
 
 /**
  * Element composed of one or more keywords.
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java
index c5b5c80..b1a8690 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/PreferenceAndPropertyPage.java
@@ -49,7 +49,7 @@
   @Override protected final Control createContents(Composite parent) {
     Composite contents = contentParent(parent);
     doCreateContents(contents);
-    if (isPropertyPage()) setupBtnEnabledProjectSettingsBinding();
+    if (isPropertyPage()) setupBindingOfBtnEnabledProjectSettings();
     setupBinding(preferenceBinder);
     preferenceBinder.applyValues();
     updateContents();
@@ -120,7 +120,7 @@
    */
   protected abstract void doCreateContents(Composite parent);
 
-  private void setupBtnEnabledProjectSettingsBinding() {
+  private void setupBindingOfBtnEnabledProjectSettings() {
     BooleanPreference preference = enableProjectSettingsPreference(getPreferenceStore());
     if (preference == null) return;
     preferenceBinder.add(bindSelectionOf(btnEnableProjectSettings).to(preference));
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/RawPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/RawPreferences.java
new file mode 100644
index 0000000..3436e56
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/RawPreferences.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2011 Google Inc.
+ * 
+ * All rights reserved. This program and the accompanying materials are made
+ * available under the terms of the Eclipse 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.pages.editor.save;
+
+import com.google.eclipse.protobuf.ui.preferences.BooleanPreference;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class RawPreferences {
+
+  private final BooleanPreference removeTrailingWhitespace;
+
+  RawPreferences(IPreferenceStore store) {
+    removeTrailingWhitespace = new BooleanPreference("saveActions.removeTrailingWhitespace", store);
+  }
+
+  BooleanPreference removeTrailingWhitespace() {
+    return removeTrailingWhitespace;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencePage.java
new file mode 100644
index 0000000..2b9c858
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencePage.java
@@ -0,0 +1,76 @@
+/*
+ * 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.pages.editor.save;
+
+import static com.google.eclipse.protobuf.ui.preferences.binding.BindingToButtonSelection.bindSelectionOf;
+
+import com.google.eclipse.protobuf.ui.preferences.binding.*;
+import com.google.inject.Inject;
+
+import org.eclipse.jface.preference.*;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.*;
+import org.eclipse.ui.*;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+import org.eclipse.swt.SWT;
+
+/**
+ * "Save Actions" preference page.
+ * 
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class SaveActionsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
+  public SaveActionsPreferencePage() {
+  }
+
+  @Inject private IPreferenceStoreAccess preferenceStoreAccess;
+
+  private final PreferenceBinder preferenceBinder = new PreferenceBinder();
+
+  private Button btnRemoveTrailingwhitespace;
+
+  /** {@inheritDoc} */
+  public void init(IWorkbench workbench) {}
+
+  @Override protected Control createContents(Composite parent) {
+    Composite contents = new Composite(parent, NONE);
+    contents.setLayout(new GridLayout(1, false));
+    btnRemoveTrailingwhitespace = new Button(contents, SWT.CHECK);
+    btnRemoveTrailingwhitespace.setText("Remove trailing &whitespace");
+    setUpBinding();
+    preferenceBinder.applyValues();
+    return contents;
+  }
+
+  private void setUpBinding() {
+    RawPreferences preferences = new RawPreferences(getPreferenceStore());
+    preferenceBinder.addAll(
+        bindSelectionOf(btnRemoveTrailingwhitespace).to(preferences.removeTrailingWhitespace())
+    );
+  }
+
+  /**
+   * Returns the preference store of this preference page.
+   * @return the preference store.
+   */
+  @Override protected final IPreferenceStore doGetPreferenceStore() {
+    return preferenceStoreAccess.getWritablePreferenceStore();
+  }
+
+  @Override public final boolean performOk() {
+    preferenceBinder.saveValues();
+    return true;
+  }
+
+  @Override protected final void performDefaults() {
+    preferenceBinder.applyDefaults();
+    super.performDefaults();
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferenceStoreInitializer.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferenceStoreInitializer.java
new file mode 100644
index 0000000..a2f245b
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferenceStoreInitializer.java
@@ -0,0 +1,27 @@
+/*
+ * 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.pages.editor.save;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.*;
+
+/**
+ * Initializes default values for the "Paths" preferences.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class SaveActionsPreferenceStoreInitializer implements IPreferenceStoreInitializer {
+
+  /** {@inheritDoc} */
+  public void initialize(IPreferenceStoreAccess access) {
+    IPreferenceStore store = access.getWritablePreferenceStore();
+    RawPreferences preferences = new RawPreferences(store);
+    preferences.removeTrailingWhitespace().defaultValue(false);
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferences.java
new file mode 100644
index 0000000..0da70ef
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferences.java
@@ -0,0 +1,29 @@
+/*
+ * 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.pages.editor.save;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+
+/**
+ * "Save actions" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
+ * 
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class SaveActionsPreferences {
+
+  private final boolean removeTrailingSpace;
+  
+  SaveActionsPreferences(RawPreferences preferences) {
+    removeTrailingSpace = preferences.removeTrailingWhitespace().value();
+  }
+  
+  public boolean shouldRemoveTrailingSpace() {
+    return removeTrailingSpace;
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencesFactory.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencesFactory.java
new file mode 100644
index 0000000..e8edc4b
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/editor/save/SaveActionsPreferencesFactory.java
@@ -0,0 +1,29 @@
+/*
+ * 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.pages.editor.save;
+
+import com.google.inject.Inject;
+
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+/**
+ * Factory of <code>{@link SaveActionsPreferences}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class SaveActionsPreferencesFactory {
+
+  @Inject private IPreferenceStoreAccess storeAccess;
+
+  public SaveActionsPreferences preferences() {
+    IPreferenceStore store = storeAccess.getWritablePreferenceStore();
+    return new SaveActionsPreferences(new RawPreferences(store));
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencePage.java
index daf86a3..a6ceeae 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/general/GeneralPreferencePage.java
@@ -25,8 +25,6 @@
  * @author alruiz@google.com (Alex Ruiz)
  */
 public class GeneralPreferencePage extends PreferenceAndPropertyPage {
-  public GeneralPreferencePage() {
-  }
 
   private static final String PREFERENCE_PAGE_ID = "com.google.eclipse.protobuf.Protobuf";
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java
index cf5b6e0..7575d39 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/paths/PathsPreferences.java
@@ -18,8 +18,7 @@
 import org.eclipse.jface.preference.IPreferenceStore;
 
 /**
- * Paths preferences, retrieved from an <code>{@link IPreferenceStore}</code>. To create a new instance invoke
- * <code>{@link PathsPreferencesFactory#preferences(IProject)}</code>
+ * Paths preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Resources.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Resources.java
index b4ca2e7..7cb6c9a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Resources.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Resources.java
@@ -122,7 +122,6 @@
     return (adapter == null) ? null : (IResource) adapter;
   }
 
-
   private IPath pathOf(URI uri) {
     String platformUri = uri.toPlatformString(true);
     return (platformUri != null) ? new Path(platformUri) : null;
