https://bugs.eclipse.org/bugs/show_bug.cgi?id=77231
diff --git a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/NamespaceOperations.java b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/NamespaceOperations.java
index ee4c117..7b523e7 100644
--- a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/NamespaceOperations.java
+++ b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/NamespaceOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - Initial API and implementation
  *
- * $Id: NamespaceOperations.java,v 1.7 2004/05/28 05:13:45 khussey Exp $
+ * $Id: NamespaceOperations.java,v 1.7.2.1 2004/11/01 22:23:50 khussey Exp $
  */
 package org.eclipse.uml2.internal.operation;
 
@@ -117,21 +117,22 @@
 		for (Iterator elementImports = namespace.getElementImports().iterator(); elementImports
 			.hasNext();) {
 
-			ElementImport elementImport = (ElementImport) elementImports.next();
+			PackageableElement importedElement = ((ElementImport) elementImports
+				.next()).getImportedElement();
 
-			if (null != elementImport.getImportedElement()) {
-				importedMember.add(elementImport.getImportedElement());
+			if (null != importedElement) {
+				importedMember.add(importedElement);
 			}
 		}
 
 		for (Iterator packageImports = namespace.getPackageImports().iterator(); packageImports
 			.hasNext();) {
 
-			PackageImport packageImport = (PackageImport) packageImports.next();
+			org.eclipse.uml2.Package importedPackage = ((PackageImport) packageImports
+				.next()).getImportedPackage();
 
-			if (null != packageImport.getImportedPackage()) {
-				importedMember.addAll(packageImport.getImportedPackage()
-					.visibleMembers());
+			if (null != importedPackage) {
+				importedMember.addAll(importedPackage.visibleMembers());
 			}
 		}
 
diff --git a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/PackageOperations.java b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/PackageOperations.java
index ffe2936..906d972 100644
--- a/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/PackageOperations.java
+++ b/deprecated/plugins/org.eclipse.uml2/src/org/eclipse/uml2/internal/operation/PackageOperations.java
@@ -8,7 +8,7 @@
  * Contributors:
  *   IBM - Initial API and implementation
  *
- * $Id: PackageOperations.java,v 1.6 2004/05/11 15:24:01 khussey Exp $
+ * $Id: PackageOperations.java,v 1.6.2.1 2004/11/01 22:23:50 khussey Exp $
  */
 package org.eclipse.uml2.internal.operation;
 
@@ -25,9 +25,9 @@
 import org.eclipse.uml2.NamedElement;
 import org.eclipse.uml2.PackageImport;
 import org.eclipse.uml2.PackageableElement;
-import org.eclipse.uml2.util.UML2Validator;
 import org.eclipse.uml2.UML2Plugin;
 import org.eclipse.uml2.VisibilityKind;
+import org.eclipse.uml2.util.UML2Validator;
 
 /**
  * A static utility class that provides operations related to packages.
@@ -72,9 +72,11 @@
 				|| VisibilityKind.PUBLIC_LITERAL.equals(packageImport
 					.getVisibility())) {
 
-				return null != packageImport.getImportedPackage()
-					&& packageImport.getImportedPackage().visibleMembers()
-						.contains(el);
+				org.eclipse.uml2.Package importedPackage = packageImport
+					.getImportedPackage();
+
+				return null != importedPackage
+					&& importedPackage.visibleMembers().contains(el);
 			}
 		}
 
@@ -88,6 +90,21 @@
 	public static Set visibleMembers(org.eclipse.uml2.Package package_) {
 		Set visibleMembers = new HashSet();
 
+		visibleMembersHelper(package_, visibleMembers);
+
+		for (Iterator allImportedPackages = allImportedPackagesHelper(package_,
+			new HashSet()).iterator(); allImportedPackages.hasNext();) {
+
+			visibleMembersHelper((org.eclipse.uml2.Package) allImportedPackages
+				.next(), visibleMembers);
+		}
+
+		return visibleMembers;
+	}
+
+	protected static Set visibleMembersHelper(
+			org.eclipse.uml2.Package package_, Set visibleMembers) {
+
 		for (Iterator ownedMembers = package_.getOwnedMembers().iterator(); ownedMembers
 			.hasNext();) {
 
@@ -111,10 +128,21 @@
 				|| VisibilityKind.PUBLIC_LITERAL.equals(elementImport
 					.getVisibility())) {
 
-				visibleMembers.add(elementImport.getImportedElement());
+				PackageableElement importedElement = elementImport
+					.getImportedElement();
+
+				if (null != importedElement) {
+					visibleMembers.add(importedElement);
+				}
 			}
 		}
 
+		return visibleMembers;
+	}
+
+	protected static Set allImportedPackagesHelper(
+			org.eclipse.uml2.Package package_, Set allImportedPackages) {
+
 		for (Iterator packageImports = package_.getPackageImports().iterator(); packageImports
 			.hasNext();) {
 
@@ -124,12 +152,21 @@
 				|| VisibilityKind.PUBLIC_LITERAL.equals(packageImport
 					.getVisibility())) {
 
-				visibleMembers.addAll(packageImport.getImportedPackage()
-					.visibleMembers());
+				org.eclipse.uml2.Package importedPackage = packageImport
+					.getImportedPackage();
+
+				if (null != importedPackage
+					&& !allImportedPackages.contains(importedPackage)) {
+
+					allImportedPackages.add(importedPackage);
+
+					allImportedPackagesHelper(importedPackage,
+						allImportedPackages);
+				}
 			}
 		}
 
-		return visibleMembers;
+		return allImportedPackages;
 	}
 
 	/**
@@ -162,15 +199,15 @@
 					} else {
 						diagnostics
 							.add(new BasicDiagnostic(
-									Diagnostic.WARNING,
-									UML2Validator.DIAGNOSTIC_SOURCE,
-									UML2Validator.PACKAGE__ELEMENTS_PUBLIC_OR_PRIVATE,
-									UML2Plugin.INSTANCE
-										.getString(
-											"_UI_Package_ElementsPublicOrPrivate_diagnostic", //$NON-NLS-1$
-											getMessageSubstitutions(context,
-												ownedElement, package_)),
-									new Object[] {package_, ownedElement}));
+								Diagnostic.WARNING,
+								UML2Validator.DIAGNOSTIC_SOURCE,
+								UML2Validator.PACKAGE__ELEMENTS_PUBLIC_OR_PRIVATE,
+								UML2Plugin.INSTANCE
+									.getString(
+										"_UI_Package_ElementsPublicOrPrivate_diagnostic", //$NON-NLS-1$
+										getMessageSubstitutions(context,
+											ownedElement, package_)),
+								new Object[]{package_, ownedElement}));
 					}
 				}
 			}