diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java
new file mode 100644
index 0000000..af48d2d
--- /dev/null
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/PackageIntersectionDescriptions.java
@@ -0,0 +1,76 @@
+/*
+ * 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.resource.EObjectDescription.create;
+import static org.eclipse.xtext.util.SimpleAttributeResolver.newResolver;
+
+import com.google.inject.Inject;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.xtext.naming.*;
+import org.eclipse.xtext.resource.*;
+
+import com.google.common.base.Function;
+import com.google.eclipse.protobuf.protobuf.Package;
+
+import java.util.*;
+
+/**
+ * @author alruiz@google.com (Alex Ruiz)
+ */
+class PackageIntersectionDescriptions {
+
+  @Inject private final IQualifiedNameConverter converter = new IQualifiedNameConverter.DefaultImpl();
+
+  private final Function<EObject, String> resolver = newResolver(String.class, "name");
+
+  Collection<IEObjectDescription> intersection(Package fromImporter, Package fromImported, EObject e) {
+    if (fromImporter == null || fromImported == null) return emptySet();
+    return intersection(segmentNames(fromImporter), segmentNames(fromImported), e);
+  }
+  
+  private List<String> segmentNames(Package aPackage) {
+    return converter.toQualifiedName(aPackage.getName()).getSegments();
+  }
+  
+  private Collection<IEObjectDescription> intersection(List<String> packageInImporter, List<String> packageInImported,
+      EObject e) {
+    int n1Count = packageInImporter.size();
+    int n2Count = packageInImported.size();
+    int start = -1;
+    for (int i = 0; (i < n1Count && i < n2Count); i++) {
+      if (!packageInImporter.get(i).equals(packageInImported.get(i))) {
+        start = i;
+        break;
+      }
+    }
+    if (start == 0) return emptySet(); // no intersection found.
+    List<String> intersection = new ArrayList<String>();
+    intersection.add(resolver.apply(e));
+    Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
+    for (int i = n2Count - 1; i >= 0; i--) {
+      if (i >= start) {
+        intersection.add(0, packageInImported.get(i));
+        continue;
+      }
+      if (i == start - 1) {
+        descriptions.add(create(fqn(intersection), e));
+      }
+      intersection.add(0, packageInImported.get(i));
+      descriptions.add(create(fqn(intersection), e));
+    }
+    return descriptions;
+  }
+  
+  private QualifiedName fqn(List<String> segments) {
+    return QualifiedName.create(segments.toArray(new String[segments.size()]));
+  }
+}
diff --git a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/TypeScopeFinder.java b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/TypeScopeFinder.java
index e37d3b8..d50390c 100644
--- a/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/TypeScopeFinder.java
+++ b/com.google.eclipse.protobuf/src/com/google/eclipse/protobuf/scoping/TypeScopeFinder.java
@@ -27,10 +27,9 @@
  */
 class TypeScopeFinder implements ScopeFinder {
 
-  @Inject private IntersectedPackageDescriptions intersectedPackageDescriptions;
+  @Inject private PackageIntersectionDescriptions packageIntersectionDescriptions;
   @Inject private ProtoDescriptorProvider descriptorProvider;
   @Inject private LocalNamesProvider localNamesProvider;
-  @Inject private PackageIntersection packageIntersection;
   @Inject private QualifiedNameDescriptions qualifiedNamesDescriptions;
   
   @Override public Collection<IEObjectDescription> imported(Package fromImporter, Package fromImported, Object target,
@@ -39,9 +38,7 @@
     Set<IEObjectDescription> descriptions = new HashSet<IEObjectDescription>();
     EObject e = (EObject) target;
     descriptions.addAll(qualifiedNamesDescriptions.qualifiedNames(e));
-    List<String> intersection = packageIntersection.intersection(fromImporter, fromImported);
-    IEObjectDescription d = intersectedPackageDescriptions.description(e, intersection);
-//    if (d != null) descriptions.add(d);
+    descriptions.addAll(packageIntersectionDescriptions.intersection(fromImporter, fromImported, e));
     return descriptions;
   }
 
