diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportedNamesProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportedNamesProvider.java
new file mode 100644
index 0000000..a45374c
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/ImportedNamesProvider.java
@@ -0,0 +1,56 @@
+/*
+ * 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.scoping;
+
+import static com.google.eclipse.protobuf.scoping.QualifiedNames.addPackageNameSegments;
+import static java.util.Collections.*;
+import static org.eclipse.xtext.util.SimpleAttributeResolver.newResolver;
+import static org.eclipse.xtext.util.Strings.isEmpty;
+import static org.eclipse.xtext.util.Tuples.pair;
+
+import com.google.common.base.Function;
+import com.google.eclipse.protobuf.util.ProtobufElementFinder;
+import com.google.inject.*;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.naming.*;
+import org.eclipse.xtext.util.*;
+
+import java.util.*;
+
+/**
+ * Provides alternative qualified names for imported protobuf elements.
+ *
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class ImportedNamesProvider {
+
+  @Inject private final IResourceScopeCache cache = IResourceScopeCache.NullImpl.INSTANCE;
+  @Inject private final IQualifiedNameConverter converter = new IQualifiedNameConverter.DefaultImpl();
+
+  @Inject private ProtobufElementFinder finder;
+
+  private final Function<EObject, String> resolver = newResolver(String.class, "name");
+
+  List<QualifiedName> namesOf(final EObject obj) {
+    Pair<EObject, String> key = pair(obj, "importedFqns");
+    return cache.get(key, obj.eResource(), new Provider<List<QualifiedName>>() {
+      public List<QualifiedName> get() {
+        List<QualifiedName> allNames = new ArrayList<QualifiedName>();
+        EObject current = obj;
+        String name = resolver.apply(current);
+        if (isEmpty(name)) return emptyList();
+        QualifiedName qualifiedName = converter.toQualifiedName(name);
+        allNames.add(qualifiedName);
+        allNames.addAll(addPackageNameSegments(qualifiedName, finder.packageOf(obj), converter));
+        return unmodifiableList(allNames);
+      }
+    });
+  }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider.java
index 98ccb0b..e24a2e8 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/LocalNamesProvider.java
@@ -8,21 +8,21 @@
  */
 package com.google.eclipse.protobuf.scoping;
 
+import static com.google.eclipse.protobuf.scoping.QualifiedNames.addPackageNameSegments;
 import static java.util.Collections.*;
 import static org.eclipse.xtext.util.SimpleAttributeResolver.newResolver;
 import static org.eclipse.xtext.util.Strings.isEmpty;
 import static org.eclipse.xtext.util.Tuples.pair;
 
-import java.util.*;
+import com.google.common.base.Function;
+import com.google.eclipse.protobuf.util.ProtobufElementFinder;
+import com.google.inject.*;
 
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.xtext.naming.*;
 import org.eclipse.xtext.util.*;
 
-import com.google.common.base.Function;
-import com.google.eclipse.protobuf.protobuf.Package;
-import com.google.eclipse.protobuf.util.ProtobufElementFinder;
-import com.google.inject.*;
+import java.util.*;
 
 /**
  * Provides alternative qualified names for protobuf elements.
@@ -65,7 +65,7 @@
   private final Function<EObject, String> resolver = newResolver(String.class, "name");
 
   List<QualifiedName> namesOf(final EObject obj) {
-    Pair<EObject, String> key = pair(obj, "fqns");
+    Pair<EObject, String> key = pair(obj, "localFqns");
     return cache.get(key, obj.eResource(), new Provider<List<QualifiedName>>() {
       public List<QualifiedName> get() {
         List<QualifiedName> allNames = new ArrayList<QualifiedName>();
@@ -81,29 +81,9 @@
           qualifiedName = converter.toQualifiedName(containerName).append(qualifiedName);
           allNames.add(qualifiedName);
         }
-        allNames.addAll(addPackageNameSegments(qualifiedName, finder.packageOf(obj)));
+        allNames.addAll(addPackageNameSegments(qualifiedName, finder.packageOf(obj), converter));
         return unmodifiableList(allNames);
       }
     });
   }
-
-  private List<QualifiedName> addPackageNameSegments(QualifiedName qualifiedName, Package p) {
-    QualifiedName name = qualifiedName;
-    List<String> segments = fqnSegments(p);
-    int segmentCount = segments.size();
-    if (segmentCount <= 1) return emptyList();
-    List<QualifiedName> allNames = new ArrayList<QualifiedName>();
-    for (int i = segmentCount - 1; i > 0; i--) {
-      name = QualifiedName.create(segments.get(i)).append(name);
-      allNames.add(name);
-    }
-    return unmodifiableList(allNames);
-  }
-
-  private List<String> fqnSegments(Package p) {
-    if (p == null) return emptyList();
-    String packageName = p.getName();
-    if (isEmpty(packageName)) return emptyList();
-    return converter.toQualifiedName(packageName).getSegments();
-  }
 }
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 90d9e62..461b2a5 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
@@ -45,6 +45,7 @@
   @Inject private IQualifiedNameProvider nameProvider;
   @Inject private ImportUriResolver uriResolver;
   @Inject private LocalNamesProvider localNamesProvider;
+  @Inject private ImportedNamesProvider importedNamesProvider;
   @Inject private PackageResolver packageResolver;
 
   @SuppressWarnings("unused")
@@ -149,6 +150,9 @@
       if (!targetType.isInstance(next)) continue;
       T type = targetType.cast(next);
       descriptions.add(create(nameProvider.getFullyQualifiedName(type), type));
+      for (QualifiedName name : importedNamesProvider.namesOf(type)) {
+        descriptions.add(create(name, type));
+      }
     }
     return descriptions;
   }
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/QualifiedNames.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/QualifiedNames.java
new file mode 100644
index 0000000..047a80a
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/QualifiedNames.java
@@ -0,0 +1,47 @@
+/*
+ * 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.scoping;
+
+import static java.util.Collections.*;
+import static org.eclipse.xtext.util.Strings.isEmpty;
+
+import com.google.eclipse.protobuf.protobuf.Package;
+
+import org.eclipse.xtext.naming.*;
+
+import java.util.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+final class QualifiedNames {
+
+  static List<QualifiedName> addPackageNameSegments(QualifiedName qualifiedName, Package p,
+      IQualifiedNameConverter converter) {
+    QualifiedName name = qualifiedName;
+    List<String> segments = fqnSegments(p, converter);
+    int segmentCount = segments.size();
+    if (segmentCount <= 1) return emptyList();
+    List<QualifiedName> allNames = new ArrayList<QualifiedName>();
+    for (int i = segmentCount - 1; i > 0; i--) {
+      name = QualifiedName.create(segments.get(i)).append(name);
+      allNames.add(name);
+    }
+    return unmodifiableList(allNames);
+  }
+
+  static private List<String> fqnSegments(Package p, IQualifiedNameConverter converter) {
+    if (p == null) return emptyList();
+    String packageName = p.getName();
+    if (isEmpty(packageName)) return emptyList();
+    return converter.toQualifiedName(packageName).getSegments();
+  }
+  
+  private QualifiedNames() {}
+}
