Make the descriptor proto preference workspace-level

Change-Id: I6e57690a23d17c76bb9aed3cc2512252d0653492
diff --git a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy_matchingProtobufElementLocations_Test.java b/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy_matchingProtobufElementLocations_Test.java
index 42ba588..de7a683 100644
--- a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy_matchingProtobufElementLocations_Test.java
+++ b/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy_matchingProtobufElementLocations_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/util/ExtendedListIterator_Test.java b/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/util/ExtendedListIterator_Test.java
index 59382c3..ed8ed08 100644
--- a/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/util/ExtendedListIterator_Test.java
+++ b/com.google.eclipse.protobuf.cdt.test/src/com/google/eclipse/protobuf/cdt/util/ExtendedListIterator_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/IBindings.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/IBindings.java
index 6f0dd3d..4773455 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/IBindings.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/mapping/IBindings.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy.java b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy.java
index 26394a3..eb6713f 100644
--- a/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy.java
+++ b/com.google.eclipse.protobuf.cdt/src/com/google/eclipse/protobuf/cdt/matching/MessageMatcherStrategy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.feature/feature.properties b/com.google.eclipse.protobuf.feature/feature.properties
index 0fbd4dd..97c61be 100644
--- a/com.google.eclipse.protobuf.feature/feature.properties
+++ b/com.google.eclipse.protobuf.feature/feature.properties
@@ -30,7 +30,7 @@
 
 # copyright
 copyright=\
-Copyright (c) 2011, 2014 Google, Inc.\n\   
+Copyright (c) 2011 Google, Inc.\n\   
 All rights reserved. This program and the accompanying materials\n\
 are made available under the terms of the Eclipse Public License v1.0\n\
 which accompanies this distribution, and is available at\n\
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/bugs/Issue147_AddSupportForGroupOptions_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/bugs/Issue147_AddSupportForGroupOptions_Test.java
index b6c4997..62a5015 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/bugs/Issue147_AddSupportForGroupOptions_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/bugs/Issue147_AddSupportForGroupOptions_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor_availableOptionsFor_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor_availableOptionsFor_Test.java
index bb1a53b..4d29754 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor_availableOptionsFor_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor_availableOptionsFor_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor_enumTypeOf_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor_enumTypeOf_Test.java
index d84468e..137f118 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor_enumTypeOf_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtoDescriptor_enumTypeOf_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_LiteralLink_target_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_LiteralLink_target_Test.java
index f338235..1c13b6f 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_LiteralLink_target_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_LiteralLink_target_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_target_Test.java b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_target_Test.java
index 1bec02d..8b30f48 100644
--- a/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_target_Test.java
+++ b/com.google.eclipse.protobuf.integration.test/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider_scope_OptionSource_target_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/IntegrationTestModule.java b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/IntegrationTestModule.java
index b045ab3..695fdad 100644
--- a/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/IntegrationTestModule.java
+++ b/com.google.eclipse.protobuf.test/src/com/google/eclipse/protobuf/junit/core/IntegrationTestModule.java
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2011, 2014 Google Inc.
+* 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
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath_parse_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath_parse_Test.java
index ca38e0a..d3b5bda 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath_parse_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/DirectoryPath_parse_Test.java
@@ -19,7 +19,7 @@
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.eclipse.protobuf.ui.preferences.locations.DirectoryPath;
+import com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPath;
 
 /**
  * Tests for <code>{@link DirectoryPath#parse(String, IProject)}</code>
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectNameWithProjectVariable_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectNameWithProjectVariable_Test.java
index 8fa8a74..5f7324b 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectNameWithProjectVariable_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectNameWithProjectVariable_Test.java
@@ -19,7 +19,7 @@
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.eclipse.protobuf.ui.preferences.locations.ProjectVariable;
+import com.google.eclipse.protobuf.ui.preferences.paths.ProjectVariable;
 
 /**
  * Tests for <code>{@link ProjectVariable#replaceProjectNameWithProjectVariable(IPath, IProject)}</code>.
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectVariableWithProjectName_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectVariableWithProjectName_Test.java
index 18c58e1..9ccba70 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectVariableWithProjectName_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/preferences/paths/core/ProjectVariable_replaceProjectVariableWithProjectName_Test.java
@@ -19,7 +19,7 @@
 import org.junit.Before;
 import org.junit.Test;
 
-import com.google.eclipse.protobuf.ui.preferences.locations.ProjectVariable;
+import com.google.eclipse.protobuf.ui.preferences.paths.ProjectVariable;
 
 /**
  * Tests for <code>{@link ProjectVariable#replaceProjectVariableWithProjectName(IPath, IProject)}</code>.
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/protoc/command/ImportRootsProtocOption_singleImportRoot_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/protoc/command/ImportRootsProtocOption_singleImportRoot_Test.java
index b842872..be2e9a1 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/protoc/command/ImportRootsProtocOption_singleImportRoot_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/protoc/command/ImportRootsProtocOption_singleImportRoot_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesUriResolver_resolveUri_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesUriResolver_resolveUri_Test.java
index 14e5ae4..d66f283 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesUriResolver_resolveUri_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesUriResolver_resolveUri_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014 Google Inc.
+ * 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
@@ -21,8 +21,8 @@
 
 import com.google.eclipse.protobuf.junit.core.AbstractTestModule;
 import com.google.eclipse.protobuf.junit.core.XtextRule;
-import com.google.eclipse.protobuf.ui.preferences.locations.DirectoryPath;
-import com.google.eclipse.protobuf.ui.preferences.locations.LocationsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPath;
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
 import com.google.inject.Inject;
 
 import org.eclipse.jface.preference.IPreferenceStore;
@@ -50,14 +50,14 @@
   @Inject private MultipleDirectoriesUriResolver strategy;
 
   private IPreferenceStore store;
-  private LocationsPreferences preferences;
-  private Iterable<LocationsPreferences> allPreferences;
+  private PathsPreferences preferences;
+  private Iterable<PathsPreferences> allPreferences;
 
   @Before public void setUp() {
     IPreferenceStoreAccess storeAccess = mock(IPreferenceStoreAccess.class);
     store = mock(IPreferenceStore.class);
     when(storeAccess.getWritablePreferenceStore(null)).thenReturn(store);
-    preferences = new LocationsPreferences(storeAccess , null);
+    preferences = new PathsPreferences(storeAccess , null);
     allPreferences = singletonList(preferences);
   }
 
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver_resolveUri_withFileUri_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver_resolveUri_withFileUri_Test.java
index fd2185f..bdaa894 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver_resolveUri_withFileUri_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver_resolveUri_withFileUri_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver_resolveUri_withPlatformResourceUri_Test.java b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver_resolveUri_withPlatformResourceUri_Test.java
index 0c3c592..a92fcf7 100644
--- a/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver_resolveUri_withPlatformResourceUri_Test.java
+++ b/com.google.eclipse.protobuf.ui.test/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver_resolveUri_withPlatformResourceUri_Test.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
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 506667f..f0c1dc6 100644
--- a/com.google.eclipse.protobuf.ui/OSGI-INF/l10n/bundle.properties
+++ b/com.google.eclipse.protobuf.ui/OSGI-INF/l10n/bundle.properties
@@ -1,4 +1,9 @@
-#Properties file for com.google.eclipse.protobuf.ui
+# Copyright (c) 2014 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
 Bundle-Vendor = Google Inc.
 Bundle-Name = Protocol Buffer Descriptor Editor
 editor.name = Protocol Buffer Editor
@@ -6,7 +11,7 @@
 page.name.0 = Syntax Coloring
 page.name.1 = Templates
 page.name.2 = Compiler
-page.name.3 = Locations
+page.name.3 = Import Paths
 page.name.4 = Editor
 page.name.5 = Save Actions
 page.name.6 = Numeric Tags
diff --git a/com.google.eclipse.protobuf.ui/plugin.xml b/com.google.eclipse.protobuf.ui/plugin.xml
index 398e664..3570fe6 100644
--- a/com.google.eclipse.protobuf.ui/plugin.xml
+++ b/com.google.eclipse.protobuf.ui/plugin.xml
@@ -209,7 +209,7 @@
       </enabledWhen>
     </page>
     <page category="com.google.eclipse.protobuf.Protobuf"
-      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.locations.LocationsPreferencePage"
+      class="com.google.eclipse.protobuf.ui.ProtobufExecutableExtensionFactory:com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferencePage"
       id="com.google.eclipse.protobuf.ui.properties.paths.PropertyPage" name="%page.name.3" selectionFilter="single">
       <enabledWhen>
         <adapt type="org.eclipse.core.resources.IProject" />
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 672127d..018ca3b 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
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
@@ -12,7 +12,7 @@
 import static com.google.inject.name.Names.named;
 import static org.eclipse.ui.PlatformUI.isWorkbenchRunning;
 
-import com.google.eclipse.protobuf.preferences.descriptor.DescriptorPreferences;
+import com.google.eclipse.protobuf.preferences.general.GeneralPreferences;
 import com.google.eclipse.protobuf.resource.IResourceVerifier;
 import com.google.eclipse.protobuf.scoping.IImportResolver;
 import com.google.eclipse.protobuf.scoping.IUriResolver;
@@ -32,9 +32,8 @@
 import com.google.eclipse.protobuf.ui.preferences.editor.ignore.IgnoredExtensionsPreferences;
 import com.google.eclipse.protobuf.ui.preferences.editor.numerictag.NumericTagPreferences;
 import com.google.eclipse.protobuf.ui.preferences.editor.save.SaveActionsPreferences;
-import com.google.eclipse.protobuf.ui.preferences.general.GeneralPreferences;
-import com.google.eclipse.protobuf.ui.preferences.locations.LocationsPreferences;
 import com.google.eclipse.protobuf.ui.preferences.misc.MiscellaneousPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
 import com.google.eclipse.protobuf.ui.resource.ProtobufServiceProvider;
 import com.google.eclipse.protobuf.ui.resource.ResourceVerifier;
 import com.google.eclipse.protobuf.ui.scoping.ImportResolver;
@@ -144,9 +143,8 @@
     configurePreferenceInitializer(binder, "ignoredExtensions", IgnoredExtensionsPreferences.Initializer.class);
     configurePreferenceInitializer(binder, "numericTagPreferences", NumericTagPreferences.Initializer.class);
     configurePreferenceInitializer(binder, "miscellaneousPreferences", MiscellaneousPreferences.Initializer.class);
-    configurePreferenceInitializer(binder, "pathsPreferences", LocationsPreferences.Initializer.class);
+    configurePreferenceInitializer(binder, "pathsPreferences", PathsPreferences.Initializer.class);
     configurePreferenceInitializer(binder, "saveActionsPreferences", SaveActionsPreferences.Initializer.class);
-    configurePreferenceInitializer(binder, "descriptorPreferences", DescriptorPreferences.Initializer.class);
   }
 
   private void configurePreferenceInitializer(Binder binder, String name,
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/nature/AutoAddNatureEditorCallback.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/nature/AutoAddNatureEditorCallback.java
index 63608bf..dcd8da2 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/nature/AutoAddNatureEditorCallback.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/nature/AutoAddNatureEditorCallback.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java
index 687d408..1d5bc18 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/builder/protoc/ProtobufBuildParticipant.java
@@ -35,7 +35,7 @@
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
 import com.google.eclipse.protobuf.ui.preferences.compiler.CompilerPreferences;
-import com.google.eclipse.protobuf.ui.preferences.locations.LocationsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
 import com.google.eclipse.protobuf.ui.protoc.command.ProtocCommandBuilder;
 import com.google.eclipse.protobuf.ui.protoc.output.ProtocMarkerFactory;
 import com.google.eclipse.protobuf.ui.protoc.output.ProtocOutputParser;
@@ -66,7 +66,7 @@
     if (!compilerPreferences.shouldCompileProtoFiles()) {
       return;
     }
-    LocationsPreferences pathsPreferences = new LocationsPreferences(storeAccess, project);
+    PathsPreferences pathsPreferences = new PathsPreferences(storeAccess, project);
     ProtocCommandBuilder commandBuilder = new ProtocCommandBuilder(compilerPreferences, pathsPreferences);
     for (Delta delta : deltas) {
       if (subMonitor.isCanceled()) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/semicolon/CommentNodesFinder.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/semicolon/CommentNodesFinder.java
index 1fad23f..296f715 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/semicolon/CommentNodesFinder.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/commands/semicolon/CommentNodesFinder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
index 0c6c6d9..defd152 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/contentassist/ProtobufProposalProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/ProtobufEditor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/ProtobufEditor.java
index 67f7113..430ac27 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/ProtobufEditor.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/ProtobufEditor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferences.java
index 2235513..2f3d78e 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/compiler/CompilerPreferences.java
@@ -24,10 +24,11 @@
 import static com.google.eclipse.protobuf.ui.preferences.compiler.PreferenceNames.USE_PROTOC_IN_CUSTOM_PATH;
 import static com.google.eclipse.protobuf.ui.preferences.compiler.PreferenceNames.USE_PROTOC_IN_SYSTEM_PATH;
 
+import com.google.eclipse.protobuf.preferences.DefaultPreservingInitializer;
+
 import org.eclipse.core.resources.IProject;
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -96,23 +97,23 @@
     return project;
   }
 
-  public static class Initializer implements IPreferenceStoreInitializer {
+  public static class Initializer extends DefaultPreservingInitializer {
     private static final String DEFAULT_OUTPUT_DIRECTORY = "src-gen";
 
-    @Override public void initialize(IPreferenceStoreAccess storeAccess) {
-      IPreferenceStore store = storeAccess.getWritablePreferenceStore();
-      store.setDefault(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME, false);
-      store.setDefault(USE_PROTOC_IN_SYSTEM_PATH, true);
-      store.setDefault(USE_PROTOC_IN_CUSTOM_PATH, false);
-      store.setDefault(JAVA_CODE_GENERATION_ENABLED, false);
-      store.setDefault(CPP_CODE_GENERATION_ENABLED, false);
-      store.setDefault(PYTHON_CODE_GENERATION_ENABLED, false);
-      store.setDefault(JAVA_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_DIRECTORY);
-      store.setDefault(CPP_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_DIRECTORY);
-      store.setDefault(PYTHON_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_DIRECTORY);
-      store.setDefault(REFRESH_RESOURCES, true);
-      store.setDefault(REFRESH_PROJECT, true);
-      store.setDefault(REFRESH_OUTPUT_DIRECTORY, false);
+    @Override
+    public void setDefaults() {
+      setDefault(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME, false);
+      setDefault(USE_PROTOC_IN_SYSTEM_PATH, true);
+      setDefault(USE_PROTOC_IN_CUSTOM_PATH, false);
+      setDefault(JAVA_CODE_GENERATION_ENABLED, false);
+      setDefault(CPP_CODE_GENERATION_ENABLED, false);
+      setDefault(PYTHON_CODE_GENERATION_ENABLED, false);
+      setDefault(JAVA_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_DIRECTORY);
+      setDefault(CPP_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_DIRECTORY);
+      setDefault(PYTHON_OUTPUT_DIRECTORY, DEFAULT_OUTPUT_DIRECTORY);
+      setDefault(REFRESH_RESOURCES, true);
+      setDefault(REFRESH_PROJECT, true);
+      setDefault(REFRESH_OUTPUT_DIRECTORY, false);
     }
  }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/ignore/IgnoredExtensionsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/ignore/IgnoredExtensionsPreferences.java
index 6fff59c..e930aff 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/ignore/IgnoredExtensionsPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/ignore/IgnoredExtensionsPreferences.java
@@ -11,9 +11,10 @@
 import static com.google.eclipse.protobuf.ui.preferences.editor.ignore.PreferenceNames.IGNORED_EXTENSIONS;
 import static com.google.eclipse.protobuf.ui.util.CommaSeparatedValues.splitCsv;
 
+import com.google.eclipse.protobuf.preferences.DefaultPreservingInitializer;
+
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -30,10 +31,10 @@
     return splitCsv(value);
   }
 
-  public static class Initializer implements IPreferenceStoreInitializer {
-    @Override public void initialize(IPreferenceStoreAccess storeAccess) {
-      IPreferenceStore store = storeAccess.getWritablePreferenceStore();
-      store.setDefault(IGNORED_EXTENSIONS, ".ascii.proto,.binary.proto,.xml.proto");
+  public static class Initializer extends DefaultPreservingInitializer {
+    @Override
+    public void setDefaults() {
+      setDefault(IGNORED_EXTENSIONS, ".ascii.proto,.binary.proto,.xml.proto");
     }
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/NumericTagPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/NumericTagPreferences.java
index 418b3e5..3a73756 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/NumericTagPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/numerictag/NumericTagPreferences.java
@@ -10,11 +10,12 @@
 
 import static com.google.eclipse.protobuf.ui.preferences.editor.numerictag.PreferenceNames.NUMERIC_TAG_PATTERNS;
 
-import java.util.List;
+import com.google.eclipse.protobuf.preferences.DefaultPreservingInitializer;
 
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+
+import java.util.List;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -31,10 +32,10 @@
     return NumericTagPatternSplitter.instance().splitIntoList(value);
   }
 
-  public static class Initializer implements IPreferenceStoreInitializer {
-    @Override public void initialize(IPreferenceStoreAccess storeAccess) {
-      IPreferenceStore store = storeAccess.getWritablePreferenceStore();
-      store.setDefault(NUMERIC_TAG_PATTERNS, "Next[\\s]+Id:[\\s]+[\\d]+");
+  public static class Initializer extends DefaultPreservingInitializer {
+    @Override
+    public void setDefaults() {
+      setDefault(NUMERIC_TAG_PATTERNS, "Next[\\s]+Id:[\\s]+[\\d]+");
     }
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/SaveActionsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/SaveActionsPreferences.java
index 63d389b..660d2ce 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/SaveActionsPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/editor/save/SaveActionsPreferences.java
@@ -12,11 +12,11 @@
 import static com.google.eclipse.protobuf.ui.preferences.editor.save.PreferenceNames.IN_EDITED_LINES;
 import static com.google.eclipse.protobuf.ui.preferences.editor.save.PreferenceNames.REMOVE_TRAILING_WHITESPACE;
 
+import com.google.eclipse.protobuf.preferences.DefaultPreservingInitializer;
+import com.google.inject.Inject;
+
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
-
-import com.google.inject.Inject;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -36,12 +36,12 @@
     return store.getBoolean(IN_EDITED_LINES);
   }
 
-  public static class Initializer implements IPreferenceStoreInitializer {
-    @Override public void initialize(IPreferenceStoreAccess storeAccess) {
-      IPreferenceStore store = storeAccess.getWritablePreferenceStore();
-      store.setDefault(REMOVE_TRAILING_WHITESPACE, true);
-      store.setDefault(IN_ALL_LINES, false);
-      store.setDefault(IN_EDITED_LINES, true);
+  public static class Initializer extends DefaultPreservingInitializer {
+    @Override
+    public void setDefaults() {
+      setDefault(REMOVE_TRAILING_WHITESPACE, true);
+      setDefault(IN_ALL_LINES, false);
+      setDefault(IN_EDITED_LINES, true);
     }
   }
 }
\ No newline at end of file
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/GeneralPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/GeneralPreferencePage.java
index 26b211c..5b498c7 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/GeneralPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/GeneralPreferencePage.java
@@ -8,23 +8,35 @@
  */
 package com.google.eclipse.protobuf.ui.preferences.general;
 
+import static com.google.eclipse.protobuf.preferences.general.PreferenceNames.DESCRIPTOR_PROTO_PATH;
+import static com.google.eclipse.protobuf.preferences.general.PreferenceNames.ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME;
+import static com.google.eclipse.protobuf.preferences.general.PreferenceNames.VALIDATE_FILES_ON_ACTIVATION;
 import static com.google.eclipse.protobuf.ui.preferences.general.Messages.contentValidation;
+import static com.google.eclipse.protobuf.ui.preferences.general.Messages.errorCannotResolveOptionsDefinitionFile;
+import static com.google.eclipse.protobuf.ui.preferences.general.Messages.errorEmptyOptionsDefinitionFile;
+import static com.google.eclipse.protobuf.ui.preferences.general.Messages.optionsDefinitionFile;
 import static com.google.eclipse.protobuf.ui.preferences.general.Messages.validateFilesOnActivation;
-import static com.google.eclipse.protobuf.ui.preferences.general.PreferenceNames.ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME;
-import static com.google.eclipse.protobuf.ui.preferences.general.PreferenceNames.VALIDATE_FILES_ON_ACTIVATION;
 import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
+import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToTextValue.bindTextOf;
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
+import com.google.eclipse.protobuf.preferences.general.PreferenceNames;
+import com.google.eclipse.protobuf.scoping.IUriResolver;
+import com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceBinder;
+import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceFactory;
+import com.google.inject.Inject;
 
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Group;
 import org.eclipse.swt.widgets.Label;
-
-import com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage;
-import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceBinder;
-import com.google.eclipse.protobuf.ui.preferences.pages.binding.PreferenceFactory;
+import org.eclipse.swt.widgets.Text;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -35,6 +47,11 @@
   private Group grpValidation;
   private Button btnValidateOnActivation;
 
+  private Label lblDescriptorPath;
+  private Text txtDescriptorPath;
+
+  @Inject private IUriResolver resolver;
+
   @Override protected void doCreateContents(Composite parent) {
     grpValidation = new Group(parent, SWT.NONE);
     grpValidation.setLayout(new GridLayout(1, false));
@@ -44,6 +61,46 @@
     btnValidateOnActivation = new Button(grpValidation, SWT.CHECK);
     btnValidateOnActivation.setText(validateFilesOnActivation);
     new Label(parent, SWT.NONE);
+
+    lblDescriptorPath = new Label(parent, SWT.NONE);
+    lblDescriptorPath.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
+    lblDescriptorPath.setText(optionsDefinitionFile);
+
+    txtDescriptorPath = new Text(parent, SWT.BORDER);
+    txtDescriptorPath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
+
+    addEventListeners();
+  }
+
+  private void addEventListeners() {
+    txtDescriptorPath.addModifyListener(new ModifyListener() {
+      @Override
+      public void modifyText(ModifyEvent e) {
+        checkState();
+      }
+    });
+  }
+
+  private void checkState() {
+    String descriptorPathText = txtDescriptorPath.getText();
+    if (isEmpty(descriptorPathText)) {
+      pageIsNowInvalid(errorEmptyOptionsDefinitionFile);
+      return;
+    }
+
+    if (isPropertyPage() && !canResolve(descriptorPathText)) {
+      pageIsNowInvalid(errorCannotResolveOptionsDefinitionFile);
+      return;
+    }
+    pageIsNowValid();
+  }
+
+  // TODO(het): Resolve based on unsaved preferences, rather than saved preferences
+  private boolean canResolve(String descriptorPathText) {
+    if (PreferenceNames.DEFAULT_DESCRIPTOR_PATH.equals(descriptorPathText)) {
+      return true;
+    }
+    return resolver.resolveUri(descriptorPathText, null, project()) != null;
   }
 
   @Override protected String enableProjectSettingsPreferenceName() {
@@ -52,7 +109,8 @@
 
   @Override protected void setupBinding(PreferenceBinder binder, PreferenceFactory factory) {
     binder.addAll(
-        bindSelectionOf(btnValidateOnActivation).to(factory.newBooleanPreference(VALIDATE_FILES_ON_ACTIVATION))
+        bindSelectionOf(btnValidateOnActivation).to(factory.newBooleanPreference(VALIDATE_FILES_ON_ACTIVATION)),
+        bindTextOf(txtDescriptorPath).to(factory.newStringPreference(DESCRIPTOR_PROTO_PATH))
       );
   }
 
@@ -71,6 +129,7 @@
   private void enableProjectSpecificOptions(boolean enabled) {
     grpValidation.setEnabled(enabled);
     btnValidateOnActivation.setEnabled(enabled);
+    txtDescriptorPath.setEnabled(enabled);
   }
 
   @Override protected String preferencePageId() {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/GeneralPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/GeneralPreferences.java
deleted file mode 100644
index e3e4b9a..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/GeneralPreferences.java
+++ /dev/null
@@ -1,49 +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.preferences.general;
-
-import static com.google.eclipse.protobuf.ui.preferences.general.PreferenceNames.ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME;
-import static com.google.eclipse.protobuf.ui.preferences.general.PreferenceNames.VALIDATE_FILES_ON_ACTIVATION;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class GeneralPreferences {
-  private final IPreferenceStore store;
-
-  public static GeneralPreferences generalPreferences(IPreferenceStoreAccess storeAccess, IProject project) {
-    IPreferenceStore store = storeAccess.getWritablePreferenceStore(project);
-    boolean enableProjectSettings = store.getBoolean(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME);
-    if (!enableProjectSettings) {
-      store = storeAccess.getWritablePreferenceStore();
-    }
-    return new GeneralPreferences(store);
-  }
-
-  private GeneralPreferences(IPreferenceStore store) {
-    this.store = store;
-  }
-
-  public boolean shouldValidateFilesOnActivation() {
-    return store.getBoolean(VALIDATE_FILES_ON_ACTIVATION);
-  }
-
-  public static class Initializer implements IPreferenceStoreInitializer {
-    @Override public void initialize(IPreferenceStoreAccess storeAccess) {
-      IPreferenceStore store = storeAccess.getWritablePreferenceStore();
-      store.setDefault(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME, false);
-      store.setDefault(VALIDATE_FILES_ON_ACTIVATION, true);
-    }
-  }
-}
\ No newline at end of file
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/Messages.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/Messages.java
index 6685356..615d22c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/Messages.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/Messages.java
@@ -15,6 +15,9 @@
  */
 public class Messages extends NLS {
   public static String contentValidation;
+  public static String errorCannotResolveOptionsDefinitionFile;
+  public static String errorEmptyOptionsDefinitionFile;
+  public static String optionsDefinitionFile;
   public static String validateFilesOnActivation;
 
   static {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/Messages.properties b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/Messages.properties
index 35c51ce..045469a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/Messages.properties
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/Messages.properties
@@ -1,2 +1,11 @@
+# Copyright (c) 2014 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
 contentValidation=Content Validation
+errorCannotResolveOptionsDefinitionFile=Cannot find options definition file
+errorEmptyOptionsDefinitionFile=Must specify a path to the options definition file
+optionsDefinitionFile=Options definition file:
 validateFilesOnActivation=Validate files when activated in editor
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/PreferenceNames.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/PreferenceNames.java
deleted file mode 100644
index 2987ec4..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/general/PreferenceNames.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * 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.preferences.general;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- *
- */
-final class PreferenceNames {
-  static final String ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME = "general.enableProjectSettings";
-  static final String VALIDATE_FILES_ON_ACTIVATION = "general.validateFilesOnActivation";
-
-  private PreferenceNames() {}
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/LocationsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/LocationsPreferences.java
deleted file mode 100644
index 5f58ed7..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/LocationsPreferences.java
+++ /dev/null
@@ -1,62 +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.preferences.locations;
-
-import static com.google.eclipse.protobuf.ui.preferences.locations.DirectoryPath.parse;
-import static com.google.eclipse.protobuf.ui.preferences.locations.PreferenceNames.DIRECTORY_PATHS;
-import static com.google.eclipse.protobuf.ui.preferences.locations.PreferenceNames.FILES_IN_MULTIPLE_DIRECTORIES;
-import static com.google.eclipse.protobuf.ui.preferences.locations.PreferenceNames.FILES_IN_ONE_DIRECTORY_ONLY;
-import static com.google.eclipse.protobuf.ui.util.CommaSeparatedValues.splitCsv;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
-
-import com.google.common.base.Function;
-
-/**
- * "Locations" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
- *
- * @author alruiz@google.com (Alex Ruiz)
- */
-public class LocationsPreferences {
-  private final IProject project;
-  private final IPreferenceStore store;
-
-  public LocationsPreferences(IPreferenceStoreAccess storeAccess, IProject project) {
-    this.store = storeAccess.getWritablePreferenceStore(project);
-    this.project = project;
-  }
-
-  public boolean areFilesInMultipleDirectories() {
-    return store.getBoolean(FILES_IN_MULTIPLE_DIRECTORIES);
-  }
-
-  public <T> T applyToEachDirectoryPath(Function<DirectoryPath, T> function) {
-    String directoryPaths = store.getString(DIRECTORY_PATHS);
-    for (String s : splitCsv(directoryPaths)) {
-      DirectoryPath path = parse(s, project);
-      T value = function.apply(path);
-      if (value != null) {
-        return value;
-      }
-    }
-    return null;
-  }
-
-  public static class Initializer implements IPreferenceStoreInitializer {
-    @Override public void initialize(IPreferenceStoreAccess access) {
-      IPreferenceStore store = access.getWritablePreferenceStore();
-      store.setDefault(FILES_IN_ONE_DIRECTORY_ONLY, true);
-      store.setDefault(FILES_IN_MULTIPLE_DIRECTORIES, false);
-      store.setDefault(DIRECTORY_PATHS, "");
-    }
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/misc/MiscellaneousPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/misc/MiscellaneousPreferences.java
index eb2b5c8..e9c0fca 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/misc/MiscellaneousPreferences.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/misc/MiscellaneousPreferences.java
@@ -10,9 +10,10 @@
 
 import static com.google.eclipse.protobuf.ui.preferences.misc.PreferenceNames.IS_GOOGLE_INTERNAL;
 
+import com.google.eclipse.protobuf.preferences.DefaultPreservingInitializer;
+
 import org.eclipse.jface.preference.IPreferenceStore;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
 
 /**
  * "Miscellaneous" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
@@ -30,10 +31,10 @@
     return store.getBoolean(IS_GOOGLE_INTERNAL);
   }
 
-  public static class Initializer implements IPreferenceStoreInitializer {
-    @Override public void initialize(IPreferenceStoreAccess storeAccess) {
-      IPreferenceStore store = storeAccess.getWritablePreferenceStore();
-      store.setDefault(IS_GOOGLE_INTERNAL, false);
+  public static class Initializer extends DefaultPreservingInitializer {
+    @Override
+    public void setDefaults() {
+      setDefault(IS_GOOGLE_INTERNAL, false);
     }
   }
 }
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BooleanPreference.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BooleanPreference.java
index d852737..3c5f5a3 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BooleanPreference.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/pages/binding/BooleanPreference.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/AddDirectoryDialog.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java
similarity index 87%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/AddDirectoryDialog.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java
index 0ae3f38..7e7c6bb 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/AddDirectoryDialog.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/AddDirectoryDialog.java
@@ -6,18 +6,18 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.locations;
+package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import static org.eclipse.jface.dialogs.IDialogConstants.OK_ID;
 import static org.eclipse.xtext.util.Strings.isEmpty;
-import static com.google.eclipse.protobuf.ui.preferences.locations.DirectorySelectionDialogs.showFileSystemDirectorySelectionDialog;
-import static com.google.eclipse.protobuf.ui.preferences.locations.DirectorySelectionDialogs.showWorkspaceDirectorySelectionDialog;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.addDirectoryPath;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.browseFileSystem;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.browseWorkspace;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.directory;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.isWorkspacePathCheck;
 import static com.google.eclipse.protobuf.ui.preferences.pages.TextWidgets.setEditable;
+import static com.google.eclipse.protobuf.ui.preferences.paths.DirectorySelectionDialogs.showFileSystemDirectorySelectionDialog;
+import static com.google.eclipse.protobuf.ui.preferences.paths.DirectorySelectionDialogs.showWorkspaceDirectorySelectionDialog;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.addDirectoryPath;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.browseFileSystem;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.browseWorkspace;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.directory;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.isWorkspacePathCheck;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IPath;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/DirectoryPath.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath.java
similarity index 94%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/DirectoryPath.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath.java
index 975e790..e10a516 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/DirectoryPath.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPath.java
@@ -6,9 +6,9 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.locations;
+package com.google.eclipse.protobuf.ui.preferences.paths;
 
-import static com.google.eclipse.protobuf.ui.preferences.locations.ProjectVariable.replaceProjectVariableWithProjectName;
+import static com.google.eclipse.protobuf.ui.preferences.paths.ProjectVariable.replaceProjectVariableWithProjectName;
 import static com.google.eclipse.protobuf.ui.util.IPaths.directoryLocationInWorkspace;
 
 import java.util.regex.Matcher;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/DirectoryPathsEditor.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPathsEditor.java
similarity index 94%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/DirectoryPathsEditor.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPathsEditor.java
index 7cb3dcc..06c5248 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/DirectoryPathsEditor.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectoryPathsEditor.java
@@ -6,15 +6,15 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.locations;
+package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import static java.util.Collections.unmodifiableList;
 import static org.eclipse.jface.window.Window.OK;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.add;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.directories;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.down;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.remove;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.up;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.add;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.directories;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.down;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.remove;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.up;
 
 import java.util.Collection;
 import java.util.LinkedList;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/DirectorySelectionDialogs.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectorySelectionDialogs.java
similarity index 88%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/DirectorySelectionDialogs.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectorySelectionDialogs.java
index df8a323..af900d0 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/DirectorySelectionDialogs.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/DirectorySelectionDialogs.java
@@ -6,15 +6,15 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.locations;
+package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import static org.eclipse.core.runtime.Status.OK_STATUS;
 import static org.eclipse.jface.window.Window.OK;
 import static org.eclipse.ui.views.navigator.ResourceComparator.NAME;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.directorySelection;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.errorElementIsNotDirectory;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.selectFileSystemDirectory;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.selectWorkspaceDirectory;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.directorySelection;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.errorElementIsNotDirectory;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.selectFileSystemDirectory;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.selectWorkspaceDirectory;
 import static com.google.eclipse.protobuf.ui.util.IStatusFactory.error;
 import static com.google.eclipse.protobuf.util.Workspaces.workspaceRoot;
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/Messages.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Messages.java
similarity index 84%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/Messages.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Messages.java
index 30e5120..564b550 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/Messages.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Messages.java
@@ -1,12 +1,12 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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.locations;
+package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import org.eclipse.osgi.util.NLS;
 
@@ -18,16 +18,13 @@
   public static String addDirectoryPath;
   public static String browseFileSystem;
   public static String browseWorkspace;
-  public static String descriptorPath;
   public static String directories;
   public static String directory;
   public static String directorySelection;
   public static String down;
   public static String enterDirectoryName;
-  public static String errorCannotResolveOptionsDefinitionFile;
   public static String errorElementIsNotDirectory;
   public static String errorEmptyDirectoryName;
-  public static String errorEmptyOptionsDefinitionFile;
   public static String errorNoDirectoryNames;
   public static String filesInMultipleDirectories;
   public static String filesInOneDirectoryOnly;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/Messages.properties b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Messages.properties
similarity index 79%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/Messages.properties
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Messages.properties
index 6fb73bb..884dc80 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/Messages.properties
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/Messages.properties
@@ -1,17 +1,20 @@
+# Copyright (c) 2014 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
 add=&Add...
 addDirectoryPath=Add directory path
 browseFileSystem=File system...
 browseWorkspace=Workspace...
-descriptorPath=Options definition file:
 directories=Directories
 directory=Directory:
 directorySelection=Directory selection
 down=Move Down
 enterDirectoryName=Enter directory name:
-errorCannotResolveOptionsDefinitionFile=Cannot find options definition file
 errorElementIsNotDirectory=The selected element is not a directory.
 errorEmptyDirectoryName=The name of the directory should not be empty
-errorEmptyOptionsDefinitionFile=Must specify a path to the options definition file
 errorNoDirectoryNames=Enter the names of the directories
 filesInMultipleDirectories=Look for imported files in directories:
 filesInOneDirectoryOnly=One directory for all .proto files
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/LocationsPreferencePage.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
similarity index 68%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/LocationsPreferencePage.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
index 2dafd64..1a7a7b2 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/LocationsPreferencePage.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferencePage.java
@@ -1,30 +1,25 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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.locations;
+package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import static com.google.common.collect.Lists.newArrayList;
-import static com.google.eclipse.protobuf.preferences.descriptor.PreferenceNames.DESCRIPTOR_PROTO_PATH;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.descriptorPath;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.errorCannotResolveOptionsDefinitionFile;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.errorEmptyOptionsDefinitionFile;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.errorNoDirectoryNames;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.filesInMultipleDirectories;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.filesInOneDirectoryOnly;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.importedFilesPathResolution;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.rebuildProjectNow;
-import static com.google.eclipse.protobuf.ui.preferences.locations.Messages.settingsChanged;
-import static com.google.eclipse.protobuf.ui.preferences.locations.PreferenceNames.DIRECTORY_PATHS;
-import static com.google.eclipse.protobuf.ui.preferences.locations.PreferenceNames.FILES_IN_MULTIPLE_DIRECTORIES;
-import static com.google.eclipse.protobuf.ui.preferences.locations.PreferenceNames.FILES_IN_ONE_DIRECTORY_ONLY;
 import static com.google.eclipse.protobuf.ui.preferences.pages.ButtonGroup.with;
 import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToButtonSelection.bindSelectionOf;
-import static com.google.eclipse.protobuf.ui.preferences.pages.binding.BindingToTextValue.bindTextOf;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.errorNoDirectoryNames;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.filesInMultipleDirectories;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.filesInOneDirectoryOnly;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.importedFilesPathResolution;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.rebuildProjectNow;
+import static com.google.eclipse.protobuf.ui.preferences.paths.Messages.settingsChanged;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.DIRECTORY_PATHS;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.FILES_IN_MULTIPLE_DIRECTORIES;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.FILES_IN_ONE_DIRECTORY_ONLY;
 import static com.google.eclipse.protobuf.ui.util.IStatusFactory.error;
 import static java.util.Collections.unmodifiableList;
 import static org.eclipse.core.resources.IncrementalProjectBuilder.FULL_BUILD;
@@ -34,8 +29,6 @@
 import static org.eclipse.xtext.util.Strings.isEmpty;
 import static org.eclipse.xtext.util.Strings.split;
 
-import com.google.eclipse.protobuf.preferences.descriptor.PreferenceNames;
-import com.google.eclipse.protobuf.scoping.IUriResolver;
 import com.google.eclipse.protobuf.ui.preferences.pages.DataChangedListener;
 import com.google.eclipse.protobuf.ui.preferences.pages.PreferenceAndPropertyPage;
 import com.google.eclipse.protobuf.ui.preferences.pages.binding.Binding;
@@ -50,8 +43,6 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
@@ -59,9 +50,7 @@
 import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.MessageBox;
-import org.eclipse.swt.widgets.Text;
 import org.eclipse.xtext.ui.PluginImageHelper;
 
 import java.util.List;
@@ -71,21 +60,17 @@
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class LocationsPreferencePage extends PreferenceAndPropertyPage {
+public class PathsPreferencePage extends PreferenceAndPropertyPage {
   private static final String COMMA_DELIMITER = ",";
-  private static final String PREFERENCE_PAGE_ID = LocationsPreferencePage.class.getName();
+  private static final String PREFERENCE_PAGE_ID = PathsPreferencePage.class.getName();
 
   private Group grpResolutionOfImported;
   private Button btnOneDirectoryOnly;
   private Button btnMultipleDirectories;
   private DirectoryPathsEditor directoryPathsEditor;
 
-  private Label lblDescriptorPath;
-  private Text txtDescriptorPath;
-
   @Inject private PluginImageHelper imageHelper;
   @Inject private ValidationTrigger validation;
-  @Inject private IUriResolver resolver;
 
   private boolean stateChanged;
 
@@ -113,13 +98,6 @@
     directoryPathsEditor = new DirectoryPathsEditor(grpResolutionOfImported, project(), imageHelper);
     directoryPathsEditor.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 1, 1));
 
-    lblDescriptorPath = new Label(parent, SWT.NONE);
-    lblDescriptorPath.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1));
-    lblDescriptorPath.setText(descriptorPath);
-
-    txtDescriptorPath = new Text(parent, SWT.BORDER);
-    txtDescriptorPath.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
-
     addEventListeners();
   }
 
@@ -136,12 +114,6 @@
         checkState();
       }
     });
-    txtDescriptorPath.addModifyListener(new ModifyListener() {
-      @Override
-      public void modifyText(ModifyEvent e) {
-        checkState();
-      }
-    });
   }
 
   private void checkState() {
@@ -150,27 +122,9 @@
       pageIsNowInvalid(errorNoDirectoryNames);
       return;
     }
-    String descriptorPathText = txtDescriptorPath.getText();
-    if (isEmpty(descriptorPathText)) {
-      pageIsNowInvalid(errorEmptyOptionsDefinitionFile);
-      return;
-    }
-
-    if (!canResolve(descriptorPathText)) {
-      pageIsNowInvalid(errorCannotResolveOptionsDefinitionFile);
-      return;
-    }
     pageIsNowValid();
   }
 
-  // TODO(het): Resolve based on unsaved preferences, rather than saved preferences
-  private boolean canResolve(String descriptorPathText) {
-    if (PreferenceNames.DEFAULT_DESCRIPTOR_PATH.equals(descriptorPathText)) {
-      return true;
-    }
-    return resolver.resolveUri(descriptorPathText, null, project()) != null;
-  }
-
   @Override protected String enableProjectSettingsPreferenceName() {
     return null; // this page is always a "Project Properties" page
   }
@@ -194,10 +148,6 @@
         directoryPaths.updateValue(directoryNames());
       }
     });
-    // Need to bind the descriptor path after the directory paths so that the directory paths
-    // are loaded before validation of the form is attempted.
-    binder.add(
-        bindTextOf(txtDescriptorPath).to(factory.newStringPreference(DESCRIPTOR_PROTO_PATH)));
   }
 
   private String directoryNames() {
@@ -233,7 +183,6 @@
     btnOneDirectoryOnly.setEnabled(enabled);
     btnMultipleDirectories.setEnabled(enabled);
     directoryPathsEditor.setEnabled(btnMultipleDirectories.getSelection() && enabled);
-    txtDescriptorPath.setEnabled(enabled);
   }
 
   @Override protected String preferencePageId() {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
new file mode 100644
index 0000000..f180516
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PathsPreferences.java
@@ -0,0 +1,62 @@
+/*
+ * 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.paths;
+
+import static com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPath.parse;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.DIRECTORY_PATHS;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.FILES_IN_MULTIPLE_DIRECTORIES;
+import static com.google.eclipse.protobuf.ui.preferences.paths.PreferenceNames.FILES_IN_ONE_DIRECTORY_ONLY;
+import static com.google.eclipse.protobuf.ui.util.CommaSeparatedValues.splitCsv;
+
+import com.google.common.base.Function;
+import com.google.eclipse.protobuf.preferences.DefaultPreservingInitializer;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+/**
+ * "Locations" preferences, retrieved from an <code>{@link IPreferenceStore}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class PathsPreferences {
+  private final IProject project;
+  private final IPreferenceStore store;
+
+  public PathsPreferences(IPreferenceStoreAccess storeAccess, IProject project) {
+    this.store = storeAccess.getWritablePreferenceStore(project);
+    this.project = project;
+  }
+
+  public boolean areFilesInMultipleDirectories() {
+    return store.getBoolean(FILES_IN_MULTIPLE_DIRECTORIES);
+  }
+
+  public <T> T applyToEachDirectoryPath(Function<DirectoryPath, T> function) {
+    String directoryPaths = store.getString(DIRECTORY_PATHS);
+    for (String s : splitCsv(directoryPaths)) {
+      DirectoryPath path = parse(s, project);
+      T value = function.apply(path);
+      if (value != null) {
+        return value;
+      }
+    }
+    return null;
+  }
+
+  public static class Initializer extends DefaultPreservingInitializer {
+    @Override
+    public void setDefaults() {
+      setDefault(FILES_IN_ONE_DIRECTORY_ONLY, true);
+      setDefault(FILES_IN_MULTIPLE_DIRECTORIES, false);
+      setDefault(DIRECTORY_PATHS, "");
+    }
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/PreferenceNames.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceNames.java
similarity index 90%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/PreferenceNames.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceNames.java
index 5c84e50..c56c0f3 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/PreferenceNames.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/PreferenceNames.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.locations;
+package com.google.eclipse.protobuf.ui.preferences.paths;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/ProjectVariable.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/ProjectVariable.java
similarity index 95%
rename from com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/ProjectVariable.java
rename to com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/ProjectVariable.java
index fd8720a..5fa2383 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/locations/ProjectVariable.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/preferences/paths/ProjectVariable.java
@@ -6,7 +6,7 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.ui.preferences.locations;
+package com.google.eclipse.protobuf.ui.preferences.paths;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IPath;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/command/ImportRootsProtocOption.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/command/ImportRootsProtocOption.java
index 1761612..205c5e9 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/command/ImportRootsProtocOption.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/command/ImportRootsProtocOption.java
@@ -21,19 +21,19 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
-import com.google.eclipse.protobuf.ui.preferences.locations.DirectoryPath;
-import com.google.eclipse.protobuf.ui.preferences.locations.LocationsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPath;
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
  */
 class ImportRootsProtocOption {
-  private final LocationsPreferences preferences;
+  private final PathsPreferences preferences;
 
   private boolean initialized;
   private List<String> importRoots;
 
-  ImportRootsProtocOption(LocationsPreferences preferences) {
+  ImportRootsProtocOption(PathsPreferences preferences) {
     this.preferences = preferences;
   }
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/command/ProtocCommandBuilder.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/command/ProtocCommandBuilder.java
index 8f92ff2..da8c1ab 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/command/ProtocCommandBuilder.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/protoc/command/ProtocCommandBuilder.java
@@ -18,7 +18,7 @@
 import org.eclipse.core.runtime.CoreException;
 
 import com.google.eclipse.protobuf.ui.preferences.compiler.CompilerPreferences;
-import com.google.eclipse.protobuf.ui.preferences.locations.LocationsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
 
 /**
  * Builds the command to call protoc to compile a single .proto file.
@@ -31,7 +31,7 @@
   private final String protocPath;
   private final ImportRootsProtocOption importRootsProtocOption;
 
-  public ProtocCommandBuilder(CompilerPreferences compilerPreferences, LocationsPreferences pathsPreferences) {
+  public ProtocCommandBuilder(CompilerPreferences compilerPreferences, PathsPreferences pathsPreferences) {
     protocPath = compilerPreferences.protocPath();
     options.add(new DescriptorPathProtocOption(compilerPreferences));
     options.add(new CodeGenerationProtocOption("java_out", compilerPreferences.javaCodeGeneration()));
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ImportResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ImportResolver.java
index 7773810..c00c3b1 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ImportResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ImportResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesUriResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesUriResolver.java
index c836a97..421b4fd 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesUriResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/MultipleDirectoriesUriResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
@@ -11,8 +11,8 @@
 import static com.google.common.collect.Lists.newArrayList;
 
 import com.google.common.base.Function;
-import com.google.eclipse.protobuf.ui.preferences.locations.DirectoryPath;
-import com.google.eclipse.protobuf.ui.preferences.locations.LocationsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPath;
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
 import com.google.inject.Inject;
 
 import java.util.List;
@@ -24,8 +24,8 @@
   @Inject private UriResolverHelper uriResolver;
   @Inject private ResourceLocations locations;
 
-  public String resolveUri(String importUri, Iterable<LocationsPreferences> allPathPreferences) {
-    for (LocationsPreferences preferences : allPathPreferences) {
+  public String resolveUri(String importUri, Iterable<PathsPreferences> allPathPreferences) {
+    for (PathsPreferences preferences : allPathPreferences) {
       String resolved = resolveUri(importUri, preferences);
       if (resolved != null) {
         return resolved;
@@ -34,7 +34,7 @@
     return null;
   }
 
-  private String resolveUri(final String importUri, LocationsPreferences preferences) {
+  private String resolveUri(final String importUri, PathsPreferences preferences) {
     final List<String> unresolvedWorkspacePaths = newArrayList();
     String resolved = preferences.applyToEachDirectoryPath(new Function<DirectoryPath, String>() {
       @Override public String apply(DirectoryPath path) {
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ResourceLocations.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ResourceLocations.java
index 7b63fcf..afc042f 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ResourceLocations.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/ResourceLocations.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver.java
index e8f4b7e..b7a9cb5 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/SingleDirectoryUriResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/UriResolver.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/UriResolver.java
index 26dbfa9..eb4559a 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/UriResolver.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/UriResolver.java
@@ -13,7 +13,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.eclipse.protobuf.scoping.IUriResolver;
-import com.google.eclipse.protobuf.ui.preferences.locations.LocationsPreferences;
+import com.google.eclipse.protobuf.ui.preferences.paths.PathsPreferences;
 import com.google.inject.Inject;
 
 import org.eclipse.core.resources.IProject;
@@ -42,21 +42,21 @@
     if (project == null) {
       return multipleDirectories.resolveUri(importUri, preferencesFromAllProjects());
     }
-    LocationsPreferences locations = new LocationsPreferences(storeAccess, project);
+    PathsPreferences locations = new PathsPreferences(storeAccess, project);
     if (locations.areFilesInMultipleDirectories()) {
       return multipleDirectories.resolveUri(importUri, ImmutableList.of(locations));
     }
     return singleDirectory.resolveUri(importUri, declaringResourceUri);
   }
 
-  private Iterable<LocationsPreferences> preferencesFromAllProjects() {
-    List<LocationsPreferences> allPreferences = new ArrayList<>();
+  private Iterable<PathsPreferences> preferencesFromAllProjects() {
+    List<PathsPreferences> allPreferences = new ArrayList<>();
     IWorkspaceRoot root = workspaceRoot();
     for (IProject project : root.getProjects()) {
       if (project.isHidden() || !project.isAccessible() || !XtextProjectHelper.hasNature(project)) {
         continue;
       }
-      LocationsPreferences preferences = new LocationsPreferences(storeAccess, project);
+      PathsPreferences preferences = new PathsPreferences(storeAccess, project);
       allPreferences.add(preferences);
     }
     return unmodifiableList(allPreferences);
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/UriResolverHelper.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/UriResolverHelper.java
index 4e0347d..3fe806c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/UriResolverHelper.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/scoping/UriResolverHelper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2014 Google Inc.
+ * 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
@@ -13,7 +13,7 @@
 
 import org.eclipse.emf.common.util.URI;
 
-import com.google.eclipse.protobuf.ui.preferences.locations.DirectoryPath;
+import com.google.eclipse.protobuf.ui.preferences.paths.DirectoryPath;
 import com.google.eclipse.protobuf.util.Uris;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java
index 9f97de0..55f2941 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/ValidateFileOnActivation.java
@@ -9,19 +9,18 @@
  */
 package com.google.eclipse.protobuf.ui.validation;
 
-import static com.google.eclipse.protobuf.ui.preferences.general.GeneralPreferences.generalPreferences;
 import static com.google.eclipse.protobuf.ui.validation.ProtobufValidation.validate;
 
+import com.google.eclipse.protobuf.preferences.general.GeneralPreferences;
+import com.google.eclipse.protobuf.ui.plugin.ProtobufEditorPlugIn;
+import com.google.eclipse.protobuf.ui.util.Editors;
+
 import org.eclipse.core.resources.IProject;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchPartReference;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
-import com.google.eclipse.protobuf.ui.plugin.ProtobufEditorPlugIn;
-import com.google.eclipse.protobuf.ui.preferences.general.GeneralPreferences;
-import com.google.eclipse.protobuf.ui.util.Editors;
-
 /**
  * Validates a .proto file when it is opened or activated.
  *
@@ -53,7 +52,7 @@
 
   private boolean shouldValidateEditor(IProject project) {
     IPreferenceStoreAccess storeAccess = ProtobufEditorPlugIn.getInstanceOf(IPreferenceStoreAccess.class);
-    GeneralPreferences preferences = generalPreferences(storeAccess, project);
+    GeneralPreferences preferences = new GeneralPreferences(storeAccess, project);
     return preferences.shouldValidateFilesOnActivation();
   }
 }
diff --git a/com.google.eclipse.protobuf/META-INF/MANIFEST.MF b/com.google.eclipse.protobuf/META-INF/MANIFEST.MF
index 3c426bb..e38e4d1 100644
--- a/com.google.eclipse.protobuf/META-INF/MANIFEST.MF
+++ b/com.google.eclipse.protobuf/META-INF/MANIFEST.MF
@@ -28,7 +28,8 @@
  com.google.eclipse.protobuf.parser,

  com.google.eclipse.protobuf.parser.antlr,

  com.google.eclipse.protobuf.parser.antlr.internal,

- com.google.eclipse.protobuf.preferences.descriptor,

+ com.google.eclipse.protobuf.preferences,

+ com.google.eclipse.protobuf.preferences.general,

  com.google.eclipse.protobuf.protobuf,

  com.google.eclipse.protobuf.protobuf.impl,

  com.google.eclipse.protobuf.protobuf.util,

diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java
index 066612a..9c0fa64 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/model/util/Imports.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/DefaultPreservingInitializer.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/DefaultPreservingInitializer.java
new file mode 100644
index 0000000..ca3ac47
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/DefaultPreservingInitializer.java
@@ -0,0 +1,89 @@
+/*
+ * Copyright (c) 2014 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.preferences;
+
+import com.google.inject.Inject;
+import com.google.inject.name.Named;
+
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.Constants;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
+import org.osgi.service.prefs.BackingStoreException;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ * A preference store initializer that does not overwrite defaults that have already been set.
+ */
+public abstract class DefaultPreservingInitializer implements IPreferenceStoreInitializer {
+  @Inject
+  @Named(Constants.LANGUAGE_NAME)
+  private String preferenceScope;
+
+  private IPreferenceStore store;
+  private Set<String> alreadySetDefaults = new HashSet<>();
+
+  private static Logger LOG = Logger.getLogger(DefaultPreservingInitializer.class.getName());
+
+  @Override
+  public final void initialize(IPreferenceStoreAccess access) {
+    this.store = access.getWritablePreferenceStore();
+    try {
+      for (String key : DefaultScope.INSTANCE.getNode(preferenceScope).keys()) {
+        alreadySetDefaults.add(key);
+      }
+    } catch (BackingStoreException e) {
+      LOG.log(Level.SEVERE, "Unable to get already set defaults for " + preferenceScope, e);
+    }
+    setDefaults();
+  }
+
+  public abstract void setDefaults();
+
+  public void setDefault(String preference, double value) {
+    if (!alreadySetDefaults.contains(preference)) {
+      store.setDefault(preference, value);
+    }
+  }
+
+  public void setDefault(String preference, float value) {
+    if (!alreadySetDefaults.contains(preference)) {
+      store.setDefault(preference, value);
+    }
+  }
+
+  public void setDefault(String preference, int value) {
+    if (!alreadySetDefaults.contains(preference)) {
+      store.setDefault(preference, value);
+    }
+  }
+
+  public void setDefault(String preference, long value) {
+    if (!alreadySetDefaults.contains(preference)) {
+      store.setDefault(preference, value);
+    }
+  }
+
+  public void setDefault(String preference, String value) {
+    if (!alreadySetDefaults.contains(preference)) {
+      store.setDefault(preference, value);
+    }
+  }
+
+  public void setDefault(String preference, boolean value) {
+    if (!alreadySetDefaults.contains(preference)) {
+      store.setDefault(preference, value);
+    }
+  }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/descriptor/DescriptorPreferences.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/descriptor/DescriptorPreferences.java
deleted file mode 100644
index 8178915..0000000
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/descriptor/DescriptorPreferences.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2014 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.preferences.descriptor;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
-import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreInitializer;
-
-/**
- * Preferences for project-level descriptor proto.
- */
-public class DescriptorPreferences {
-  private final IPreferenceStore store;
-
-  public DescriptorPreferences(IPreferenceStoreAccess storeAccess, IProject project) {
-    this.store = storeAccess.getWritablePreferenceStore(project);
-  }
-
-  public String getDescriptorProtoPath() {
-    return store.getString(PreferenceNames.DESCRIPTOR_PROTO_PATH);
-  }
-
-  public static class Initializer implements IPreferenceStoreInitializer {
-    @Override public void initialize(IPreferenceStoreAccess access) {
-      IPreferenceStore store = access.getWritablePreferenceStore();
-      store.setDefault(PreferenceNames.DESCRIPTOR_PROTO_PATH,
-          PreferenceNames.DEFAULT_DESCRIPTOR_PATH);
-    }
-  }
-}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/general/GeneralPreferences.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/general/GeneralPreferences.java
new file mode 100644
index 0000000..bfabcd4
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/general/GeneralPreferences.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.preferences.general;
+
+import static com.google.eclipse.protobuf.preferences.general.PreferenceNames.ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME;
+import static com.google.eclipse.protobuf.preferences.general.PreferenceNames.VALIDATE_FILES_ON_ACTIVATION;
+
+import com.google.eclipse.protobuf.preferences.DefaultPreservingInitializer;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.preference.IPreferenceStore;
+import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class GeneralPreferences {
+  private final IPreferenceStore store;
+
+  public GeneralPreferences(IPreferenceStoreAccess storeAccess, IProject project) {
+    IPreferenceStore preferenceStore = storeAccess.getWritablePreferenceStore(project);
+    boolean enableProjectSettings =
+        preferenceStore.getBoolean(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME);
+    if (!enableProjectSettings) {
+      preferenceStore = storeAccess.getWritablePreferenceStore();
+    }
+    this.store = preferenceStore;
+  }
+
+  public boolean shouldValidateFilesOnActivation() {
+    return store.getBoolean(VALIDATE_FILES_ON_ACTIVATION);
+  }
+
+  public String getDescriptorProtoPath() {
+    return store.getString(PreferenceNames.DESCRIPTOR_PROTO_PATH);
+  }
+
+  public static class Initializer extends DefaultPreservingInitializer {
+    @Override
+    public void setDefaults() {
+      setDefault(ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME, false);
+      setDefault(VALIDATE_FILES_ON_ACTIVATION, true);
+      setDefault(PreferenceNames.DESCRIPTOR_PROTO_PATH, PreferenceNames.DEFAULT_DESCRIPTOR_PATH);
+    }
+  }
+}
\ No newline at end of file
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/descriptor/PreferenceNames.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/general/PreferenceNames.java
similarity index 60%
rename from com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/descriptor/PreferenceNames.java
rename to com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/general/PreferenceNames.java
index 49c5aaa..0d75034 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/descriptor/PreferenceNames.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/preferences/general/PreferenceNames.java
@@ -6,14 +6,17 @@
  *
  * http://www.eclipse.org/legal/epl-v10.html
  */
-package com.google.eclipse.protobuf.preferences.descriptor;
+package com.google.eclipse.protobuf.preferences.general;
 
 /**
  * Preference names for descriptor proto preferences.
  */
 public final class PreferenceNames {
   public static final String DEFAULT_DESCRIPTOR_PATH = "google/protobuf/descriptor.proto";
-  public static final String DESCRIPTOR_PROTO_PATH = "descriptor.path";
+  public static final String DESCRIPTOR_PROTO_PATH = "general.descriptorPath";
+  public static final String ENABLE_PROJECT_SETTINGS_PREFERENCE_NAME =
+      "general.enableProjectSettings";
+  public static final String VALIDATE_FILES_ON_ACTIVATION = "general.validateFilesOnActivation";
 
   private PreferenceNames() {}
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
index a43806d..28a31a6 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ComplexTypeFinderStrategy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IImportResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IImportResolver.java
index 5866eab..6a73dc3 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IImportResolver.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IImportResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IUriResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IUriResolver.java
index 1ecfb83..b344e77 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IUriResolver.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/IUriResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NativeOptionDescriptions.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NativeOptionDescriptions.java
index 828144b..174445f 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NativeOptionDescriptions.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/NativeOptionDescriptions.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OptionType.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OptionType.java
index 8737101..2d773c9 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OptionType.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/OptionType.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java
index 43772f2..85b6346 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtoDescriptorProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
@@ -8,15 +8,15 @@
  */
 package com.google.eclipse.protobuf.scoping;
 
-import static com.google.eclipse.protobuf.preferences.descriptor.PreferenceNames.DESCRIPTOR_PROTO_PATH;
+import static com.google.eclipse.protobuf.preferences.general.PreferenceNames.DESCRIPTOR_PROTO_PATH;
 
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
 import com.google.common.collect.ImmutableList;
 import com.google.eclipse.protobuf.model.util.INodes;
-import com.google.eclipse.protobuf.preferences.descriptor.DescriptorPreferences;
-import com.google.eclipse.protobuf.preferences.descriptor.PreferenceNames;
+import com.google.eclipse.protobuf.preferences.general.GeneralPreferences;
+import com.google.eclipse.protobuf.preferences.general.PreferenceNames;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 
@@ -126,7 +126,7 @@
         new LinkedHashMap<String, ProtoDescriptorProvider.ProtoDescriptorInfo>();
 
     // Add descriptor.proto from preferences
-    DescriptorPreferences preferences = new DescriptorPreferences(storeAccess, project);
+    GeneralPreferences preferences = new GeneralPreferences(storeAccess, project);
     String descriptorProtoUri = preferences.getDescriptorProtoPath();
     if (!PreferenceNames.DEFAULT_DESCRIPTOR_PATH.equals(descriptorProtoUri)) {
       URI descriptorProtoLocation =
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
index f6b4222..b3dfcec 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriResolver.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
index 6453cb6..b71ed89 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufScopeProvider.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2014 Google Inc.
+ * 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