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 8fa6a93..c4e0f70 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
@@ -12,6 +12,7 @@
 import static org.eclipse.xtext.util.Strings.isEmpty;
 
 import com.google.eclipse.protobuf.protobuf.Import;
+import com.google.eclipse.protobuf.protobuf.StringLiteral;
 import com.google.eclipse.protobuf.resource.ResourceSets;
 import com.google.eclipse.protobuf.scoping.IImportResolver;
 import com.google.eclipse.protobuf.scoping.ProtoDescriptorProvider;
@@ -22,6 +23,7 @@
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.jdt.annotation.Nullable;
 
 /**
  * Utility methods related to imports.
@@ -35,26 +37,28 @@
   @Inject private IImportResolver importResolver;
 
   /**
-   * Indicates whether the URI of the given {@code Import} is equal to the path of the file "descriptor.proto."
+   * Indicates whether the URI of the given {@code Import} is equal to the path of the file
+   * "descriptor.proto."
+   *
    * @param anImport the {@code Import} to check.
-   * @return {@code true} if the URI of the given {@code Import} is equal to the path of the file "descriptor.proto,"
-   * {@code false}
-   * otherwise.
+   * @return {@code true} if the URI of the given {@code Import} is equal to the path of the file
+   *     "descriptor.proto," {@code false} otherwise.
    */
   public boolean hasUnresolvedDescriptorUri(Import anImport) {
     if (anImport == null) {
       return false;
     }
     IProject project = EResources.getProjectOf(anImport.eResource());
-    URI descriptorLocation =
-        descriptorProvider.descriptorLocation(project, getPath(anImport));
+    URI descriptorLocation = descriptorProvider.descriptorLocation(project, getPath(anImport));
     return descriptorLocation != null;
   }
 
   /**
    * Indicates whether the given {@code Import} is pointing to descriptor.proto.
+   *
    * @param anImport the given {@code Import} to check.
-   * @return {@code true} if the given {@code Import} is pointing to descriptor.proto, {@code false} otherwise.
+   * @return {@code true} if the given {@code Import} is pointing to descriptor.proto, {@code false}
+   *     otherwise.
    */
   public boolean isImportingDescriptor(Import anImport) {
     if (hasUnresolvedDescriptorUri(anImport)) {
@@ -76,8 +80,10 @@
 
   /**
    * Indicates whether the URI of the given {@code Import} can be resolved.
+   *
    * @param anImport the given {@code Import}.
-   * @return {@code true} if the URI of the given {@code Import} can be resolved, {@code false} otherwise.
+   * @return {@code true} if the URI of the given {@code Import} can be resolved, {@code false}
+   *     otherwise.
    */
   public boolean isResolved(Import anImport) {
     return resolvedUriOf(anImport) != null;
@@ -85,9 +91,10 @@
 
   /**
    * Returns the resource referred by the URI of the given {@code Import}.
+   *
    * @param anImport the given {@code Import}.
-   * @return the resource referred by the URI of the given {@code Import}, or {@code null} if the URI has not been
-   * resolved.
+   * @return the resource referred by the URI of the given {@code Import}, or {@code null} if the
+   *     URI has not been resolved.
    */
   public Resource importedResource(Import anImport) {
     URI resolvedUri = resolvedUriOf(anImport);
@@ -100,8 +107,10 @@
 
   /**
    * Returns the resolved URI of the given {@code Import}.
+   *
    * @param anImport the the given {@code Import}.
-   * @return the resolved URI of the given {@code Import}, or {@code null} if the URI was not successfully resolved.
+   * @return the resolved URI of the given {@code Import}, or {@code null} if the URI was not
+   *     successfully resolved.
    */
   public URI resolvedUriOf(Import anImport) {
     String resolvedUri = importResolver.resolve(anImport);
@@ -117,9 +126,14 @@
   }
 
   /**
-   * Returns the path that is being imported by the given {@link Import}.
+   * Returns the path that is being imported by the given {@link Import} as a {@code String} or null
+   * if the {@code anImport.getPath()} is null.
    */
-  public String getPath(Import anImport) {
-    return stringLiterals.getCombinedString(anImport.getPath());
+  public @Nullable String getPath(Import anImport) {
+    StringLiteral path = anImport.getPath();
+    if (path != null) {
+      return stringLiterals.getCombinedString(path);
+    }
+    return null;
   }
 }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriGlobalScopeProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriGlobalScopeProvider.java
index 0edb1a1..edc7eae 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriGlobalScopeProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ProtobufImportUriGlobalScopeProvider.java
@@ -81,9 +81,9 @@
 
           private void resolveImport(LinkedHashSet<URI> importedUris, Import singleImport) {
             if (imports.isResolved(singleImport)) {
-              importedUris.add(imports.resolvedUriOf(singleImport));
               Protobuf root = resources.rootOf(imports.importedResource(singleImport));
               if (root != null) {
+                importedUris.add(imports.resolvedUriOf(singleImport));
                 addPublicImportedUris(root, importedUris);
               }
             } else if (imports.hasUnresolvedDescriptorUri(singleImport)) {
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
index b418506..f03df7f 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/validation/ImportValidator.java
@@ -10,7 +10,7 @@
 
 import static com.google.common.collect.Maps.newHashMap;
 import static com.google.common.collect.Sets.newHashSet;
-import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.PACKAGE__IMPORTED_NAMESPACE;
+import static com.google.eclipse.protobuf.protobuf.ProtobufPackage.Literals.IMPORT__PATH;
 import static com.google.eclipse.protobuf.validation.Messages.importNotFound;
 import static com.google.eclipse.protobuf.validation.Messages.importingUnsupportedSyntax;
 import static java.lang.String.format;
@@ -111,7 +111,7 @@
   }
 
   private void warnUnsupportedImportFoundIn(Import anImport) {
-    warning(importingUnsupportedSyntax, anImport, PACKAGE__IMPORTED_NAMESPACE, INSIGNIFICANT_INDEX);
+    warning(importingUnsupportedSyntax, anImport, IMPORT__PATH, INSIGNIFICANT_INDEX);
   }
 
   /**
@@ -125,7 +125,7 @@
     if (imports.isResolved(anImport)) {
       return;
     }
-    error(format(importNotFound, imports.getPath(anImport)), PACKAGE__IMPORTED_NAMESPACE);
+    error(format(importNotFound, imports.getPath(anImport)), IMPORT__PATH);
   }
 
   private static enum HasKnownSyntax {
