diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Imports.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Imports.java
new file mode 100644
index 0000000..0debb18
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/util/Imports.java
@@ -0,0 +1,41 @@
+/*
+ * 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.util;
+
+import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__IMPORT_URI;
+
+import org.eclipse.xtext.nodemodel.INode;
+
+import com.google.eclipse.protobuf.conversion.STRINGValueConverter;
+import com.google.eclipse.protobuf.model.util.INodes;
+import com.google.eclipse.protobuf.protobuf.Import;
+import com.google.inject.Inject;
+
+/**
+ * Utility methods related to <code>{@link Import}</code>s.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public class Imports {
+  @Inject private INodes nodes;
+  @Inject private STRINGValueConverter stringValueConverter;
+
+  public String uriAsEnteredByUser(Import anImport) {
+    INode node = nodes.firstNodeForFeature(anImport, IMPORT__IMPORT_URI);
+    if (node == null) {
+      return null;
+    }
+    String text = node.getText();
+    if (text == null) {
+      return null;
+    }
+    return stringValueConverter.toValue(text, node);
+
+  }
+}
diff --git a/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/AbstractPartListener.java b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/AbstractPartListener.java
new file mode 100644
index 0000000..21494ad
--- /dev/null
+++ b/com.google.eclipse.protobuf.ui/src/com/google/eclipse/protobuf/ui/validation/AbstractPartListener.java
@@ -0,0 +1,31 @@
+/*
+ * 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.validation;
+
+import org.eclipse.ui.*;
+
+/**
+ * Base class for implementations of <code>{@link IPartListener2}</code>.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+public abstract class AbstractPartListener implements IPartListener2 {
+  @Override public void partActivated(IWorkbenchPartReference ref) {}
+  @Override public void partDeactivated(IWorkbenchPartReference ref) {}
+
+  @Override public void partBroughtToTop(IWorkbenchPartReference ref) {}
+
+  @Override public void partOpened(IWorkbenchPartReference ref) {}
+  @Override public void partClosed(IWorkbenchPartReference ref) {}
+
+  @Override public void partVisible(IWorkbenchPartReference ref) {}
+  @Override public void partHidden(IWorkbenchPartReference ref) {}
+
+  @Override public void partInputChanged(IWorkbenchPartReference ref) {}
+}
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 a61053a..f4e3c6e 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
@@ -25,13 +25,13 @@
  *
  * @author alruiz@google.com (Alex Ruiz)
  */
-public class ValidateFileOnActivation implements IPartListener2 {
+public class ValidateFileOnActivation extends AbstractPartListener {
   /**
    * Validates the active active editor in the given part that contains a .proto file in the Workspace.
-   * @param partRef the part that was activated.
+   * @param ref the part that was activated.
    */
-  @Override public void partActivated(IWorkbenchPartReference partRef) {
-    IEditorPart activeEditor = activeEditor(partRef);
+  @Override public void partActivated(IWorkbenchPartReference ref) {
+    IEditorPart activeEditor = activeEditor(ref);
     IProject project = projectFrom(activeEditor);
     if (project == null || !shouldValidateEditor(project)) {
       return;
@@ -39,8 +39,8 @@
     validate(activeEditor);
   }
 
-  private IEditorPart activeEditor(IWorkbenchPartReference partRef) {
-    IWorkbenchPage page = partRef.getPage();
+  private IEditorPart activeEditor(IWorkbenchPartReference ref) {
+    IWorkbenchPage page = ref.getPage();
     return (page == null) ? null : page.getActiveEditor();
   }
 
@@ -54,46 +54,4 @@
     GeneralPreferences preferences = generalPreferences(storeAccess, project);
     return preferences.validateFilesOnActivation().getValue();
   }
-
-  /**
-   * This method does nothing.
-   * @param partRef the part that was surfaced.
-   */
-  @Override public void partBroughtToTop(IWorkbenchPartReference partRef) {}
-
-  /**
-   * This method does nothing.
-   * @param partRef the part that was closed.
-   */
-  @Override public void partClosed(IWorkbenchPartReference partRef) {}
-
-  /**
-   * This method does nothing.
-   * @param partRef the part that was deactivated.
-   */
-  @Override public void partDeactivated(IWorkbenchPartReference partRef) {}
-
-  /**
-   * This method does nothing.
-   * @param partRef the part that was opened.
-   */
-  @Override public void partOpened(IWorkbenchPartReference partRef) {}
-
-  /**
-   * This method does nothing.
-   * @param partRef the part that was hidden.
-   */
-  @Override public void partHidden(IWorkbenchPartReference partRef) {}
-
-  /**
-   * This method does nothing.
-   * @param partRef the part that is visible.
-   */
-  @Override public void partVisible(IWorkbenchPartReference partRef) {}
-
-  /**
-   * This method does nothing.
-   * @param partRef the part whose input was changed.
-   */
-  @Override public void partInputChanged(IWorkbenchPartReference partRef) {}
 }
