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 fc3dad8..7576d91 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
@@ -39,6 +39,7 @@
 public class ProtobufDocumentProvider extends XtextDocumentProvider {
 
   private static final String ENCODING = "UTF-8";
+  private static final String FILE_SCHEME = "file";
   
   @Inject private Closeables closeables;
   @Inject private IssueResolutionProvider issueResolutionProvider;
@@ -46,36 +47,37 @@
   @Inject private IResourceValidator resourceValidator;
   
   @Override protected ElementInfo createElementInfo(Object element) throws CoreException {
-    if (element instanceof FileStoreEditorInput) {
-      FileStoreEditorInput input = (FileStoreEditorInput) element;
-      IDocument document = null;
-      IStatus status = null;
-      try {
-        document = createDocument(element);
-      } catch (CoreException e) {
-        handleCoreException(e, "ProtobufDocumentProvider.createElementInfo");
-        document = createEmptyDocument();
-        status = e.getStatus();
-      }
-      IFileStore store = EFS.getLocalFileSystem().getStore(fileFrom(input).toURI());
-      IFileInfo fileInfo = store.fetchInfo();
-      IAnnotationModel model = createAnnotationModel(element);
-      // new FileSynchronizer(input).install();
-      FileInfo info = new FileInfo(document, model, null);
-      info.fModificationStamp = fileInfo.getLastModified();
-      info.fStatus = status;
-      info.fEncoding = ENCODING;
-      cacheEncodingState(element);
-      XtextDocument xtextDocument = (XtextDocument) document;
-      AnnotationIssueProcessor annotationIssueProcessor = new AnnotationIssueProcessor(xtextDocument, model,
-          issueResolutionProvider);
-      ValidationJob job = new ValidationJob(resourceValidator, xtextDocument, annotationIssueProcessor, FAST_ONLY);
-      xtextDocument.setValidationJob(job);
-      return info;
-    }
+    if (element instanceof FileStoreEditorInput) return createElementInfo((FileStoreEditorInput) element);
     return super.createElementInfo(element);
   }
 
+  private ElementInfo createElementInfo(FileStoreEditorInput input) throws CoreException {
+    IDocument document = null;
+    IStatus status = null;
+    try {
+      document = createDocument(input);
+    } catch (CoreException e) {
+      handleCoreException(e, "ProtobufDocumentProvider.createElementInfo");
+      document = createEmptyDocument();
+      status = e.getStatus();
+    }
+    IFileStore store = EFS.getLocalFileSystem().getStore(fileFrom(input).toURI());
+    IFileInfo fileInfo = store.fetchInfo();
+    IAnnotationModel model = createAnnotationModel(input);
+    // new FileSynchronizer(input).install();
+    FileInfo info = new FileInfo(document, model, null);
+    info.fModificationStamp = fileInfo.getLastModified();
+    info.fStatus = status;
+    info.fEncoding = ENCODING;
+    cacheEncodingState(input);
+    XtextDocument xtextDocument = (XtextDocument) document;
+    AnnotationIssueProcessor annotationIssueProcessor = new AnnotationIssueProcessor(xtextDocument, model,
+        issueResolutionProvider);
+    ValidationJob job = new ValidationJob(resourceValidator, xtextDocument, annotationIssueProcessor, FAST_ONLY);
+    xtextDocument.setValidationJob(job);
+    return info;
+  }
+
   /** {@inheritDoc} */
   @Override protected IDocument createDocument(Object element) throws CoreException {
     if (element instanceof FileStoreEditorInput) {
@@ -86,13 +88,14 @@
       try {
         String contents = contentsOf(file);
         document.set(contents);
-        IParseResult result = parser.parse(new InputStreamReader(new StringInputStream(contents), ENCODING));
+        IParseResult result = parser.parse(readerFor(new StringInputStream(contents)));
         resource.getContents().add(result.getRootASTElement());
         document.setInput(resource);
         return document;
       } catch (Throwable t) {
-        if (t instanceof CoreException) throw (CoreException) t;
-        throw wrapWithCoreException(t);
+        String message = t.getMessage();
+        if (message == null) message = "";
+        throw new CoreException(new Status(ERROR, PLUGIN_ID, message, t));
       }
     }
     return super.createDocument(element);
@@ -101,19 +104,19 @@
   private File fileFrom(IURIEditorInput input) {
     URI uri = input.getURI();
     String scheme = uri.getScheme();
-    if (scheme != "file") {
-      String cleanUri = uri.toString().replaceFirst(scheme, "file");
+    if (scheme != FILE_SCHEME) {
+      String cleanUri = uri.toString().replaceFirst(scheme, FILE_SCHEME);
       uri = URI.create(cleanUri);
     }
     return new File(uri);
   }
 
-  private String contentsOf(File file) throws CoreException {
+  private String contentsOf(File file) throws IOException {
     Reader reader = null;
-    InputStream contentStream = null;
+    InputStream inputStream = null;
     try {
-      contentStream = new FileInputStream(file);
-      reader = new BufferedReader(new InputStreamReader(contentStream, ENCODING), DEFAULT_FILE_SIZE);
+      inputStream = new FileInputStream(file);
+      reader = new BufferedReader(readerFor(inputStream), DEFAULT_FILE_SIZE);
       StringBuilder contents = new StringBuilder(DEFAULT_FILE_SIZE);
       char[] buffer = new char[2048];
       int character = reader.read(buffer);
@@ -122,19 +125,12 @@
         character = reader.read(buffer);
       }
       return contents.toString();
-    } catch (IOException e) {
-      throw wrapWithCoreException(e);
     } finally {
-      if (!closeables.close(reader)) closeables.close(contentStream);
+      if (!closeables.close(reader)) closeables.close(inputStream);
     }
   }
   
-  private CoreException wrapWithCoreException(Throwable cause) {
-    return new CoreException(new Status(ERROR, PLUGIN_ID, messageOf(cause), cause));
-  }
-  
-  private String messageOf(Throwable t) {
-    String message = t.getMessage();
-    return (message != null) ? message : "";
+  private Reader readerFor(InputStream inputStream) throws IOException {
+    return new InputStreamReader(inputStream, ENCODING);
   }
 }
