diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOpener.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOpener.java
index af68bd5..f45cb2c 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOpener.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/FileOpener.java
@@ -10,6 +10,9 @@
 
 import static com.google.eclipse.protobuf.ui.util.Workbenches.activeWorkbenchPage;
 
+import com.google.eclipse.protobuf.ui.util.Uris;
+import com.google.inject.*;
+
 import org.eclipse.core.filesystem.*;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.Path;
@@ -18,9 +21,6 @@
 import org.eclipse.ui.ide.FileStoreEditorInput;
 import org.eclipse.ui.part.FileEditorInput;
 
-import com.google.eclipse.protobuf.ui.util.Uris;
-import com.google.inject.*;
-
 /**
  * Utility methods related to open file from different type of locations.
  *
@@ -30,24 +30,35 @@
   @Inject private Uris uris;
 
   public IEditorPart openProtoFileInWorkspace(URI uri) throws PartInitException {
+    IWorkbenchPage page = activeWorkbenchPage();
+    if (page == null) {
+      return null;
+    }
     IFile file = uris.referredFile(uri);
     IEditorInput editorInput = new FileEditorInput(file);
-    return openFile(editorInput);
+    return openFile(editorInput, page);
   }
 
   public IEditorPart openProtoFileInFileSystem(URI uri) throws PartInitException {
+    IWorkbenchPage page = activeWorkbenchPage();
+    if (page == null) {
+      return null;
+    }
     IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(uri.toFileString()));
     IEditorInput editorInput = new FileStoreEditorInput(fileStore);
-    return openFile(editorInput/* "org.eclipse.ui.DefaultTextEditor" */);
+    return openFile(editorInput, page);
   }
 
   public IEditorPart openProtoFileInPlugin(URI uri) throws PartInitException {
+    IWorkbenchPage page = activeWorkbenchPage();
+    if (page == null) {
+      return null;
+    }
     IEditorInput editorInput = new UriEditorInput(uri);
-    return openFile(editorInput);
+    return openFile(editorInput, page);
   }
 
-  private IEditorPart openFile(IEditorInput editorInput) throws PartInitException {
-    IWorkbenchPage page = activeWorkbenchPage();
+  private IEditorPart openFile(IEditorInput editorInput, IWorkbenchPage page) throws PartInitException {
     return page.openEditor(editorInput, "com.google.eclipse.protobuf.Protobuf");
   }
 
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/DocumentContentsFactoryRegistry.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/DocumentContentsFactoryRegistry.java
deleted file mode 100644
index afb9873..0000000
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/DocumentContentsFactoryRegistry.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2011 Google Inc.
- *
- * All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse
- * Public License v1.0 which accompanies this distribution, and is available at
- *
- * http://www.eclipse.org/legal/epl-v10.html
- */
-package com.google.eclipse.protobuf.ui.editor.model;
-
-import java.util.List;
-
-import org.eclipse.ui.IEditorInput;
-
-import com.google.common.collect.Lists;
-import com.google.inject.Inject;
-
-/**
- * @author alruiz@google.com (Alex Ruiz)
- */
-class DocumentContentsFactoryRegistry {
-  private final List<DocumentContentsFactory> factories;
-
-  @Inject
-  DocumentContentsFactoryRegistry(FileStoreDocumentContentsFactory f1, UriDocumentContentsFactory f2) {
-    factories = Lists.newArrayList(f1, f2);
-  }
-
-  DocumentContentsFactory findFactory(Object element) {
-    if (element instanceof IEditorInput) {
-      IEditorInput input = (IEditorInput) element;
-      for (DocumentContentsFactory factory : factories) {
-        if (factory.supportsEditorInputType(input)) {
-          return factory;
-        }
-      }
-    }
-    return null;
-  }
-}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
index a32555e..d6ffe95 100644
--- a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/editor/model/ProtobufDocumentProvider.java
@@ -9,12 +9,17 @@
  */
 package com.google.eclipse.protobuf.ui.editor.model;
 
+import static com.google.common.collect.Lists.newArrayList;
 import static com.google.eclipse.protobuf.ui.exception.CoreExceptions.error;
 import static com.google.eclipse.protobuf.util.Encodings.UTF_8;
 import static org.eclipse.core.filebuffers.FileBuffers.getTextFileBufferManager;
 import static org.eclipse.core.filebuffers.LocationKind.*;
 import static org.eclipse.text.undo.DocumentUndoManagerRegistry.getDocumentUndoManager;
 
+import com.google.eclipse.protobuf.ui.preferences.editor.save.core.SaveActionsPreferences;
+import com.google.eclipse.protobuf.ui.util.editor.ChangedLineRegionCalculator;
+import com.google.inject.Inject;
+
 import org.eclipse.core.filebuffers.*;
 import org.eclipse.core.runtime.*;
 import org.eclipse.jface.text.*;
@@ -25,9 +30,7 @@
 import org.eclipse.xtext.ui.editor.model.*;
 import org.eclipse.xtext.ui.editor.preferences.IPreferenceStoreAccess;
 
-import com.google.eclipse.protobuf.ui.preferences.editor.save.core.SaveActionsPreferences;
-import com.google.eclipse.protobuf.ui.util.editor.ChangedLineRegionCalculator;
-import com.google.inject.Inject;
+import java.util.List;
 
 /**
  * @author alruiz@google.com (Alex Ruiz)
@@ -36,12 +39,17 @@
   private static final IRegion[] NO_CHANGE = new IRegion[0];
 
   @Inject private ChangedLineRegionCalculator calculator;
-  @Inject private DocumentContentsFactoryRegistry documentContentsFactories;
   @Inject private IPreferenceStoreAccess storeAccess;
   @Inject private SaveActions saveActions;
 
+  private final List<DocumentContentsFactory> documentFactories;
+
+  @Inject public ProtobufDocumentProvider(FileStoreDocumentContentsFactory f1, UriDocumentContentsFactory f2) {
+    documentFactories = newArrayList(f1, f2);
+  }
+
   @Override protected ElementInfo createElementInfo(Object element) throws CoreException {
-    if (documentContentsFactories.findFactory(element) != null) {
+    if (findDocumentFactory(element) != null) {
       return createElementInfo((IEditorInput) element);
     }
     return super.createElementInfo(element);
@@ -67,13 +75,24 @@
   }
 
   @Override protected IDocument createDocument(Object element) throws CoreException {
-    DocumentContentsFactory factory = documentContentsFactories.findFactory(element);
+    DocumentContentsFactory factory = findDocumentFactory(element);
     if (factory != null) {
       return createDocument(factory, element);
     }
     return super.createDocument(element);
   }
 
+  private DocumentContentsFactory findDocumentFactory(Object element) {
+    if (element instanceof IEditorInput) {
+      IEditorInput input = (IEditorInput) element;
+      for (DocumentContentsFactory factory : documentFactories) {
+        if (factory.supportsEditorInputType(input)) {
+          return factory;
+        }
+      }
+    }
+    return null;
+  }
   private IDocument createDocument(DocumentContentsFactory contentsFactory, Object element) throws CoreException {
     XtextDocument document = createEmptyDocument();
     contentsFactory.createContents(document, element);
