*fix
diff --git a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/hierarchy/TypeHierarchy.java b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/hierarchy/TypeHierarchy.java
index 0fd377c..05e7f87 100644
--- a/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/hierarchy/TypeHierarchy.java
+++ b/core/plugins/org.eclipse.dltk.core/model/org/eclipse/dltk/internal/core/hierarchy/TypeHierarchy.java
@@ -14,9 +14,11 @@
 import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
@@ -452,7 +454,7 @@
 	 */
 	private IType[] getAllSubtypesForType(IType type) {
 		ArrayList subTypes = new ArrayList();
-		getAllSubtypesForType0(type, subTypes);
+		getAllSubtypesForType0(type, subTypes, new HashSet());
 		IType[] subClasses = new IType[subTypes.size()];
 		subTypes.toArray(subClasses);
 		return subClasses;
@@ -460,13 +462,17 @@
 
 	/**
 	 */
-	private void getAllSubtypesForType0(IType type, ArrayList subs) {
+	private void getAllSubtypesForType0(IType type, ArrayList subs,
+			Set alreadyProcessed) {
 		IType[] subTypes = getSubtypesForType(type);
 		if (subTypes.length != 0) {
 			for (int i = 0; i < subTypes.length; i++) {
 				IType subType = subTypes[i];
-				subs.add(subType);
-				getAllSubtypesForType0(subType, subs);
+				if (!alreadyProcessed.contains(subType)) {
+					alreadyProcessed.add(subType);
+					subs.add(subType);
+					getAllSubtypesForType0(subType, subs, alreadyProcessed);
+				}
 			}
 		}
 	}
@@ -1399,11 +1405,10 @@
 		StringBuffer buffer = new StringBuffer();
 		buffer.append("Focus: "); //$NON-NLS-1$
 		buffer.append(this.focusType == null ? "<NONE>" //$NON-NLS-1$
-				: ((ModelElement) this.focusType).toStringWithAncestors(false/*
-																				 * don't
-																				 * show
-																				 * key
-																				 */));
+				: ((ModelElement) this.focusType)
+						.toStringWithAncestors(false/*
+													 * don't show key
+													 */));
 		buffer.append("\n"); //$NON-NLS-1$
 		if (exists()) {
 			if (this.focusType != null) {