diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/.classpath b/testplugins/org.eclipse.objectteams.otdt.tests/.classpath
new file mode 100644
index 0000000..c991626
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/.classpath
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="model"/>
+	<classpathentry kind="src" path="search"/>
+	<classpathentry kind="src" path="hierarchy"/>
+	<classpathentry kind="src" path="compiler"/>
+	<classpathentry kind="src" path="parser"/>
+	<classpathentry kind="src" path="formatter"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="selection"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/.cvsignore b/testplugins/org.eclipse.objectteams.otdt.tests/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/.project b/testplugins/org.eclipse.objectteams.otdt.tests/.project
new file mode 100644
index 0000000..fbd0226
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.objectteams.otdt.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/.settings/org.eclipse.jdt.core.prefs b/testplugins/org.eclipse.objectteams.otdt.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..05e2501
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,52 @@
+#Thu Mar 08 22:55:51 CET 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/META-INF/MANIFEST.MF b/testplugins/org.eclipse.objectteams.otdt.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..bd8c1ba
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,45 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTDTTest Plug-in
+Bundle-SymbolicName: org.eclipse.objectteams.otdt.tests;singleton:=true
+Bundle-Version: 1.3.0
+Bundle-ClassPath: otdt-tests.jar
+Bundle-ActivationPolicy: lazy
+Require-Bundle: org.junit,
+ org.eclipse.jdt.core;bundle-version="[3.5.0.v_OTDT_r130,4.0.0)",
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.jdt.core.tests.compiler,
+ org.eclipse.test.performance,
+ org.eclipse.objectteams.otdt,
+ org.eclipse.jdt.core.tests.builder,
+ org.eclipse.objectteams.otdt.debug,
+ org.eclipse.text,
+ org.eclipse.jdt.core.tests.model
+Bundle-Vendor: The TOPPrax consortium
+Export-Package: org.eclipse.objectteams.otdt.tests,
+ org.eclipse.objectteams.otdt.tests.compiler,
+ org.eclipse.objectteams.otdt.tests.compiler.ast,
+ org.eclipse.objectteams.otdt.tests.compiler.errorreporting,
+ org.eclipse.objectteams.otdt.tests.compiler.smap,
+ org.eclipse.objectteams.otdt.tests.hierarchy,
+ org.eclipse.objectteams.otdt.tests.model,
+ org.eclipse.objectteams.otdt.tests.otmodel,
+ org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal,
+ org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.teamlevel,
+ org.eclipse.objectteams.otdt.tests.otmodel.equals,
+ org.eclipse.objectteams.otdt.tests.otmodel.externalrole,
+ org.eclipse.objectteams.otdt.tests.otmodel.internal,
+ org.eclipse.objectteams.otdt.tests.otmodel.internalrole,
+ org.eclipse.objectteams.otdt.tests.otmodel.role.bound.toordinary,
+ org.eclipse.objectteams.otdt.tests.otmodel.role.bound.toteam,
+ org.eclipse.objectteams.otdt.tests.otmodel.role.unbound,
+ org.eclipse.objectteams.otdt.tests.otmodel.sample,
+ org.eclipse.objectteams.otdt.tests.otmodel.teams,
+ org.eclipse.objectteams.otdt.tests.parser,
+ org.eclipse.objectteams.otdt.tests.search,
+ org.eclipse.objectteams.otdt.tests.selection,
+ org.eclipse.objectteams.otdt.tests.selection.codeselect,
+ org.eclipse.objectteams.otdt.tests.subhierarchy,
+ org.eclipse.objectteams.otdt.tests.superhierarchy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/build.properties b/testplugins/org.eclipse.objectteams.otdt.tests/build.properties
new file mode 100644
index 0000000..c2021fe
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/build.properties
@@ -0,0 +1,19 @@
+source.otdt-tests.jar = src/,\
+                        compiler/,\
+                        hierarchy/,\
+                        model/,\
+                        parser/,\
+                        search/,\
+                        selection/,\
+                        analysis/,\
+                        formatter/
+output.otdt-tests.jar = bin/
+bin.includes = plugin.xml,\
+               otdt-tests.jar,\
+               workspace/,\
+               META-INF/,\
+               test.xml,\
+               JCL/
+src.includes = .classpath,\
+               .project,\
+               build.properties
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/CustomizedCompiler.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/CustomizedCompiler.java
new file mode 100644
index 0000000..56aeb61
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/CustomizedCompiler.java
@@ -0,0 +1,69 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: CustomizedCompiler.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler;
+
+import java.util.Vector;
+
+import org.eclipse.jdt.internal.compiler.Compiler;
+import org.eclipse.jdt.internal.compiler.ICompilerRequestor;
+import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
+import org.eclipse.jdt.internal.compiler.IProblemFactory;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+
+/**
+ * @author ike
+ *
+ */
+public class CustomizedCompiler extends Compiler
+{
+    private Vector<ICallbackClient> _callBacks;
+    
+    /**
+     * @param environment
+     * @param policy
+     * @param settings
+     * @param requestor
+     * @param problemFactory
+     */
+    public CustomizedCompiler(INameEnvironment environment, IErrorHandlingPolicy policy, CompilerOptions settings, ICompilerRequestor requestor, IProblemFactory problemFactory)
+    {
+        super(environment, policy, settings, requestor, problemFactory);
+    }
+    
+    public void addCallBack(ICallbackClient c)
+    {
+        if (_callBacks == null)
+            _callBacks = new Vector<ICallbackClient>();
+
+        _callBacks.add(c);
+    }
+    	
+    @Override
+    public void process(CompilationUnitDeclaration unit, int i) {
+    	super.process(unit, i);
+//{ObjectTeams: callback all waiting tests
+    	for (ICallbackClient cbc : this._callBacks)
+			cbc.callback(unit);
+//ike}					
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/ICallbackClient.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/ICallbackClient.java
new file mode 100644
index 0000000..735314e
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/ICallbackClient.java
@@ -0,0 +1,32 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: ICallbackClient.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler;
+
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+
+/**
+ * @author ike
+ *
+ */
+public interface ICallbackClient
+{
+    public void callback(CompilationUnitDeclaration cuDecl);
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/SourceElementRequestorTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/SourceElementRequestorTest.java
new file mode 100644
index 0000000..df6a4b6
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/SourceElementRequestorTest.java
@@ -0,0 +1,220 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: SourceElementRequestorTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler;
+import java.util.Locale;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.compiler.CategorizedProblem;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.compiler.ISourceElementRequestor;
+import org.eclipse.jdt.internal.compiler.SourceElementParser;
+import org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.eclipse.jdt.internal.compiler.ast.ImportReference;
+import org.eclipse.jdt.internal.compiler.batch.CompilationUnit;
+import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * @author haebor/mkr
+ * @version $Id: SourceElementRequestorTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class SourceElementRequestorTest extends FileBasedModelTest implements ISourceElementRequestor
+{
+	private char[] source;
+	protected String PROJECT_DIR;
+    
+    public SourceElementRequestorTest(String testName)
+    {
+        super(testName);
+    }
+    
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(SourceElementRequestorTest.class);
+        }
+        junit.framework.TestSuite suite = new Suite(SourceElementRequestorTest.class
+            .getName());
+        return suite;
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir(PROJECT_DIR);
+        super.setUpSuite();
+    }
+    
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+    }
+
+    public void fullParse(String src, String fileName)
+    {
+	    	this.source = src.toCharArray();
+	    	
+	    	// km: ctor with new parameter "reportLocalDeclarations", "optimizeStringLiterals" assuming both to be true
+	    	SourceElementParser parser = 
+	    		new SourceElementParser(this, new DefaultProblemFactory(Locale.getDefault()), new CompilerOptions(), true, true); 
+	
+	    	ICompilationUnit sourceUnit = new CompilationUnit(source, fileName, null);
+	
+	    	parser.parseCompilationUnit(sourceUnit, true, null);
+    }
+    
+    public void acceptConstructorReference(char[] typeName, int argCount, int sourcePosition)
+    {
+    }
+
+    public void acceptFieldReference(char[] fieldName, int sourcePosition)
+    {
+    }
+
+    public void acceptLineSeparatorPositions(int[] positions)
+    {
+    }
+
+    public void acceptMethodReference(char[] methodName, int argCount, int sourcePosition)
+    {
+    }
+
+    public void acceptTypeReference(char[][] typeName, int sourceStart, int sourceEnd)
+    {
+    }
+
+    public void acceptTypeReference(char[] typeName, int sourcePosition)
+    {
+    }
+
+    public void acceptUnknownReference(char[][] name, int sourceStart, int sourceEnd)
+    {
+    }
+
+    public void acceptUnknownReference(char[] name, int sourcePosition)
+    {
+    }
+
+    public void enterCompilationUnit()
+    {
+    }
+
+    public void enterInitializer(int declarationStart, int modifiers)
+    {
+    }
+
+    public void exitCompilationUnit(int declarationEnd)
+    {
+    }
+
+    public void exitConstructor(int declarationEnd)
+    {
+    }
+
+    public void exitField(int initializationStart, int declarationEnd, int declarationSourceEnd)
+    {
+    }
+
+    public void exitInitializer(int declarationEnd)
+    {
+    }
+
+    public void enterCalloutMapping(CalloutInfo calloutInfo)
+    {
+    }
+
+    public void enterCalloutToFieldMapping(CalloutToFieldInfo calloutInfo)
+    {
+    }
+
+    public void enterCallinMapping(CallinInfo callinInfo)
+    {
+    }
+    
+    public void exitCallinMapping(int sourceEnd, int declarationSourceEnd)
+    {
+    }
+
+    public void exitCalloutMapping(int sourceEnd, int declarationSourceEnd)
+    {
+    }
+
+    public void exitCalloutToFieldMapping(int sourceEnd, int declarationSourceEnd)
+    {
+    }
+
+    public void acceptBaseReference(char[][] typeName, int sourceStart, int sourceEnd){}
+
+	public void enterConstructor(MethodInfo methodInfo) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void enterField(FieldInfo fieldInfo) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void enterMethod(MethodInfo methodInfo) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void enterType(TypeInfo typeInfo) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void exitType(int declarationEnd) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void acceptProblem(CategorizedProblem problem) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void acceptImport(int declarationStart, int declarationEnd, char[][] tokens, boolean onDemand, int modifiers) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void acceptAnnotationTypeReference(char[][] annotation, int sourceStart, int sourceEnd) {
+		// TODO Auto-generated method stub		
+	}
+
+	public void acceptAnnotationTypeReference(char[] annotation, int sourcePosition) {
+		// TODO Auto-generated method stub
+	}
+
+	public void acceptPackage(ImportReference importReference) {
+		// TODO Auto-generated method stub
+	}
+
+	public void exitMethod(int declarationEnd, Expression defaultValue) {
+		// TODO Auto-generated method stub		
+	}
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/TestBase.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/TestBase.java
new file mode 100644
index 0000000..9622d50
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/TestBase.java
@@ -0,0 +1,698 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: TestBase.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+import junit.textui.TestRunner;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.compiler.batch.Main;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.objectteams.otdt.core.ext.OTDTPlugin;
+
+/**
+ * This class represents a base for testing the compiler with several files.
+ *
+ * @author Jan Wloka
+ * @version $Id: TestBase.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class TestBase extends TestCase
+{
+	
+	public static final String NL = "\r\n";
+	
+	public static final String CLASS_FILE_EXTENSION = ".class";
+    public static final String JAVA_FILE_EXTENSION 	= ".java";
+    public static final String LOG_FILE_EXTENSION 	= ".log";
+    
+    public static final String WORKSPACE_NAME 		= "testing-workspace";
+    public static final String PROJECT_NAME 		= "TestProject";
+	
+	public static final String JAVA_HOME = System.getProperty("java.home");
+	public static final String USER_HOME = System.getProperty("user.home");
+	
+	public static final String JRE_JAR_PATH = JAVA_HOME 
+													+ File.separator 
+													+ "lib" 
+													+ File.separator 
+													+ "rt.jar";
+    
+    public static final String OT_RUNTIME_PATH;  
+    static {
+    		OT_RUNTIME_PATH = JavaCore.getClasspathVariable(OTDTPlugin.OTDT_INSTALLDIR).toOSString();
+    }
+    	
+    
+	public static final String OTRE_JAR_PATH = OT_RUNTIME_PATH 
+													+ File.separator
+													+ "lib"
+													+ File.separator
+													+ "otre.jar";
+	
+    public static final String OT_SCRIPT_PATH = OT_RUNTIME_PATH
+													+ File.separator
+													+ "otj"
+													+ File.separator
+													+ "bin" 
+													+ File.separator
+													+ "ot";
+	         
+    public static final String PROJECT_PATH = USER_HOME 
+													+ File.separator 
+													+ WORKSPACE_NAME 
+													+ File.separator
+													+ PROJECT_NAME;
+
+    
+	private Main   _compiler;
+    private String _logFileName;
+    private File   _workingDir;
+    
+    public TestBase(String testName)
+    {
+    		super(testName);
+    }
+    
+    private void cleanWorkingDirectory()
+    {
+       if (!_workingDir.isDirectory())
+       {
+       		return;
+       }
+       cleanRecursively(_workingDir);
+//       File[] containedFiles = _workingDir.listFiles();
+//       
+//       for (int idx = 0; idx < containedFiles.length; idx++)
+//	   {
+//	       	containedFiles[idx].delete();    
+//	   }
+//	   
+//	   _workingDir.delete();
+    }
+    private void cleanRecursively(File file) {
+    	if (file.isDirectory()) {
+    		for (File child : file.listFiles()) {
+				cleanRecursively(child);
+			}
+    	}
+    	file.delete();
+    }
+    	
+    /**
+     * Executes the main() method of a given classfile.
+     * @param fname e.g. MyMainClass
+     * @param expectedResult e.g. OK
+     * @return e.g. OK
+     */
+    public boolean executeFile(String fname, String expectedResult)
+    {
+    	System.out.println(" ***** executed ***** ");     	
+    	String result = executeCommand(OT_SCRIPT_PATH + " -classpath " + PROJECT_PATH +" "+ fname);
+    	if(result.compareTo(expectedResult) != 0)
+    	{
+    		System.out.println(" Expected result: " + expectedResult);
+    		System.out.println(" Actual result:   " + result);
+    		
+    		return false;
+    	}
+    	return true;
+    }
+
+    /**
+     * execute unix shell command
+     * @param commandToExecute
+     * @return the result from output stream
+     */
+    private static String executeCommand(String commandToExecute) 
+	{	
+    	ArrayList<Exception> exceptions = new ArrayList<Exception>();
+ 	
+    	Process commandExecutionProcess;
+    	
+		StringWriter output = new StringWriter();
+		StringWriter errors = new StringWriter();
+		
+		try 
+		{
+			commandExecutionProcess = Runtime.getRuntime().exec(commandToExecute);
+					 			
+			StreamRedirectThread outRedirect = 
+				new StreamRedirectThread(
+					"output_reader",
+					commandExecutionProcess.getInputStream(), 
+					output);
+			StreamRedirectThread errRedirect = new StreamRedirectThread("error_reader",
+				commandExecutionProcess.getErrorStream(), errors);
+		
+			outRedirect.start();
+			errRedirect.start();
+		
+			commandExecutionProcess.waitFor();
+		    		
+			outRedirect.join(); // wait until output (std out) of commandline tool is fully read
+			errRedirect.join(); //  wait until  standard error of commandline tool is fully read
+			if (outRedirect.getException() != null) 
+			{
+				exceptions.add(outRedirect.getException());
+			} 
+			if (errRedirect.getException() != null) 
+			{
+				exceptions.add(errRedirect.getException());
+			} 			
+			}
+		catch (Exception ex)
+		{	
+			exceptions.add(ex);
+		}
+		finally 
+		{
+			output.flush();
+			try
+			{
+				output.close();
+			}
+			catch (Exception ex)
+			{	
+				exceptions.add(ex);
+			}	
+			errors.flush();
+			try
+			{
+				errors.close();
+			}
+			catch (Exception ex)
+			{	
+				exceptions.add(ex);
+			}	    	
+		}
+		
+		return errors.toString() + output.toString();
+		
+	}
+    // -- use default options: --
+    public void compileFile(String fname)
+    {
+    	compileFile(fname, null);
+    }
+    public void compileFile(String fname, String[] classpath)
+    {
+		Map<String,String> options= new HashMap<String,String>();
+		options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5);
+		options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5);
+		options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_5);
+		options.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
+		options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR);
+		options.put(CompilerOptions.OPTION_ReportInvalidJavadocTags, CompilerOptions.ERROR);
+		compileFile(fname, classpath, options);
+    }
+    // -- use custom options: --
+    public void compileFile(String fname, String[] classpath, Map options)
+    {
+        System.out.println("*************************** "
+        		+ this.getClass().getName()
+				+" "
+                + this.getName()
+                + " ***************************");
+        _logFileName = fname;
+        
+        try
+        {
+	        if (!validClasspathEntries())
+	        {
+	            throw new FileNotFoundException("Whether OTRE_JAR_PATH (otre.jar) or JRE_JAR_PATH (rt.jar) is unvalid.");
+	        }
+	        
+	        String[] args = (classpath == null)  
+	        					? createClassPath(fname)
+	        					: classpath;
+		
+			File javaFile = new File(_workingDir.getAbsolutePath() 
+												+ File.separator 
+												+ fname 
+												+ JAVA_FILE_EXTENSION);
+												
+			if(!javaFile.exists())
+			{
+				throw new FileNotFoundException("File to compile was not found!: " + _logFileName);
+			}
+			
+            _compiler =
+                new Main(
+                    new PrintWriter(
+                    	new FileOutputStream(PROJECT_PATH 
+                    							+ File.separator
+                    							+ _logFileName 
+                    							+ LOG_FILE_EXTENSION)),
+                    new PrintWriter(
+                    	new FileOutputStream(PROJECT_PATH 
+                    							+ File.separator
+                    							+ _logFileName
+                    							+ LOG_FILE_EXTENSION)),
+                    false,
+                    options,
+                    null);
+                    
+            _compiler.compile(args);
+        }
+        catch (FileNotFoundException ex)
+        {
+            handleException(ex);
+        }
+    }
+
+    private boolean validClasspathEntries()
+    {
+        File otreJar = new File(OTRE_JAR_PATH);
+        File jreJar = new File(JRE_JAR_PATH);
+        
+        return (otreJar.exists() && jreJar.exists());
+    }
+
+    public void createFile(String fname, String content)
+    {
+		try
+		{
+	    	File pkgDir = createPackageDirectory(content);
+	        File file   = new File(pkgDir.getAbsolutePath()
+        						+ File.separator 
+        						+ fname 
+        						+ JAVA_FILE_EXTENSION);
+        file.deleteOnExit();
+        
+            FileWriter writer = new FileWriter(file);
+            writer.write(content);
+            writer.close();
+        }
+        catch (IOException ex)
+        {
+            handleException(ex);
+        }
+    }
+
+	/**
+	 * Creates a file at given relative position and all necessary directories 
+	 * The content of package is not evaluatet for saving location
+	 * @param fname the name of the new file to create
+	 * @param relPath the relative path where to store the file
+	 * @param content the content
+	 */
+	public void createFileAt(String fname, String relPath, String content)
+	{
+		try
+		{
+			String curPath = _workingDir.getAbsolutePath();
+			
+			if(relPath.trim().length() > 0)
+			{
+				curPath+= File.separator + relPath;
+			}
+
+			File   pkgDir  = new File(curPath);
+			pkgDir.mkdirs();
+			
+			File file   = new File(pkgDir.getAbsolutePath()
+								+ File.separator 
+								+ fname 
+								+ JAVA_FILE_EXTENSION);
+		file.deleteOnExit();
+        
+			FileWriter writer = new FileWriter(file);
+			writer.write(content);
+			writer.close();
+		}
+		catch (IOException ex)
+		{
+			handleException(ex);
+		}
+	}
+
+    private File createPackageDirectory(String fileContent) throws IOException
+    {
+		String qualPkgName = getQualifiedPackageName(fileContent);
+		String dirPath     = getDirectoryPath(qualPkgName);
+    	
+    	String curPath = _workingDir.getAbsolutePath() + File.separator + dirPath;
+		File   result  = new File(curPath);
+		result.mkdirs();
+
+        return result;
+    }
+
+    private String getDirectoryPath(String qualPkgName)
+    {
+        if ((qualPkgName == null) || (qualPkgName.trim().length() == 0))
+        {
+			return "";
+        }
+        
+        if (qualPkgName.indexOf('.') == -1)
+        {
+        	return qualPkgName;
+        }
+        else
+        {
+			return qualPkgName.replaceAll("[.]", File.separator);
+        }
+    }
+
+    private String getQualifiedPackageName(String fileContent)
+    {
+        String packageKeyword = "package ";
+        
+        int pos1 = fileContent.indexOf(packageKeyword);
+		if (pos1 == -1)
+		{
+			return "";
+		}
+        
+        int pos2 = fileContent.indexOf(';', pos1);
+		if (pos2 == -1)
+		{
+			return "";
+		}       
+        
+        
+        return fileContent.substring(pos1 + packageKeyword.length(), pos2);
+    }
+
+    private void handleException(Exception ex)
+    {
+        System.out.println("UNCAUGHT EXCEPTION: " + ex);
+        ex.printStackTrace(System.out);
+    }
+
+
+    /**
+     * checks whether the compiler has proceeded without errors or warnings 
+     */
+	public boolean isCompilationSuccessful()
+	{
+		if (_compiler.globalErrorsCount != 0)
+		{
+			printAllProblems();
+			return false;
+		}
+		else
+		{
+			File file = new File(_workingDir.getAbsolutePath() 
+									+ File.separator 
+									+ _logFileName 
+									+ LOG_FILE_EXTENSION);
+			file.delete();          
+			return true;
+		}
+	}
+
+	/**
+	 * checks whether the compiler has generated the expected errors and warnings,
+	 * if it created more problems than specified this is OK for this method.
+	 * @param problemIDs IDs of the expected errors and warnings as specified in 
+	 *                   org.eclipse.jdt.core.compiler.IProblem
+	 */
+	public boolean hasAtLeastExpectedProblems(int[] problemIDs)
+	{
+		expected: for (int i = 0; i < problemIDs.length; i++) {
+			for (int j = 0; j < _compiler.logger._globalProblems.size(); j++) {
+				if (problemIDs[i] == ((IProblem)_compiler.logger._globalProblems.get(j)).getID())
+					continue expected;
+			}
+			printAllProblems();
+			return false;
+		}
+		File file = new File(_workingDir.getAbsolutePath() 
+								+ File.separator 
+								+ _logFileName 
+								+ LOG_FILE_EXTENSION);
+		file.delete();
+		return true;
+	}
+
+	/**
+	 * checks whether the compiler has generated the expected errors and warnings
+	 * @param problemIDs IDs of the expected errors and warnings as specified in 
+	 *                   org.eclipse.jdt.core.compiler.IProblem
+	 */
+	public boolean hasExpectedProblems(int[] problemIDs)
+	{
+		if ( areProblemsEqual(_compiler.logger._globalProblems, problemIDs) )
+		{       	
+			File file = new File(_workingDir.getAbsolutePath() 
+									+ File.separator 
+									+ _logFileName 
+									+ LOG_FILE_EXTENSION);
+			file.delete();
+            
+			return true;
+		}
+		else
+		{
+			printAllProblems();
+			return false;
+		}
+	}
+	
+    private void printAllProblems()
+    {
+        for (Iterator iter = _compiler.logger._globalProblems.iterator(); iter.hasNext();)
+        {
+            IProblem prob = (IProblem)iter.next();
+        	System.err.println(prob.toString());
+            if (prob.getID() == IProblem.Unclassified) // it was an exception.
+                throw new InternalError(prob.toString()); 
+        }
+    }
+	
+	/**
+	 * checks whether the compiler has generated the expected errors and warnings
+	 * @param errorIDs IDs of the expected errors as specified in 
+	 *                 org.eclipse.jdt.core.compiler.IProblem
+	 * @param warningIDs analogous 
+	 */
+    public boolean hasExpectedProblems(int[] errorIDs, int[] warningIDs)
+    {
+ 		if (   areProblemsEqual(_compiler.logger._globalErrors,   errorIDs)
+ 		    && areProblemsEqual(_compiler.logger._globalWarnings, warningIDs) )
+        {
+        	
+            File file = new File(_workingDir.getAbsolutePath() 
+            						+ File.separator 
+            						+ _logFileName 
+            						+ LOG_FILE_EXTENSION);
+            file.delete();
+            
+            return true;
+        }
+        else
+        {
+        	return false;
+        }
+    }
+    
+    
+    /**
+     * @param problems	Vector elements of type IProblem
+     */
+    private boolean areProblemsEqual(List problems, int[] problemIDs)
+    {
+		if ( problemIDs == null)
+		{
+			return problems.isEmpty();
+		}
+
+        boolean result = true;
+
+        if (problems.size() != problemIDs.length)
+        {
+            result = false;
+        }
+        for (Iterator iter = problems.iterator(); result && iter.hasNext();)
+        {
+            IProblem curProblem = (IProblem) iter.next();
+            int curProblemID = curProblem.getID();
+
+            boolean found = false;
+            int idx = 0;
+
+            while (!found && (idx < problemIDs.length))
+            {
+                if (curProblemID == problemIDs[idx])
+                {
+                    found = true;
+                }
+                idx++;
+            }
+            if (!found)
+            {
+                result = false;
+            }
+        }
+        return result;
+    }
+    
+//	public boolean isCompilationSuccessful(int errors, int warnings)
+//	{
+//		if (_compiler.globalErrorsCount != errors
+//			|| _compiler.globalProblemsCount > (errors + warnings)
+//			|| _compiler.globalWarningsCount != warnings)
+//		{
+//			return false;
+//		}
+//		else
+//		{
+//			// TODO (SH): check whether we have the expected problems.
+//			File file = new File(_workingDir.getAbsolutePath() 
+//									+ File.separator 
+//									+ _logFileName 
+//									+ LOG_FILE_EXTENSION);
+//			file.delete();
+//            
+//			return true;
+//		}
+//	}    
+    
+    
+    private String[] createClassPath(String fname)
+    {
+        File javaFile = new File(_workingDir.getAbsolutePath() 
+        							+ File.separator 
+        							+ fname 
+        							+ JAVA_FILE_EXTENSION);
+        
+        String[] args =
+        {
+            "-classpath",
+            new Path(OTRE_JAR_PATH).toString()
+                		+ File.pathSeparator
+                		+ new Path(JRE_JAR_PATH).toString()
+                		+ File.pathSeparator
+                		+ new Path(_workingDir.getAbsolutePath() 
+                		+ File.separator).toString(),
+            		 javaFile.getAbsolutePath()
+        };
+                
+        return args;
+    }
+    
+    protected String[] createClassPathNoOTRE(String fname)
+    {
+        File javaFile = new File(_workingDir.getAbsolutePath() 
+        							+ File.separator 
+        							+ fname 
+        							+ JAVA_FILE_EXTENSION);
+        
+        String[] args =
+        {
+            "-classpath",
+            new Path(JRE_JAR_PATH).toString()
+                		+ File.pathSeparator
+                		+ new Path(_workingDir.getAbsolutePath() 
+                		+ File.separator).toString(),
+            javaFile.getAbsolutePath()
+        };
+                
+        return args;
+    }
+       
+       
+	protected void setUp() throws Exception
+	{
+		_workingDir = new File(PROJECT_PATH);
+		cleanWorkingDirectory();
+		_workingDir.mkdirs();
+	}
+	   
+    protected void tearDown() throws Exception
+    {
+
+    }
+    
+    /**
+     * This method was added for convenient testing of single testmethods in testclasses.
+     * The first commandline argument is expected to be the class where the 
+     * testmethod can be found. The following arguments are the testmethodnames
+     * that should run. 
+     * example: 
+     * java Testbase org.eclipse.objectteams.otdt.tests.compiler.errorreporting.compiler.CalloutBindingTest testMultipleCalloutBinding1 
+     * @param args
+     * @throws ClassNotFoundException
+     * @throws SecurityException
+     * @throws NoSuchMethodException
+     * @throws IllegalArgumentException
+     * @throws InstantiationException
+     * @throws IllegalAccessException
+     * @throws InvocationTargetException
+     */
+    
+	public static void main(String[] args) throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException
+	{
+		TestSuite selected = null;
+		Constructor clsConst =null;
+		
+		switch (args.length)
+		{
+			case 0:
+			{
+				System.err.println("You must specify the class containing the testcases as argument.");
+				System.exit(1);
+				break; // duh
+			}
+			
+			case 1: // take all methods
+			{
+				Class testClass = Class.forName(args[0]);
+				selected = new TestSuite(testClass);
+				break;
+			}
+		
+			default: // single methods to execute given
+			{
+				Class<?> testClass = Class.forName(args[0]);
+				clsConst = testClass.getConstructor( new Class<?>[] { String.class } );
+				selected = new TestSuite();
+		
+				for (int idx = 1; idx < args.length; idx++)
+				{
+					selected.addTest((Test)clsConst.newInstance( new Object[] { args[idx] } ));
+				}
+			}
+		}
+				
+		TestRunner.run(selected);		
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/ast/TypeDeclarationTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/ast/TypeDeclarationTest.java
new file mode 100644
index 0000000..cfc5b52
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/ast/TypeDeclarationTest.java
@@ -0,0 +1,104 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: TypeDeclarationTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.ast;
+
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.tests.compiler.SourceElementRequestorTest;
+
+/**
+ * @author haebor
+ * @version $Id: TypeDeclarationTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class TypeDeclarationTest extends SourceElementRequestorTest
+{
+    
+    private boolean _testFlag;
+
+    public TypeDeclarationTest(String testName)
+    {
+        super(testName);
+    }
+
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(TypeDeclarationTest.class);
+        }
+        junit.framework.TestSuite suite = new Suite(TypeDeclarationTest.class
+            .getName());
+        return suite;
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        this.PROJECT_DIR = "ExternalDefinedRole";
+        super.setUpSuite();
+    }
+
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+    }
+	
+	public void enterType(TypeInfo typeInfo) {
+        _testFlag = typeInfo.isRoleFile;
+	}
+ 
+    public void testRoleInterface_RolefileFlag() throws JavaModelException
+    {
+        org.eclipse.jdt.core.ICompilationUnit unit = getCompilationUnit(
+                "ExternalDefinedRole",
+                "unbound",
+                "unbound.teampkg.Team_5a",
+                "SampleRole.java");
+        
+        String    src = unit.getSource();
+        
+	    String fileName = unit.getCorrespondingResource().toString();
+
+	    fullParse(src, fileName);
+	    
+	    assertTrue(_testFlag);
+    }
+
+    public void testRoleClass_RolefileFlag() throws JavaModelException
+    {
+        org.eclipse.jdt.core.ICompilationUnit unit = getCompilationUnit(
+                "ExternalDefinedRole",
+                "unbound",
+                "unbound.teampkg.Team_5b",
+                "SampleRole.java");
+        
+        String    src = unit.getSource();
+        IResource res = unit.getCorrespondingResource();        
+                    
+	    String fileName = res.toString();
+	    fullParse(src, fileName);
+	    
+	    assertTrue(_testFlag);
+    }
+
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CallinBindingTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CallinBindingTest.java
new file mode 100644
index 0000000..44bc0ab
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CallinBindingTest.java
@@ -0,0 +1,243 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: CallinBindingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+
+/**
+ * This class contains tests concerning callin bindings.
+ * 
+ * @author kaschja
+ * @version $Id: CallinBindingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class CallinBindingTest extends TestBase
+{
+    public CallinBindingTest(String testName)
+    {
+        super(testName);
+    }
+
+	/**
+	 * A "replace-callin binding" is used with a base call.
+	 * Bound role method is declared as callin method.
+	 */
+	public void testCallinInMethodDeclaration() 
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public int baseMethod(int i) {return 1;}" +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    callin int roleMethod(int i)" +
+			  NL + "        {" +
+			  NL + "            return base.roleMethod(i);  " +
+			  NL + "        }" +
+			  NL + "        roleMethod <- replace baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A base-call must have arguments matching the role-method's signature.
+	 */
+	public void testBrokenBaseCall() 
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(int i) {}" +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    callin void roleMethod(int i)" +
+			  NL + "        {" +
+			  NL + "            base.roleMethod();  " +
+			  NL + "        }" +
+			  NL + "        roleMethod <- replace baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+		
+		assertTrue(hasExpectedProblems(new int[] { IProblem.BaseCallDoesntMatchRoleMethodSignature }));
+	}
+	
+    /**
+	 * A base call in a role method.
+	 * Bound role method must be declared as callin method.
+	 */
+	public void testMissingCallinModifierInMethodDeclaration1() 
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod() {}" +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    public void roleMethod()" +
+			  NL + "        {" +
+			  NL + "            base.roleMethod();  " +
+			  NL + "        }" +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+		
+		assertTrue(hasExpectedProblems(new int[] {IProblem.BasecallInRegularMethod }));
+	}
+	
+	/**
+	 * A callin binding declaration must include a modifier 
+	 * (before/replace/after).
+	 */
+	public void testCallinBindingDeclarationWithoutModifier1() 
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod() {}" +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    public void roleMethod() {}" +
+			  NL + "        roleMethod <- baseMethod;" +
+			  NL + "    } "+
+			  NL + "}");
+	
+		compileFile("MyTeam");
+		
+		assertTrue(hasExpectedProblems(new int[] { IProblem.CallinReplaceKeyWordNotOptional }));
+	}
+
+	/**
+	 * A method in a regular class must not be declared as callin method.
+	 */
+	public void testCallinModifierDeclaredInMethodOfRegularClass1()
+	{
+		createFile("MyClass","public class MyClass" +
+			  NL + "{" +
+			  NL + "   callin void classMethod() {}" +
+			  NL + "}");
+		
+		compileFile("MyClass");
+		
+		assertTrue(hasExpectedProblems(new int[] {IProblem.OTKeywordInRegularClass}));
+	}
+	
+	/**
+	 * A callin method must not be called by the role itself
+	 */
+	public void testCallinMethodCalledInOtherMethodOfSameRole1()
+	{
+		createFile("MyBase","public class MyBase {}");
+		
+		createFile("MyTeam","public team class MyTeam" +
+			  NL + "{" +
+		      NL + "   protected class MyRole playedBy MyBase" +
+		      NL + "   {" +
+		      NL + "       callin void callinMethod() {}" +
+		      NL + "       void roleMethod()" +
+		      NL + "       {" +
+		      NL + "           callinMethod();" + 
+		      NL + "       }" +
+		      NL + "   }" +
+			  NL + "}");
+			  
+		compileFile("MyTeam");
+		
+		assertTrue(hasExpectedProblems(new int[] {IProblem.CallToCallin, IProblem.DefinitelyMissingBaseCall}));
+	}
+	
+	/**
+	 * It is an allowed alternative to declare a callin-binding 
+	 * with full method signature
+	 */
+	public void testMethodsWithSignaturesInCallinBindings1()
+	{
+		createFile("MyBase","public class MyBase" +
+			  NL + "{" +
+			  NL + "   public void baseMethodA() {}" + 
+			  NL + "   public void baseMethodB() {}" +																				
+			  NL + "   public void baseMethodC() {}" +																				
+			  NL + "}");															
+							
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{" +																						
+			  NL + "   protected class MyRole playedBy MyBase" + 
+			  NL + "   {" +																			
+			  NL + "       void callinMethodA() {}" +																		
+		      NL + "       callin void callinMethodB() {}" +																		
+		      NL + "       void callinMethodA() <- after void baseMethodA();" +														
+			  NL + "	   void callinMethodB() <- replace void baseMethodB(),  void baseMethodC();" +							
+			  NL + "   }" +
+			  NL + "}");
+	
+		compileFile("MyTeam");
+
+		assertTrue(isCompilationSuccessful());	
+	}
+	
+	/**
+	 * It is an allowed alternative to declare a callin-binding
+	 * without method signature
+	 */
+	public void testMethodsWithoutSignaturesInCallinBindings1()
+	{
+		createFile("MyBase","public class MyBase" +
+			  NL + "{" +
+			  NL + "   public void baseMethodA() {}" + 
+			  NL + "   public void baseMethodB() {}" +																				
+			  NL + "   public void baseMethodC() {}" +																				
+			  NL + "}");															
+							
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{" +																						
+			  NL + "   protected class MyRole playedBy MyBase" + 
+			  NL + "   {" +																			
+			  NL + "       void callinMethodA() {}" +																		
+			  NL + "       callin void callinMethodB() {}" +																		
+			  NL + "       callinMethodA <- before baseMethodA;" +														
+			  NL + "	   callinMethodB <- replace baseMethodB, baseMethodC;" +							
+			  NL + "   }" +
+			  NL + "}");
+	
+		compileFile("MyTeam");
+
+		assertTrue(isCompilationSuccessful());	
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CalloutBindingTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CalloutBindingTest.java
new file mode 100644
index 0000000..1f6f328
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CalloutBindingTest.java
@@ -0,0 +1,1279 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: CalloutBindingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * This class contains tests concerning callout bindings.
+ * 
+ * @author kaschja
+ * @version $Id: CalloutBindingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class CalloutBindingTest extends TestBase
+{
+	public CalloutBindingTest(String testName)
+	{
+		super(testName);
+	}
+
+// There are no ambiguous base-method matches (there's always a best match 
+// (one to one))
+//  
+//	/**
+//	 * A callout binding with ambiguous Base-Method Signature 
+//	 */
+//	public void testCalloutBindingAmbiguousBaseMethod1() 
+//	{
+//
+//		createFile("MyBase","public class MyBase " +
+//			  NL + "{ " +
+//			  NL + "    protected void baseMethod(short arg){}" +
+//			  NL + "    public void baseMethod(int arg){}" +
+//			  NL + "} ");
+//	      
+//		createFile("MySuperTeam","public team class MySuperTeam " +
+//			  NL + "{ " +	
+//			  NL + "	public class MyRole playedBy MyBase " +
+//			  NL + "    { " +	
+//			  NL + "	    public  void roleMethod(long arg){};" +
+//			  NL + "    } " +
+//			  NL + "}");
+//
+//		createFile("MyTeam","public team class MyTeam extends MySuperTeam" +
+//			  NL + "{ " +	
+//			  NL + "	public class MyRole" +
+//			  NL + "    { " +	
+//			  NL + "        roleMethod => baseMethod; " +
+//			  NL + "    } " +
+//			  NL + "}");
+//			  		
+//		compileFile("MyTeam");
+//		
+//		//should throw warning about ambiguous base-method
+//		assertTrue(hasExpectedProblems(new int[] { IProblem.CalloutBindingTooManyBaseMatches }));
+//	}
+//
+//	/**
+//	 * A callout binding with ambiguous Base-Method Signature 
+//	 */
+//	public void testCalloutBindingAmbiguousBaseMethod2() 
+//	{
+//
+//		createFile("MyBase","public class MyBase " +
+//			  NL + "{ " +
+//			  NL + "    public void baseMethod(long arg){}" +
+//			  NL + "    public void baseMethod(int arg){}" +
+//			  NL + "} ");
+//	      
+//		createFile("MySuperTeam","public team class MySuperTeam " +
+//			  NL + "{ " +	
+//			  NL + "	public class MyRole playedBy MyBase " +
+//			  NL + "    { " +	
+//			  NL + "	    public  void roleMethod(short arg){};" +
+//			  NL + "    } " +
+//			  NL + "}");
+//
+//		createFile("MyTeam","public team class MyTeam extends MySuperTeam" +
+//			  NL + "{ " +	
+//			  NL + "	public class MyRole" +
+//			  NL + "    { " +	
+//			  NL + "        roleMethod => baseMethod; " +
+//			  NL + "    } " +
+//			  NL + "}");
+//			  		
+//		compileFile("MyTeam");
+//		
+//		//should throw warning about ambiguous base-method
+//		assertTrue(hasExpectedProblems(new int[] { IProblem.CalloutBindingTooManyBaseMatches }));
+//	}
+//
+//	/**
+//	 * A callout binding with ambiguous Base-Method Signature 
+//	 */
+//	public void testCalloutBindingAmbiguousBaseMethod3() 
+//	{
+//
+//		createFile("MyBase","public class MyBase " +
+//			  NL + "{ " +
+//			  NL + "    public void baseMethod(String arg){}" +
+//			  NL + "    public void baseMethod(Integer arg){}" +
+//			  NL + "} ");
+//	      
+//		createFile("MySuperTeam","public team class MySuperTeam " +
+//			  NL + "{ " +	
+//			  NL + "	public class MyRole playedBy MyBase " +
+//			  NL + "    { " +	
+//			  NL + "	    public  void roleMethod(String arg){};" +
+//			  NL + "	    public  void roleMethod(Integer arg){};" +
+//			  NL + "    } " +
+//			  NL + "}");
+//
+//		createFile("MyTeam","public team class MyTeam extends MySuperTeam" +
+//			  NL + "{ " +	
+//			  NL + "	public class MyRole" +
+//			  NL + "    { " +	
+//			  NL + "        roleMethod => baseMethod; " +
+//			  NL + "    } " +
+//			  NL + "}");
+//			  		
+//		compileFile("MyTeam");
+//		
+//		//should throw warning about ambiguous base-method
+//		assertTrue(hasExpectedProblems(new int[] { IProblem.CalloutBindingTooManyBaseMatches }));
+//	}
+
+	/**
+	 * A callout binding declaration must not include a modifier 
+	 * (before/replace/after).
+	 */
+	public void testCalloutBindingDeclarationWithModifier1() 
+	{
+
+	    createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(){}" +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    public  abstract void roleMethod();" +
+			  NL + "        roleMethod -> after baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+		
+		assertTrue(hasExpectedProblems(new int[] { IProblem.UnresolvedCalloutMethodSpec, IProblem.ParsingErrorDeleteToken}));
+	}
+	
+	/**
+	 * A callout binding declaration must not include a modifier 
+	 * (before/replace/after).
+	 */
+	public void testCalloutBindingMethodArgumentWithModifier1() 
+	{
+
+	    createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(final String str){}" +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    public  abstract void roleMethod(final String str);" +
+			  NL + "        roleMethod -> after baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+
+		assertTrue(hasExpectedProblems(new int[] { IProblem.UnresolvedCalloutMethodSpec, IProblem.ParsingErrorDeleteToken}));
+	}
+	
+	/**
+	 * A role method must not be bound to a non-existing base method.
+	 */
+	public void testBindingOfNonExistingMethod1()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    public abstract void roleMethod();" +
+			  NL + "        roleMethod -> baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+
+		//TODO(SH):  this is what I expect in 3.2, but other non-resolve error msg would be acceptable, too 
+		assertTrue(hasAtLeastExpectedProblems(new int[]{ IProblem.UnresolvedCalloutMethodSpec}));		
+	}
+
+	/**
+	 * A non-existing role method must not be bound to a base method.
+	 */
+	public void testBindingOfNonExistingMethod2()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(){} " +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "        roleMethod -> baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+		
+		//TODO(SH):  this is what I expect in 3.2, but other non-resolve error msg would be acceptable, too 
+		assertTrue(hasExpectedProblems(new int[]{ IProblem.UnresolvedCalloutMethodSpec}, null ));		
+	}	
+	
+	/**
+	 * An abstract role method must not be bound with the "=>"-operator. 
+	 */
+	public void testBindingWithWrongOperator1()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(){} " +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "        public abstract void roleMethod();" +
+			  NL + "        roleMethod => baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+		
+		assertTrue(hasExpectedProblems(new int[]{ IProblem.AbstractMethodBoundAsOverride }, null ));					
+	}
+	
+	/**
+	 * A non-abstract role method must not be bound with the "->"-operator. 
+	 */
+	public void testBindingWithWrongOperator2()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(){} " +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "        public void roleMethod(){}" +
+			  NL + "        roleMethod -> baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+
+		assertFalse(isCompilationSuccessful());
+		assertTrue(hasExpectedProblems(new int[]{ IProblem.RegularCalloutOverrides, IProblem.CalloutOverridesLocal } ));		
+	}
+
+	/**
+	 * A role method must not be bound to the same base method multiple times.
+	 */
+	public void testMultipleCalloutBinding1()
+	{
+		createFile("MyBase","public class MyBase" 
+			  + NL + "{"
+			  + NL + "    public void baseMethodA(){}" 
+			  + NL + "    public void baseMethodB(){}" 
+			  + NL + "}");
+	      
+		createFile("MyTeam",
+				   "public team class MyTeam"
+			+ NL + "{ " 
+			+ NL + "	protected class MyRole playedBy MyBase" 
+			+ NL + "    { "
+			+ NL + "        public abstract void roleMethod();" 
+			+ NL + "        void roleMethod() -> void baseMethodA();" 
+			+ NL + "        void roleMethod() -> void baseMethodB();"
+			+ NL + "    } "
+			+ NL + "}");
+				
+		compileFile("MyTeam");
+		
+		assertTrue( hasExpectedProblems(new int[] { IProblem.DuplicateCalloutBinding, IProblem.DuplicateCalloutBinding} ));
+	}		
+		
+	/**
+	 * A role method must not be bound to various base methods by callout. 
+	 */
+	public void testMultipleCalloutBinding2()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethodA(){} " +
+		      NL + "    public void baseMethodB(){} " +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "        public abstract void roleMethod();" +
+			  NL + "        roleMethod -> baseMethodA; " +
+		      NL + "        roleMethod -> baseMethodB; " +
+			  NL + "    } "+
+			  NL + "}");
+				
+		compileFile("MyTeam");
+		
+		assertTrue( hasExpectedProblems(new int[] { IProblem.DuplicateCalloutBinding, IProblem.DuplicateCalloutBinding} ));
+	}
+	
+	/**
+	 * A role method must not be bound to various base methods by callout,
+	 * no matter where the binding is implemented.
+	 */
+	public void testMultipleCalloutBinding3()
+	{
+		createFile("MyBase",
+				  "public class MyBase " 
+			+ NL + "{" 
+			+ NL + "    public void baseMethodA(){}" 
+			+ NL + "    public void baseMethodB(){}" 
+			+ NL + "}");
+
+		createFile("MySuperTeam",
+				   "public team class MySuperTeam " 
+			+ NL + "{ " 
+			+ NL + "	protected class MyRole playedBy MyBase " 
+			+ NL + "    {" 
+			+ NL + "        public abstract void roleMethod();" 
+			+ NL + "        roleMethod -> baseMethodA;"  
+			+ NL + "    }"
+			+ NL + "}");
+	      
+		createFile("MyTeam",
+				   "public team class MyTeam extends MySuperTeam" 
+			+ NL + "{ "
+			+ NL + "	  protected class MyRole playedBy MyBase" 
+			+ NL + "    {" 
+//			+ NL + "        public abstract void roleMethod();" 
+			+ NL + "        roleMethod -> baseMethodB;"  
+			+ NL + "    }"
+			+ NL + "}");
+				
+		compileFile("MyTeam");
+		
+		assertTrue( hasExpectedProblems(new int[] { IProblem.RegularCalloutOverridesCallout} ));
+	}	
+
+	/**
+	 * A role method must not be bound to the same base method multiple times.
+	 */
+	public void testMultipleCalloutBinding4()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(){} " +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "        public abstract void roleMethod();" +
+			  NL + "        roleMethod -> baseMethod; " +
+			  NL + "        roleMethod -> baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+				
+		compileFile("MyTeam");
+		
+		assertTrue( hasExpectedProblems( new int[] { IProblem.DuplicateCalloutBinding, IProblem.DuplicateCalloutBinding } ));
+	}		
+
+	public void testBindingMatchingRoleBaseMethod()
+	{
+		createFile("MyException", "public class MyException extends Exception{}");
+		
+		createFile("AClass",
+				  "public class AClass {}"
+			+ NL);
+		
+		createFile("BClass",
+				  "public class BClass extends AClass{}"
+			+ NL);
+		
+		createFile("MyBase",
+				   "public class MyBase " 
+			+ NL + "{ "
+			+ NL + "    public void baseMethodAClass(AClass o){}"
+			+ NL + "}"
+			+ NL);
+	      
+		createFile("MyTeam",
+				   "public team class MyTeam "
+			+ NL + "{ "	
+			+ NL + "	protected class MyRole playedBy MyBase "
+			+ NL + "    { "	
+			+ NL + "	    public abstract void roleMethodBClass(BClass o);"
+			+ NL + "      roleMethodBClass -> baseMethodAClass;"
+			+ NL + "    } "
+			+ NL + "}"
+			+ NL);
+		
+		
+		compileFile("MyTeam");
+		
+		assertTrue( isCompilationSuccessful() );
+	}
+
+	public void testBindingMatchingRoleBaseMethod2()
+	{
+		createFile("MyException", "public class MyException extends Exception{}");
+		
+		createFile("AClass",
+				  "public class AClass {}"
+			+ NL);
+		
+		createFile("BClass",
+				  "public class BClass extends AClass{}"
+			+ NL);
+		
+		createFile("MyBase",
+				   "public class MyBase " 
+			+ NL + "{ "
+			+ NL + "    public BClass baseMethodBClassReturn(){ return null; }"
+			+ NL + "}"
+			+ NL);
+	      
+		createFile("MyTeam",
+				   "public team class MyTeam "
+			+ NL + "{ "	
+			+ NL + "	protected class MyRole playedBy MyBase "
+			+ NL + "    { "	
+			+ NL + "	    public abstract AClass roleMethodAClassReturn2();"
+			+ NL + "      roleMethodAClassReturn2 -> baseMethodBClassReturn;"
+			+ NL + "    } "
+			+ NL + "}"
+			+ NL);
+		
+		
+		compileFile("MyTeam");
+		
+		assertTrue( isCompilationSuccessful());
+	}
+
+	/**
+	 * The signatures of role method and bound base method
+	 * must have compatible declarations
+	 */
+	public void testBindingMismatchingRoleBaseMethod1()
+	{
+		createFile("MyBase",
+				   "public class MyBase " 
+			+ NL + "{ "
+			+ NL + "    public void baseMethod(int i){}"
+			+ NL + "}"
+			+ NL);
+	      
+		createFile("MyTeam",
+				   "public team class MyTeam "
+			+ NL + "{ "	
+			+ NL + "	protected class MyRole playedBy MyBase "
+			+ NL + "    { "	
+			+ NL + "	    public abstract void roleMethod();"
+			+ NL + "        roleMethod -> baseMethod; "
+			+ NL + "    } "
+			+ NL + "}"
+			+ NL);
+		
+		
+		compileFile("MyTeam");
+
+		assertTrue( hasExpectedProblems(new int[] { IProblem.TooFewArgumentsInCallout } ));
+	}
+
+	/**
+	 * The signatures of role method and bound base method
+	 * must have compatible declarations. This is the not-so-easy example!
+	 */
+	public void testBindingMismatchingRoleBaseMethod2()
+	{
+		createFile("MyException", "public class MyException extends Exception{static final long serialVersionUID=1234;}");
+		
+		createFile("AClass",
+				  "public class AClass {}"
+			+ NL);
+		
+		createFile("BClass",
+				  "public class BClass extends AClass{}"
+			+ NL);
+		
+		createFile("MyBase",
+				   "public class MyBase " 
+			+ NL + "{ "
+			+ NL + "    public void baseMethodBClass(BClass o) throws MyException{}"
+			+ NL + "}"
+			+ NL);
+	      
+		createFile("MyTeam",
+				   "public team class MyTeam "
+			+ NL + "{ "	
+			+ NL + "	protected class MyRole playedBy MyBase "
+			+ NL + "    { "	
+			+ NL + "	    public abstract void roleMethodAClass(AClass o);"
+			+ NL + "      roleMethodAClass -> baseMethodBClass;"
+			+ NL + "    } "
+			+ NL + "}"
+			+ NL);
+		
+		
+		compileFile("MyTeam");
+		assertTrue( hasExpectedProblems(new int[] { IProblem.IncompatibleMappedCalloutArgument, IProblem.CalloutUndeclaredException} ));
+	}
+
+
+	public void testBindingMismatchingRoleBaseMethod3()
+	{
+		createFile("MyException", "public class MyException extends Exception{static final long serialVersionUID=1234;}");
+		
+		createFile("AClass",
+				  "public class AClass {}"
+			+ NL);
+		
+		createFile("BClass",
+				  "public class BClass extends AClass{}"
+			+ NL);
+		
+		createFile("MyBase",
+				   "public class MyBase " 
+			+ NL + "{ "
+			+ NL + "    public void baseMethodAClass(AClass o){}"
+			+ NL + "}"
+			+ NL);
+	      
+		createFile("MyTeam",
+				   "public team class MyTeam "
+			+ NL + "{ "	
+			+ NL + "	protected class MyRole playedBy MyBase "
+			+ NL + "    { "	
+			+ NL + "	    public abstract AClass roleMethodAClassReturn1();"
+			+ NL + "      roleMethodAClassReturn1 -> baseMethodAClass;"
+			+ NL + "    } "
+			+ NL + "}"
+			+ NL);
+		
+		
+		compileFile("MyTeam");
+		
+		assertFalse( isCompilationSuccessful() );
+	}
+
+	/**
+	 * The signatures of role method and bound base method
+	 * must have conform exception declarations (throw-clauses)
+	 * 
+	 * The role method must not declare throwing an exception
+	 * while the base method does not
+	 * 
+	 * Actually, why shouldn't you be able to add a throws-clause in the role-method?
+	 * IMHO, this shouldn't be an error. (carp) 
+	 */
+	public void testBindingWithDifferentExceptionDeclarations1()
+	{
+		createFile("MyException", "public class MyException extends Exception{static final long serialVersionUID=1234;}");
+		
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(){}" +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    public abstract void roleMethod() throws MyException;" +
+			  NL + "        roleMethod -> baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());
+	}
+
+	/**
+	 * The signatures of role method and bound base method
+	 * must have conform exception declarations (throw-clauses)
+	 * 
+	 * The role method must declare throwing an exception
+	 * if the base method does
+	 */
+	public void testBindingWithDifferentExceptionDeclarations2()
+	{
+		createFile("MyException", "public class MyException extends Exception{static final long serialVersionUID=1234;}");
+		
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod() throws MyException " +
+			  NL + "    {" +
+			  NL + "        throw new MyException();" +
+			  NL + "    }" +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    public abstract void roleMethod();" +
+			  NL + "        roleMethod -> baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+		
+		assertTrue(hasExpectedProblems(new int[] {IProblem.CalloutUndeclaredException}));			
+	}
+	
+	/**
+	 * The signatures of role method and bound base method
+	 * must have conform exception declarations (throw-clauses)
+	 * 	 
+	 * The declared exceptions must not be of different types.
+	 */
+	public void testBindingWithDifferentExceptionDeclarations3()
+	{	
+		createFile("MyException", "public class MyException extends Exception{static final long serialVersionUID=1234;}");
+		createFile("YourException", "public class YourException extends Exception{static final long serialVersionUID=1234;}");
+		
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod() throws MyException " +
+		      NL + "    {" +
+			  NL + "        throw new MyException();" +
+			  NL + "    }" +			  
+			  NL + "}");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "	    public abstract void roleMethod() throws YourException;" +
+			  NL + "        roleMethod -> baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+		
+		compileFile("MyTeam");
+		
+		assertTrue(hasExpectedProblems(new int[] {IProblem.CalloutUndeclaredException}));			
+	}	
+	
+	public void testBrokenBindingDeclaration1()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod()" +
+			  NL + "    {" +
+			  NL + "    }" +			  
+			  NL + "}");
+
+		createFile("MyTeam",
+			"public team class MyTeam" +
+			NL + "{ " +	
+			NL + "	protected class MyRole playedBy MyBase " +
+			NL + "  { " +	
+			NL + "      public void roleMethod1() {}" +
+			NL + "      public void roleMethod2() {}" +
+			NL + "      public void roleMethod3() {}" +
+			NL + "      public void roleMethod4() {}" +
+			NL + "      public void roleMethod5() {}" +
+			NL + "      public void roleMethod6() {}" +
+			NL + "" +
+			NL + "      public void roleMethod11() {}" +
+			NL + "      public void roleMethod12() {}" +
+			NL + "      public void roleMethod13() {}" +
+			NL + "      public void roleMethod14() {}" +
+			NL + "      public void roleMethod15() {}" +
+			NL + "      public void roleMethod16() {}" +
+			NL + "" +
+			NL + "      void roleMethod1() -> baseMethod();" +
+			NL + "      roleMethod2() -> void baseMethod();" +
+			NL + "      roleMethod3() -> baseMethod();" +
+			NL + "      roleMethod4() -> baseMethod;" +
+			NL + "      roleMethod5 -> baseMethod();" +
+			NL + "      roleMethod6() -> baseMethod();" +
+			NL + "" +
+			NL + "      void roleMethod11 -> baseMethod;" +
+			NL + "      roleMethod12 -> void baseMethod;" +
+			NL + "      roleMethod13 -> baseMethod;" +
+			NL + "      void roleMethod14 -> void baseMethod;" +
+			NL + "      void roleMethod15() -> baseMethod;" +
+			NL + "      roleMethod16 -> void baseMethod();" +
+			NL + "  } "+
+			NL + "}");
+
+        compileFile("MyTeam");
+        
+        //TODO: km: SH, please check
+        // assertTrue( hasExpectedProblems(new int[] { IProblem.SyntaxErrorInCallout} ));
+	}
+
+	public void testRemainingAbstractMethod1()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod()" +
+			  NL + "    {" +
+			  NL + "    }" +			  
+			  NL + "}");
+
+		createFile("MyTeam",
+				 "public team class MyTeam" +
+			NL + "{ " +	
+			NL + "	protected class MyRole playedBy MyBase " +
+			NL + "  { " +	
+			NL + "      public abstract void abstractRoleMethod();" +
+			NL + "" +
+			NL + "      public abstract void roleMethod();" +
+			NL + "" +
+			NL + "      void roleMethod() -> void baseMethod();" +
+			NL + "  } "+
+			NL + "}");
+
+		compileFile("MyTeam");
+        
+		assertTrue( hasExpectedProblems(new int[] {  IProblem.AbstractMethodsInConcreteClass, IProblem.AbstractMethodInAbstractClass } ));
+	}
+
+	public void testArrayParameters1()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(int[] baseArray)" +
+			  NL + "    {" +
+			  NL + "    }" +			  
+			  NL + "}");
+
+		createFile("MyTeam",
+				 "public team class MyTeam" +
+			NL + "{ " +	
+			NL + "	protected class MyRole playedBy MyBase " +
+			NL + "  { " +	
+			NL + "      public abstract void abstractRoleMethod(int[] roleArray);" +
+			NL + "" +
+			NL + "      void abstractRoleMethod(int[] r) -> void baseMethod(int[] b);" +
+			NL + "  } "+
+			NL + "}");
+
+		compileFile("MyTeam");
+        
+		assertTrue(isCompilationSuccessful());		
+
+	}
+
+	public void testArrayParameters2()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(Object[] baseArray)" +
+			  NL + "    {" +
+			  NL + "    }" +			  
+			  NL + "}");
+
+		createFile("MyTeam",
+				 "public team class MyTeam" +
+			NL + "{ " +	
+			NL + "	protected class MyRole playedBy MyBase " +
+			NL + "  { " +	
+			NL + "      public abstract void abstractRoleMethod(Object[] roleArray);" +
+			NL + "" +
+			NL + "      void abstractRoleMethod(Object[] r) -> void baseMethod(Object[] b);" +
+			NL + "  } "+
+			NL + "}");
+
+		compileFile("MyTeam");
+        
+		assertTrue(isCompilationSuccessful());		
+
+	}
+
+	
+	public void testArrayLowering1()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(MyBase[] baseArray)" +
+			  NL + "    {" +
+			  NL + "    }" +			  
+			  NL + "}");
+
+		createFile("MyTeam",
+				 "public team class MyTeam" +
+			NL + "{ " +	
+			NL + "	protected class MyRole playedBy MyBase " +
+			NL + "  { " +	
+			NL + "      public abstract void abstractRoleMethod(MyRole[] roleArray);" +
+			NL + "" +
+			NL + "      void abstractRoleMethod(MyRole[] r) -> void baseMethod(MyBase[] b);" +
+			NL + "  } "+
+			NL + "}");
+
+		compileFile("MyTeam");
+        
+		assertTrue(isCompilationSuccessful());		
+
+	}
+	
+	/**
+	 * 	Simple test that should work.
+	 *
+	 */
+	public void testSimpleWorkingExample()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(Object obj)" +
+			  NL + "    {" +
+			  NL + "    }" +			  
+			  NL + "}");
+
+		createFile("MyTeam",
+				 "public team class MyTeam" +
+			NL + "{ " +	
+			NL + "	protected class MyRole playedBy MyBase " +
+			NL + "  { " +	
+			NL + "      public abstract void abstractRoleMethod(Object obj);" +
+			NL + "" +
+			NL + "      void abstractRoleMethod(Object obj) -> void baseMethod(Object obj);" +
+			NL + "  } "+
+			NL + "}");
+
+		compileFile("MyTeam");
+        
+		assertTrue(isCompilationSuccessful());		
+
+	}
+
+	/**
+	 * 	Simple test with static base method.
+	 */
+	public void testStaticBaseMethod()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public static void baseMethod(Object obj)" +
+			  NL + "    {" +
+			  NL + "    }" +			  
+			  NL + "}");
+
+		createFile("MyTeam",
+				 "public team class MyTeam" +
+			NL + "{ " +	
+			NL + "	protected class MyRole playedBy MyBase " +
+			NL + "  { " +	
+			NL + "      public abstract void abstractRoleMethod(Object obj);" +
+			NL + "" +
+			NL + "      void abstractRoleMethod(Object obj) -> void baseMethod(Object obj);" +
+			NL + "  } "+
+			NL + "}");
+
+		compileFile("MyTeam");
+        
+		assertTrue(isCompilationSuccessful());		
+
+	}
+	
+	/**
+	 * A common callout binding scenario consisting of a base class, a team
+	 * with a default constructor, an abstract role class, a role class with
+	 * multiple callout bindings and a main method for team instantiation.
+	 */
+	public void testCalloutBinding1() 
+	{
+		createFile("MyBase",
+					"public class MyBase" 
+			+ NL + "{" 
+			+ NL + "      public void myBaseMethod(int a)" 
+			+ NL + "      {" 
+			+ NL + "          System.out.println(\"laber\");" 
+			+ NL + "      }" 
+			+ NL + "      public void myVoidBaseMethod()" 
+			+ NL + "      {" 
+			+ NL + "          System.out.println(\"blubber\");" 
+			+ NL + "      }" 
+			+ NL + "}" 
+			+ NL);
+			
+		createFile("MyTeam",
+				   "public team class MyTeam"   
+			+ NL + "{" 
+			+ NL + "      public MyTeam()" 
+			+ NL + "      {" 
+			+ NL + "         super();"  
+			+ NL + "         Role r = new Role(new MyBase());"
+			+ NL + "         r.myCallout(3);"
+			+ NL + "         r.myAbstractCallout(4);"
+			+ NL + "         r.myAbstractInheritedVoidCallout();"
+			+ NL + "      }" 	
+			+ NL + ""
+			+ NL + "      public abstract class SuperRole" 
+			+ NL + "      {"
+            + NL + ""            
+            + NL + "          void myCallout(int a)"
+            + NL + "          {" 
+            + NL + "              System.out.println(\"Hallo\");" 
+            + NL + "          }"
+            + NL + ""            
+			+ NL + "          abstract void myAbstractInheritedVoidCallout();"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      public class Role extends SuperRole playedBy MyBase" 
+			+ NL + "      {"
+			+ NL + "          protected abstract void myAbstractCallout(int a);"
+			+ NL + ""  
+			+ NL + "          public void method()"
+			+ NL + "          {"
+			+ NL + "             System.out.println(\"normal method\"); "
+			+ NL + "          }"
+			+ NL + ""
+			+ NL + "          protected void myCallout(int a) => void myBaseMethod(int a);" 
+			+ NL + "          void myAbstractCallout(int a) -> void myBaseMethod(int a);"			
+			+ NL + "          protected void myAbstractInheritedVoidCallout() -> void myVoidBaseMethod();"			
+			+ NL + "      }"
+			+ NL + "      public static void main(String[] args){" 
+			+ NL + "         new MyTeam();" 
+			+ NL + "      };"
+			+ NL + "}"
+			+ NL);
+	
+		compileFile("MyTeam");
+	
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	public void testResultLifting1()
+	{
+		
+		createFile("MyBase",
+					"public class MyBase" 
+			+ NL + "{" 
+			+ NL + "      public MyBase foo()" 
+			+ NL + "      {" 
+			+ NL + "          return this;" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+		
+		createFile("MyTeam",
+					"public team class MyTeam"
+			+ NL + "{" 
+			+ NL + "      protected class MyRole playedBy MyBase"
+			+ NL + "      {"
+			+ NL + "            public void print() {System.out.println(\"OK\");}"
+			+ NL + "            protected abstract MyRole bar();"
+			+ NL + "            bar -> foo;"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      MyTeam()"
+			+ NL + "      {"
+			+ NL + "            MyRole r1 = new MyRole(new MyBase());"
+			+ NL + "            MyRole r2 = r1.bar();"
+			+ NL + "            r2.print();"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      public static void main(String[] args)"
+			+ NL + "      {"
+			+ NL + "            new MyTeam();"
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);
+
+		compileFile("MyTeam");
+
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	public void testResultLifting2()
+	{
+		
+		createFile("MyBase",
+					"public class MyBase" 
+			+ NL + "{" 
+			+ NL + "      public MyBase foo()" 
+			+ NL + "      {" 
+			+ NL + "          return this;" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+	
+		createFile("MyTeamInterface",
+					"public team class MyTeamInterface"
+			+ NL + "{" 
+			+ NL + "      public interface MyInterface playedBy MyBase"
+			+ NL + "      {" 
+			+ NL + "            MyInterface bar();"
+			+ NL + "      		void print();"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      protected class MyRole implements MyInterface"
+			+ NL + "      {"
+			+ NL + "            public void print() {System.out.println(\"OK\");}"
+			+ NL + "            bar -> foo;"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      MyTeamInterface()"
+			+ NL + "      {"
+			+ NL + "            MyRole r = new MyRole(new MyBase());"
+			+ NL + "            MyInterface rI = r.bar();"
+			+ NL + "            rI.print();"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      public static void main(String[] args)"
+			+ NL + "      {"
+			+ NL + "            new MyTeamInterface();"
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);
+
+		compileFile("MyTeamInterface");
+
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	public void testResultLifting3()
+	{
+		
+		createFile("MyBase",
+					"public class MyBase" 
+			+ NL + "{" 
+			+ NL + "      public MyBase foo()" 
+			+ NL + "      {" 
+			+ NL + "          return this;" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+	
+		createFile("MyBase2",
+					"public class MyBase2" 
+			+ NL + "{" 
+			+ NL + "      public MyBase2 foo()" 
+			+ NL + "      {" 
+			+ NL + "          return this;" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+
+		createFile("MyTeam",
+					"public team class MyTeam"
+			+ NL + "{" 
+			+ NL + "      abstract protected class MyInnerClass"// playedBy MyBase2"
+			+ NL + "      {" 
+			+ NL + "            protected abstract MyRole bar();"
+			+ NL + "      		public abstract void print();"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      protected class MyRole extends MyInnerClass playedBy MyBase"
+			+ NL + "      {"
+			+ NL + "            public void print() {System.out.println(\"OK\");}"
+			+ NL + "            bar -> foo;"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      MyTeam()"
+			+ NL + "      {"
+			+ NL + "            MyRole r = new MyRole(new MyBase());"
+			+ NL + "            MyInnerClass rI = r.bar();"
+			+ NL + "            rI.print();"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      public static void main(String[] args)"
+			+ NL + "      {"
+			+ NL + "            new MyTeam();"
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);
+
+		compileFile("MyTeam");
+
+		assertTrue(isCompilationSuccessful());
+	}
+
+	public void testSimpleSample()
+	{
+		
+		createFile("MyBase",
+					"public class MyBase" 
+			+ NL + "{" 
+			+ NL + "      public String getValue(int i)" 
+			+ NL + "      {" 
+			+ NL + "          return \"Hallo\";" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+
+		createFile("MyTeam",
+					"public team class MyTeam"
+			+ NL + "{" 
+			+ NL + "      protected class MyRole playedBy MyBase"
+			+ NL + "      {"
+			+ NL + "            public abstract String getValue(int i);"
+			+ NL + "            getValue -> getValue;"
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);
+
+		createFile("Main",
+					"public class Main" 
+			+ NL + "{" 
+			+ NL + "      public static void main(String[] args)" 
+			+ NL + "      {" 
+			+ NL + "          MyTeam teem = new MyTeam();" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+
+		compileFile("Main");
+
+		assertTrue(isCompilationSuccessful());
+	}
+
+
+	public void testIncompatibleReturnTypes()
+	{
+		
+		createFile("MyBase",
+					"public class MyBase" 
+			+ NL + "{" 
+			+ NL + "      public long getValue()" 
+			+ NL + "      {" 
+			+ NL + "          return 1L;" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+
+		createFile("MyTeam",
+					"public team class MyTeam"
+			+ NL + "{" 
+			+ NL + "      protected class MyRole playedBy MyBase"
+			+ NL + "      {"
+			+ NL + "            public abstract int getValue();"
+			+ NL + "            getValue -> getValue;"
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);
+
+		createFile("Main",
+					"public class Main" 
+			+ NL + "{" 
+			+ NL + "      public static void main(String[] args)" 
+			+ NL + "      {" 
+			+ NL + "          MyTeam teem = new MyTeam();" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+
+		compileFile("Main");
+
+		assertFalse(isCompilationSuccessful());
+	}
+
+
+	public void testCalloutOverrideWithCallout()
+	{
+		
+		createFile("MyBase",
+					"public class MyBase" 
+			+ NL + "{" 	
+			+ NL + "      public int getValue()" 
+			+ NL + "      {" 
+			+ NL + "          return 1;" 
+			+ NL + "      }"
+			+ NL + "      public int getValueBad()" 
+			+ NL + "      {" 
+			+ NL + "          return 666;" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+
+		createFile("MyTeam",
+					"public team class MyTeam"
+			+ NL + "{" 
+			+ NL + "      public class MyRole playedBy MyBase"
+			+ NL + "      {"
+			+ NL + "            protected abstract int getValue();"
+			+ NL + "            int getValue() -> int getValueBad();"
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);
+
+		createFile("MySubTeam",
+					"public team class MySubTeam extends MyTeam							"
+			+ NL + "{" 
+			+ NL + "      public class MyRole"
+			+ NL + "      {"
+			+ NL + "            int getValue() => int getValue();"
+			+ NL + "      }"
+			+ NL + "       public int getValue(MyBase as MyRole role) { return  role.getValue(); }"
+			+ NL + "}"
+			+ NL);
+
+		createFile("Main",
+					"public class Main" 
+			+ NL + "{" 
+			+ NL + "      public static void main(String[] args)" 
+			+ NL + "      {" 
+			+ NL + "          MySubTeam teem = new MySubTeam();" 
+			+ NL + "          System.out.println(teem.getValue(new MyBase()));" 
+			+ NL + "      }"
+			+ NL + "}"
+			+ NL);  
+
+		compileFile("Main");
+
+		assertTrue(isCompilationSuccessful());
+	}
+
+	/**
+	 * An overloaded base-method cannot be bound without specifying the full signature.
+	 */
+	public void testAmbiguousBinding1()
+	{
+		createFile("MyBase","public class MyBase " +
+			  NL + "{ " +
+			  NL + "    public void baseMethod(){} " +
+			  NL + "    protected void baseMethod(String arg){} " +
+			  NL + "} ");
+	      
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase " +
+			  NL + "    { " +	
+			  NL + "        public abstract void roleMethod();" +
+			  NL + "        roleMethod -> baseMethod; " +
+			  NL + "    } "+
+			  NL + "}");
+				
+		compileFile("MyTeam");
+		
+		assertFalse(isCompilationSuccessful());
+	}		
+
+
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CompilationUnitContainmentTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CompilationUnitContainmentTest.java
new file mode 100644
index 0000000..06a4a31
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CompilationUnitContainmentTest.java
@@ -0,0 +1,53 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: CompilationUnitContainmentTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+
+/**
+ * This class contains tests concerning compilation units.
+ *
+ * @author brcan
+ * @version $Id: CompilationUnitContainmentTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class CompilationUnitContainmentTest extends TestBase 
+{
+    public CompilationUnitContainmentTest(String testName)
+    {
+        super(testName);
+    }
+
+    /**
+	 * The compilation unit's name doesn't match with the type declaration's name.
+	 * Comment:
+	 * Just like classes in Java, the name of the team has to be identical to
+	 * the file name. 
+	 */
+    public void testInvalidCompilationUnitName1() 
+	{
+		createFile("MyTeam","public team class MyTeamWrongName {}");
+		
+		compileFile("MyTeam");
+		
+		assertFalse(isCompilationSuccessful());
+	}
+}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CopyInheritanceTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CopyInheritanceTest.java
new file mode 100644
index 0000000..02f0bee
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/CopyInheritanceTest.java
@@ -0,0 +1,216 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: CopyInheritanceTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * @author macwitte/haebor
+ */
+public class CopyInheritanceTest extends TestBase {
+
+	/**
+	 * Testcases for Copy-Inheritance
+	 */
+	public CopyInheritanceTest(String testName) {
+		super(testName);
+	}
+
+	/**
+	 * Test copy inheritance for string-array-references 
+	 */
+	public void testCopyStringArrayReferences() 
+	{
+
+     
+		createFile("MySuperTeam","public team class MySuperTeam " +
+			  NL + "{ " +	
+			  NL + "	public class MyRole" +
+			  NL + "    { " +	
+			  NL + "	    String[] strArray;" +
+			  NL + "	    public  void roleMethod()" +
+		      NL + "	    {" +
+			  NL + "	    	strArray = new String[1];" +
+			  NL + "	    	strArray[0] = \"adsf\";" +
+			  NL + "	    }" +
+			  NL + "    } " +
+			  NL + "}");
+
+		createFile("MyTeam","public team class MyTeam extends MySuperTeam" +
+			  NL + "{ " +	
+			  NL + "}");
+		  		
+		compileFile("MyTeam");
+	
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	/**
+	 * Test copy inheritance for role-array-references 
+	 */
+	public void testCopyRoleArrayReferences() 
+	{
+
+     
+		createFile("MySuperTeam","public team class MySuperTeam " +
+			  NL + "{ " +	
+			  NL + "	public class MyRole" +
+			  NL + "    { " +	
+			  NL + "	    MyRole[] roleArray;" +
+			  NL + "	    public  void roleMethod()" +
+			  NL + "	    {" +
+			  NL + "	    	roleArray = new MyRole[1];" +
+			  NL + "	    	roleArray[0] = new MyRole();" +
+			  NL + "	    }" +
+			  NL + "    } " +
+			  NL + "}");
+
+		createFile("MyTeam","public team class MyTeam extends MySuperTeam" +
+			  NL + "{ " +	
+			  NL + "}");
+		  		
+		compileFile("MyTeam");
+	
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	/**
+	 * Test copy inheritance for int-array-references 
+	 */
+	public void testCopyIntArrayReferences() 
+	{
+
+     
+		createFile("MySuperTeam","public team class MySuperTeam " +
+			  NL + "{ " +	
+			  NL + "	public class MyRole" +
+			  NL + "    { " +	
+			  NL + "	    int[] intArray;" +
+			  NL + "	    public  void roleMethod()" +
+			  NL + "	    {" +
+			  NL + "	    	intArray = new int[1];" +
+			  NL + "	    	intArray[0] = 42;" +
+			  NL + "	    }" +
+			  NL + "    } " +
+			  NL + "}");
+
+		createFile("MyTeam","public team class MyTeam extends MySuperTeam" +
+			  NL + "{ " +	
+			  NL + "}");
+		  		
+		compileFile("MyTeam");
+	
+		assertTrue(isCompilationSuccessful());
+	}	
+
+	/**
+	 * Test copy inheritance for array-length-field access 
+	 */
+	public void testCopyIntArrayLengthFieldAccess() 
+	{
+
+		createFile("MySuperTeam","public team class MySuperTeam " +
+			  NL + "{ " +	
+			  NL + "	public class MyRole" +
+			  NL + "    { " +	
+			  NL + "	    int[] intArray;" +
+			  NL + "	    public  void roleMethod()" +
+			  NL + "	    {" +
+			  NL + "	    	intArray = new int[42];" +
+			  NL + "	    	intArray[0] = intArray.length;" +
+			  NL + "	    }" +
+			  NL + "    } " +
+			  NL + "}");
+
+		createFile("MyTeam","public team class MyTeam extends MySuperTeam" +
+			  NL + "{ " +	
+			  NL + "}");
+		  		
+		compileFile("MyTeam");
+	
+		assertTrue(isCompilationSuccessful());
+	}	
+
+
+	/**
+	 * Test copy inheritance with missing import in subclass 
+	 */
+	public void testMissingImport1() 
+	{
+		createFile("MySuperTeam","" +
+			  NL + "public team class MySuperTeam " +
+			  NL + "{ " +	
+			  NL + "	public class MyRole {}" +
+			  NL + "}");
+
+		createFile("MyTeam","" +
+			  NL + "public team class MyTeam extends MySuperTeam" +
+			  NL + "{ " +	
+			  NL + "	public class MyRole" +
+			  NL + "    { " +	
+			  NL + "	    BigDecimal roleMethod()" +
+			  NL + "	    {" +
+			  NL + "	    	return null;" +
+			  NL + "	    }" +
+			  NL + "    } " +			  
+			  NL + "}");
+		  		
+		compileFile("MyTeam");
+	
+		assertFalse(isCompilationSuccessful());
+	}	
+
+	/**
+	 * Test copy inheritance with missing import in subclass 
+	 */
+	public void testMissingImport2() 
+	{
+		createFile("MySuperTeam","" +
+			  NL + "public team class MySuperTeam " +
+			  NL + "{ " +	
+			  NL + "	public class MyRole {" +
+			  //NL + "       public void method(){}" +
+			  NL + "    }" +
+			  NL + "}");
+
+		createFile("MyTeam","" +
+			  NL + "public team class MyTeam extends MySuperTeam" +
+			  NL + "{ " +	
+			  NL + "	public class MyRole" +
+			  NL + "    { " +	
+			  NL + "	    BigDecimal roleMethod()" +
+			  NL + "	    {" +
+			  NL + "	    	return null;" +
+			  NL + "	    }" +
+			  NL + "	    void roleMethod1()" +
+			  NL + "	    {" +
+			  NL + "	    	return null;" +
+			  NL + "	    }" +
+
+			  NL + "    } " +			  
+			  NL + "}");
+		  		
+		compileFile("MyTeam");
+	
+		assertFalse(isCompilationSuccessful());
+	}	
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/ExternalRoleTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/ExternalRoleTest.java
new file mode 100644
index 0000000..794249f
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/ExternalRoleTest.java
@@ -0,0 +1,152 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: ExternalRoleTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import java.io.File;
+
+import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * @author macwitte
+ */
+public class ExternalRoleTest extends TestBase implements IOTConstants{
+
+	public ExternalRoleTest(String testName)
+	{
+		super(testName);
+	}
+
+	/**
+	 * Test for external defined role with special team-package declaration
+	 */
+	public void testExternalRoleWithCompiledTeam()
+	{
+		createFile("MyRole","team package MyTeam;" + 
+				NL + "public class MyRole {" +
+				NL + "}");
+		
+		createFile("MyTeam","public team class MyTeam { " +
+                NL + "      private MyRole r = null;" +
+				NL + "}");
+	
+		compileFile("MyTeam");
+        assertTrue(isCompilationSuccessful());
+
+		compileFile("MyTeam"+File.separator+"MyRole");			
+		assertTrue(isCompilationSuccessful());
+	}
+
+	/**
+	 * Test for external defined role with special team-package declaration
+	 */
+	public void testExternalRoleWithUncompiledTeam()
+	{
+		createFile("MyRole","team package MyTeam;" + 
+						NL + "public class MyRole {" +
+                        NL + "    void foo() { System.out.println(MyTeam.this); }" +
+						NL + "}");
+						
+		createFile("MyTeam","public team class MyTeam { " +
+                        NL + "      private MyRole r = null;" +
+						NL + "}");
+		
+		compileFile("MyTeam"+File.separator+"MyRole");
+		assertTrue(isCompilationSuccessful());
+	}
+
+	/**
+	 * Test for external defined role with special team-package declaration
+	 */
+	public void testExternalRoleWithQualifiedPackageName()
+	{
+		createFile("MyRole","team package org.eclipse.objectteams.MyTeam;" + 
+						NL + "public class MyRole {" +
+						NL + "}");
+						
+		createFile("MyTeam","package org.eclipse.objectteams;" +
+						NL + "public team class MyTeam { " +
+                        NL + "      private MyRole r = null;" +
+						NL + "}");
+		
+		compileFile("org"+File.separator+"objectteams"+File.separator+"MyTeam"+File.separator+"MyRole");
+        assertTrue(isCompilationSuccessful());
+
+		compileFile("org"+File.separator+"objectteams"+File.separator+"MyTeam");
+		assertTrue(isCompilationSuccessful());
+	}
+
+	/**
+	 * Test for external defined role with special team-package declaration
+	 * Expected Team has missing team Modifier
+	 */
+	public void testExternalRoleWithMissingTeamModifier()
+	{
+		createFile("MyRole","team package MyTeam;" + 
+						NL + "public class MyRole {" +
+						NL + "}");
+						
+		createFile("MyTeam","public class MyTeam { " +
+                        NL + "      private MyRole r = null;" +
+						NL + "}");
+		
+		compileFile("MyTeam"+File.separator+"MyRole");
+		assertFalse(isCompilationSuccessful());
+	}
+	
+	/**
+	 * Test for external defined role with special team-package declaration
+	 * Expected Team does not exist
+	 */
+	public void testExternalRoleWithMissingTeam()
+	{
+		createFile("MyRole","team package MyTeam;" + 
+						NL + "public class MyRole {" +
+						NL + "}");
+								
+		compileFile("MyTeam"+File.separator+"MyRole");
+		assertFalse(isCompilationSuccessful());
+	}		
+	
+	//http://nevermind.cs.tu-berlin.de/~gis/ot/2.4.2-otjld-inaccessible-base-class-9.html
+	public void inaccessiblebaseclass()
+	{
+		createFile("MyClass","package p1;"+
+						NL + "public class MyClass {"+
+						NL + " class InnerClass {}"+
+						NL + "}");
+		
+		createFile("MyTeam","package p2;"+
+						NL + "public team class MyTeam {"+
+						NL + "public class MyRole extends p1.MyClass playedBy InnerClass {}"+
+						NL + "}");
+	
+		compileFile("p1"+File.separator+"MyClass");
+        assertTrue(isCompilationSuccessful());
+
+		compileFile("p2"+File.separator+"MyTeam");			
+		assertFalse(isCompilationSuccessful());
+	
+	}
+	
+
+		
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/LiftingTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/LiftingTest.java
new file mode 100644
index 0000000..4039e8f
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/LiftingTest.java
@@ -0,0 +1,96 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: LiftingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * This class contains tests concerning the Lifting mechanism in ObjectTeams.
+ *
+ * @author brcan
+ * @version $Id: LiftingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class LiftingTest extends TestBase implements IOTConstants
+{
+    public LiftingTest(String testName)
+    {
+        super(testName);
+    }
+
+    /**
+	 * A test for declared lifting.
+	 */
+	public void testDeclaredLifting1()
+	{
+		createFile("MyBase","public class MyBase {}");
+		
+		createFile("MyTeam","public team class MyTeam { " +
+				NL + "	    protected class MyRole playedBy MyBase {" +
+				NL + "	    }" +
+				NL + "	    public void method(MyBase as MyRole obj){" +
+				NL + "		    System.out.println(\"method(\"+obj+\")\");" +
+				NL + "	}" +
+				NL + "  public static void main (String[] args) {" +
+				NL + "      (new MyTeam()).method(new MyBase());" +
+				NL + "  }"+
+				NL + "}");
+		
+		compileFile("MyTeam");
+			
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A test for smart lifting.
+	 */
+	public void testSmartLifting1()
+	{
+		createFile("Base2", "public class Base2 {}");
+		
+		createFile("Base3", "public class Base3 extends Base2{}");
+    	
+		createFile("MyTeam","public team class MyTeam extends org.objectteams.Team {" +
+				NL + "  public static void main(String[] args){" +
+				NL +	"       System.out.println(\"MyTeam\");" +
+				NL +		"       new MyTeam();" +
+				NL +		"  }" +
+				NL +		"	public MyTeam() {" +
+				NL +		"       super();" +
+				NL +		"		System.out.println(\"MyTeam.MyTeam()\");" +
+				NL +		"       System.out.println("+new String(_OT_LIFT_TO)+OT_DELIM+"Role2(this, new Base2(), 0));" +
+				NL +		"	}" +										
+				NL +		"	public class Role1 {}" +													
+				NL +		"	public class Role2 extends Role1 playedBy Base2{}" +
+				NL +		"   public class Role3 extends Role2 playedBy Base3{}" +
+				NL +		"   public class Role4 extends Role3 playedBy Base3{}" +
+				NL +	"   public class Role6 extends Role4 playedBy Base3{}" +							        										
+				NL +		"   public class Role5 extends Role4 playedBy Base3{}" +
+				NL +		"}");
+		
+		compileFile("MyTeam");
+		
+        // TODO (SH): what problem expected? definite ambiguity 7.3(b)? 
+        // need to replace explicit lift-invocation with some legal syntax.
+		assertFalse(isCompilationSuccessful());
+	}
+}
+
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/LoweringTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/LoweringTest.java
new file mode 100644
index 0000000..33c0690
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/LoweringTest.java
@@ -0,0 +1,153 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: LoweringTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * This class contains tests concerning the Lowering mechanism in ObjectTeams.
+ *
+ * @author brcan
+ * @version $Id: LoweringTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class LoweringTest extends TestBase
+{
+    public LoweringTest(String testName)
+    {
+        super(testName);
+    }
+
+    /**
+	 * Testing arraylowering; simple structure of classes, 
+	 * complex lowering.
+	 */
+	public void testArrayLowering1() 
+	{
+		createFile("MyBase","public class MyBase" 
+			+ NL + "{" 
+			+ NL + ""  
+			+ NL + "      public void myBaseLowerMethod(MyBase[][] b1, MyBase[][] b2)" 
+			+ NL + "      {" 
+			+ NL + "      }" 
+			+ NL + "}" 
+			+ NL);
+
+		createFile("MyTeam",
+				   "public team class MyTeam"   
+			+ NL + "{" 
+			+ NL + ""  	
+			+ NL + "      public class Role playedBy MyBase" 
+			+ NL + "      {"
+			+ NL + "" 
+			+ NL + "          abstract void myLoweringCallout(Role[][] r1, Role[][] r2);"
+			+ NL + ""  
+			+ NL + "          void myLoweringCallout(Role[][] r1, Role[][] r2) -> void myBaseLowerMethod(MyBase[][] r1, MyBase[][] r2);"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      public static void main(String[] args){"
+			+ NL + "        new MyTeam();"
+			+ NL + "      }" 
+			+ NL + "}"
+			+ NL);
+		
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A test for lowering.
+	 */
+	public void testLowering1() 
+	{
+		createFile("MyBase","public class MyBase" 
+			+ NL + "{" 
+			+ NL + "      public void myBaseMethod(int a)" 
+			+ NL + "      {" 
+			+ NL + "          System.out.println(\"normal\");" 
+			+ NL + "      }"
+			+ NL + ""  
+			+ NL + "      public int myBaseLowerMethod(MyBase b)" 
+			+ NL + "      {" 
+			+ NL + "          System.out.println(\"lowered\");" 
+			+ NL + "          return 5;"
+			+ NL + "      }" 
+			+ NL + "}" 
+			+ NL);
+
+		createFile("MyBase2","public class MyBase2 extends MyBase" 
+			+ NL + "{" 
+			+ NL + "      public void myBaseMethod(int a)" 
+			+ NL + "      {" 
+			+ NL + "          System.out.println(\"normal\");" 
+			+ NL + "      }"
+			+ NL + ""  
+			+ NL + "      public int myBaseLowerMethod(MyBase b)" 
+			+ NL + "      {" 
+			+ NL + "          System.out.println(\"lowered\");"
+			+ NL + "          return 5;" 
+			+ NL + "      }" 
+			+ NL + "}" 
+			+ NL);
+						
+		createFile("MyTeam",
+				   "public team class MyTeam extends org.objectteams.Team"   
+			+ NL + "{" 
+			+ NL + "      public MyTeam()" 
+			+ NL + "      {" 
+			+ NL + "         Role r = new Role(new MyBase());"
+			+ NL + "         r.myCallout(4);"
+			+ NL + "      }"
+			+ NL + ""  	
+			+ NL + "      public class Role0" 
+			+ NL + "      {"
+			+ NL + "" 
+			+ NL + "          void myCallout(int a)"
+			+ NL + "          {" 
+			+ NL + "              System.out.println(\"Hallo\");" 
+			+ NL + "          }"
+			+ NL + "      }"
+			+ NL + ""  
+			+ NL + "      public class Role extends Role0 playedBy MyBase" 
+			+ NL + "      {"
+			+ NL + "" 
+			+ NL + "          abstract int myLoweringCallout(Role r);"
+			+ NL + ""  
+			+ NL + "          void myCallout(int a) => void myBaseMethod(int a);" 			
+			+ NL + "          int myLoweringCallout(Role r) -> int myBaseLowerMethod(MyBase r);"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      public class Role2 playedBy MyBase2" 
+			+ NL + "      {"
+			+ NL + "      }"
+			+ NL + ""
+			+ NL + "      public static void main(String[] args){"
+			+ NL + "        new MyTeam();"
+			+ NL + "      }" 
+			+ NL + "}"
+			+ NL);
+		
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());
+	}
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/ParameterMappingsTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/ParameterMappingsTest.java
new file mode 100644
index 0000000..34e11a6
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/ParameterMappingsTest.java
@@ -0,0 +1,215 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: ParameterMappingsTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * This class contains tests concerning the parameter mappings in callin and
+ * callout bindings. 
+ *
+ * @author brcan
+ * @version $Id: ParameterMappingsTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class ParameterMappingsTest extends TestBase
+{
+    public ParameterMappingsTest(String testName)
+    {
+        super(testName);
+    }
+
+	/**
+	 * A base method with a parameter is used in a callout binding.
+	 */
+	public void testCalloutParameterMappingResult1()
+	{
+		createFile("MyBase",
+				   "public class MyBase {                          \r\n"+
+				   "    public int baseMethod() { return 2; }    \r\n"+
+				   "}                                              \r\n"
+		);
+	
+		createFile("SuperRoleClass",
+				   "public class SuperRoleClass {                  \r\n"+
+				   "    public int roleMethod() { return 1000; }   \r\n"+
+				   "}                                              \r\n"
+		);
+	
+		createFile("MyTeam",
+					"public team class MyTeam {                    \r\n"+
+					"	protected class MyRole extends SuperRoleClass playedBy MyBase {             \r\n"+
+					"		int roleMethod() => int baseMethod() with { \r\n"+
+					"			result <- result * 5               \r\n"+
+					"		}	                                   \r\n"+
+					"	}                                          \r\n"+
+					"}											   \r\n"
+		);
+		
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());		
+	}
+
+    /**
+	 * A base method with a parameter is used in a callout binding.
+	 */
+	public void testCalloutParameterMappings1()
+	{
+		createFile("MyBase",
+				   "public class MyBase {                          \r\n"+
+				   "    public void baseMethod(boolean valueB) {}    \r\n"+
+				   "}                                              \r\n"
+		);
+	
+		createFile("MyTeam",
+					"public team class MyTeam {                    \r\n"+
+					"	protected class MyRole playedBy MyBase {             \r\n"+
+					"		public abstract void roleMethod(int valueA); \r\n"+
+					"		void roleMethod(int valueA) -> void baseMethod(boolean valueB) with { \r\n"+
+					"			valueA == 1 -> valueB            \r\n"+
+					"		}	                                   \r\n"+
+					"	}                                          \r\n"+
+					"}											   \r\n"
+		);
+		
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());		
+	}
+
+	/**
+	 * A base method with a parameter is used in a callin binding.
+	 */
+	public void testCallinParameterMappings1()
+	{
+		createFile("MyBase",
+				   "public class MyBase {                          \r\n"+
+				   "    public void baseMethod(float valueB) {}    \r\n"+
+				   "}                                              \r\n"
+		);
+	
+		createFile("MyTeam",
+					"public team class MyTeam {                    \r\n"+
+					"	protected class MyRole playedBy MyBase {             \r\n"+
+					"		public void roleMethod(float valueA) { \r\n"+
+					"		}	                                   \r\n"+
+					"		void roleMethod(float valueA) <- before void baseMethod(float valueB) with { \r\n"+
+					"			valueA <- valueB * 3.14f            \r\n"+
+					"		}	                                   \r\n"+
+					"	}                                          \r\n"+
+					"}											   \r\n"
+		);
+		
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());		
+	}
+	
+	/**
+	 * A base method with a parameter list is used in a callout binding.
+	 */
+	public void testCalloutParameterMappingList1()
+	{
+		createFile("MyBase",
+				   "public class MyBase {						   \r\n"+
+				   "    public void baseMethod(float valueB, float valueC) {	   \r\n"+
+				   "	}										   \r\n"+
+				   "}                                              \r\n"
+		);
+	
+		createFile("MyTeam",
+					"public team class MyTeam{					   \r\n"+
+					"	protected class MyRole playedBy MyBase {             \r\n"+
+					"		public abstract void roleMethod(float valueA); \r\n"+
+					"		void roleMethod(float valueA) -> void baseMethod(float valueB, float valueC) with {	\r\n"+
+					"			valueA * 3.14f -> valueB ,		   \r\n"+
+					"			valueA * 3.14f -> valueC		   \r\n"+
+					"		}									   \r\n"+
+					"	}										   \r\n"+
+					"}											   \r\n"
+		);
+		
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());		
+	}
+
+	/**
+	 * A base method with a parameter list is used in a callin binding.
+	 */
+	public void testCallinParameterMappingList1()
+	{
+		createFile("MyBase",
+				   "public class MyBase {						   \r\n"+
+				   "    public void baseMethod(float valueB, float valueC) {	   \r\n"+
+				   "	}										   \r\n"+
+				   "}                                              \r\n"
+		);
+	
+		createFile("MyTeam",
+					"public team class MyTeam{					   \r\n"+
+					"	protected class MyRole playedBy MyBase {             \r\n"+
+					"		public void roleMethod(float valueA) { \r\n"+
+					"		}									   \r\n"+
+					"		void roleMethod(float valueA) <- after void baseMethod(float valueB, float valueC) with {	\r\n"+
+					"			valueA <- valueC * 3.14f		   \r\n"+
+					"		}									   \r\n"+
+					"	}										   \r\n"+
+					"}											   \r\n"
+		);
+	
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());
+	}
+
+
+	/**
+	 * Broken callin-binding:
+	 * the base-method's argument list is different from the one in the binding declaration. 
+	 */
+	public void testCallinParameterMappingList2()
+	{
+		createFile("MyBase",
+				   "public class MyBase {						   \r\n"+
+				   "    public void baseMethod(float valueB) {	   \r\n"+
+				   "	}										   \r\n"+
+				   "}                                              \r\n"
+		);
+	
+		createFile("MyTeam",
+					"public team class MyTeam{					   \r\n"+
+					"	protected class MyRole playedBy MyBase {             \r\n"+
+					"		public void roleMethod(float valueA) { \r\n"+
+					"		}									   \r\n"+
+					"		void roleMethod(float valueA) <- replace void baseMethod(float valueB, float valueC) with {	\r\n"+
+					"			valueA <- valueB * 3.14,		   \r\n"+
+					"			valueA <- valueC * 3.14			   \r\n"+
+					"		}									   \r\n"+
+					"	}										   \r\n"+
+					"}											   \r\n"
+		);
+	
+		compileFile("MyTeam");
+		
+		assertFalse(isCompilationSuccessful());
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/ParserTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/ParserTest.java
new file mode 100644
index 0000000..ec186d1
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/ParserTest.java
@@ -0,0 +1,125 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: ParserTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * This class contains tests concerning the parser.
+ *
+ * @author brcan
+ * @version $Id: ParserTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class ParserTest extends TestBase
+{
+    public ParserTest(String testName)
+    {
+        super(testName);
+    }
+
+    /**
+	 * A test consisting of a main class, a base class, a team with two
+	 * methods (team-level methods) and a role which has a callin method
+	 * and a callin + callout binding.
+	 */
+// TODO(jwl): What is the gist we are actually testing here?
+    public void testParser()
+	{
+		createFile("Main",
+			"public class Main"
+			+ NL + "{"
+			+ NL + "    public static void main(String[] args)"
+			+ NL + "    {"
+			+ NL + "        MyClass baseObj      = new MyClass();"
+			+ NL + "        MyTeam  teamInstance = new MyTeam();"    	
+			+ NL + "        within(teamInstance)"
+			+ NL + "    	   {"
+			+ NL + "            System.out.println();"
+			+ NL + "            System.out.println(\" Main.main --> MyTeam.whisper Hello \");"
+			+ NL + "            teamInstance.whisper(baseObj, \"Hello\");"
+			+ NL + "        }"
+			+ NL + "    }"
+			+ NL + "}");
+						
+		createFile("MyClass",
+			"public class MyClass	"
+		    + NL + "{"
+		    + NL + "    public void say(String msg)"
+		    + NL + "    {"
+		    + NL + "        System.out.println(\" MyBase says : \" + msg);"
+		    + NL + "    }"    
+		    + NL + "    public void whisper(String msg)"
+		    + NL + "    {"
+		    + NL + "        System.out.println(\" MyBase whispers : \" + msg);"
+		    + NL + "    }"
+		    + NL + "}");						
+				
+		createFile("MyTeam",
+			"public team class MyTeam"
+		    + NL + "{"
+		    + NL + "    public class MyRole playedBy MyClass"
+		    + NL + "    {"
+		    + NL + "        callin void say(String msg)"
+		    + NL + "        {"
+		    + NL + "            System.out.println(\" MyRole says : \" + msg);"
+		    + NL + "            base.say(msg);"
+		    + NL + "        }"
+		    + NL + "        say <- replace whisper;"
+		    + NL + "        public abstract void whisper(String msg);"
+		    + NL + "        whisper -> whisper;"
+		    + NL + "    }"
+		    + NL + "    public void say(String msg)"
+		    + NL + "    {"
+		    + NL + "        System.out.println(\" MyTeam says : \" + msg);"
+		    + NL + "    }"
+		    + NL + "    public void whisper(MyClass as MyRole role, String msg)"
+		    + NL + "	   {"
+		    + NL + "        System.out.println(\" MyTeam whispers : \" + msg );"
+		    + NL + "        role.whisper(msg);"
+		    + NL + "    }"
+		    + NL + "}");
+		
+		compileFile("Main");
+
+		assertTrue(isCompilationSuccessful());
+	}
+    
+    public void testScopedKeywordJavadoc()
+	{
+		createFile("Main",
+			"public class Main"
+			+ NL + "{"
+			+ NL + "    /**"
+			+ NL + "     * @param base an input"
+			+ NL + "     */"
+			+ NL + "    public void foo(String base)"
+			+ NL + "    {"
+			+ NL + "        System.out.println(base);"
+			+ NL + "    }"
+			+ NL + "}");
+						
+
+		
+		compileFile("Main");
+
+		assertTrue(isCompilationSuccessful());
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/RoleBaseInheritanceTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/RoleBaseInheritanceTest.java
new file mode 100644
index 0000000..c1eba20
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/RoleBaseInheritanceTest.java
@@ -0,0 +1,255 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: RoleBaseInheritanceTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+
+/**
+ * Tests the relationship between role and base classes.
+ * 
+ * @author kaschja
+ * @version $Id: RoleBaseInheritanceTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class RoleBaseInheritanceTest extends TestBase
+{
+    public RoleBaseInheritanceTest(String testName)
+    {
+        super(testName);
+    }
+
+    /**
+	 * A role class must not be bound to a non-existing base class.
+	 */
+	public void testBindingOfNonExistingBaseClass1() 
+	{
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +
+		      NL + "	class MyRole playedBy NonExistingBase " +
+		      NL + "    { " +
+			  NL + "	} " +
+			  NL + "}");
+	
+		compileFile("MyTeam");
+	
+		assertFalse(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A regular class (non-team) must not be bound to a base class. 
+	 */
+	public void testBindingRegularClassWithBaseClass1()
+	{
+		createFile("MyBase","public class MyBase {}");
+		
+		createFile("MyClass","public class MyClass " +
+				NL + "{" +
+				NL + "		class MyRole playedBy MyBase {}" +
+				NL + "}");
+				
+        compileFile("MyClass");    
+                    
+		assertFalse(isCompilationSuccessful());	
+	}
+
+	/**
+	 * A role class must not be bound to a primitive type.
+	 * In this testing sample the primitive type is int.
+	 */
+	public void testBindingOfPrimitiveType1()
+	{
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +
+			  NL + "	class MyRole playedBy int " +
+			  NL + "    { " +
+			  NL + "	} " +
+			  NL + "}");
+	
+		compileFile("MyTeam");
+	
+		assertFalse(isCompilationSuccessful());		
+	}
+	
+	/**
+	 * A role class must not be bound to an array.
+	 * In this testing sample the array element type is the primitive type int.
+	 */
+	public void testBindingOfArrayType1()
+	{
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +
+			  NL + "	class MyRole playedBy int[] " +
+			  NL + "    { " +
+			  NL + "	} " +
+			  NL + "}");
+	
+		compileFile("MyTeam");
+	
+		assertFalse(isCompilationSuccessful());		
+	}
+	
+	/**
+	 * A role class must not be bound to an array.
+	 * In this testing sample the array element type is a class type.
+	 */
+	public void testBindingOfArrayType2()
+	{
+		createFile("MyBase", "public class MyBase{}");
+		
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +
+			  NL + "	class MyRole playedBy MyBase[] " +
+			  NL + "    { " +
+			  NL + "	} " +
+			  NL + "}");
+	
+		compileFile("MyTeam");
+	
+		assertFalse(isCompilationSuccessful());		
+	}
+	
+		
+	/**
+	 * A role class must not be bound to a base class
+	 * if both classes have identical names
+	 * In this testing sample the classes reside in the same package
+	 */
+	public void testBindingWithNamingClash1()
+	{
+		createFile("Role", "public class Role{}");
+		
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +
+			  NL + "	class Role playedBy Role " +
+			  NL + "    { " +
+			  NL + "	} " +
+			  NL + "}");
+	
+		compileFile("MyTeam");
+	
+		assertFalse(isCompilationSuccessful());		
+	}
+	
+
+//TODO fix problem with creating packages with method TestBase.createFile	
+	/**
+	 * A role class must not be bound to a base class
+	 * if both classes have identical names
+	 * In this testing sample the classes reside in different packages
+	 */
+//	public void testBindingWithNamingClash2()
+//	{
+//		createFile("basepackage/Role", "package basepackage;\npublic class Role{}");
+//		
+//		createFile("teampackage/MyTeam",
+//                   "package teampackage;" +
+//			  NL + "public team class MyTeam " +
+//			  NL + "{ " +
+//			  NL + "	class Role playedBy Role " +
+//			  NL + "    { " +
+//			  NL + "	} " +
+//			  NL + "}");
+//	
+//		compileFile("MyTeam");
+//	
+//		assertFalse(isCompilationSuccessful());		
+//	}	
+	
+	/**
+	 * A role class must not be bound to a base class
+	 * if there is another role in the same team
+	 * which has the same name as the bound base class.
+	 */
+	public void testBindingWithNamingClash3()
+	{
+		createFile("RoleB", "public class RoleB{}");
+		
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +
+			  NL + "	class RoleA playedBy RoleB" +
+			  NL + "    { " +
+			  NL + "	} " +
+		      NL + "	class RoleB" +
+			  NL + "    { " +
+			  NL + "	} " + 			  
+			  NL + "}");
+	
+		compileFile("MyTeam");
+	
+		assertFalse(isCompilationSuccessful());		
+	}	
+
+	/**
+	 * A role class must not be bound to a base class
+	 * if there is a role in a superteam
+	 * which has the same name as the bound base class.
+	 */
+	public void testBindingWithNamingClash4()
+	{
+		createFile("RoleB", "public class RoleB{}");
+
+		createFile("Superteam","public team class Superteam " +
+			  NL + "{ " +
+			  NL + "	class RoleB" +
+			  NL + "    { " +
+			  NL + "	} " +		  
+			  NL + "}");
+		
+		createFile("Subteam","public team class Subteam extends Superteam" +
+			  NL + "{ " +
+			  NL + "	class RoleA playedBy RoleB" +
+			  NL + "    { " +
+			  NL + "	} " +  
+			  NL + "}");
+	
+		compileFile("Subteam");
+	
+		assertFalse(isCompilationSuccessful());		
+	}	
+	
+	/**
+	 * A role class must not be bound to a base class
+	 * if there is a role in a subteam
+	 * which has the same name as the bound base class.
+	 */
+	public void testBindingWithNamingClash5()
+	{
+		createFile("RoleB", "public class RoleB{}");
+		
+		createFile("Superteam","public team class Superteam " +
+			  NL + "{ " +
+			  NL + "	class RoleA playedBy RoleB" +
+			  NL + "    { " +
+			  NL + "	} " +		  
+			  NL + "}");
+			  
+		createFile("Subteam","public team class Subteam extends Superteam" +
+			  NL + "{ " +
+			  NL + "	class RoleB" +
+			  NL + "    { " +
+			  NL + "	} " +		  
+			  NL + "}");			  
+
+		compileFile("Subteam");
+	
+		assertFalse(isCompilationSuccessful());		
+	}				
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/RoleContainmentTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/RoleContainmentTest.java
new file mode 100644
index 0000000..4c1a890
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/RoleContainmentTest.java
@@ -0,0 +1,56 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: RoleContainmentTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * This class contains tests concerning roles.
+ * 
+ * @author kaschja
+ * @version $Id: RoleContainmentTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class RoleContainmentTest extends TestBase
+{	
+    public RoleContainmentTest(String testName)
+    {
+        super(testName);
+    }
+
+    /**
+	 * A role that is not declared as abstract contains an abstract method.
+	 * Comment:
+	 * A role has to be declared as abstract if it contains an abstract method. 
+	 */
+	public void testAbstractMethodInNonAbstractRole1() 
+	{
+		createFile("MyTeam","public team class MyTeam { " +
+				NL + "	protected class MyRole {" +
+				NL + "	    public abstract void roleMethod();" +
+				NL + "  }"+
+				NL + "}");
+		
+		compileFile("MyTeam");
+		
+		assertTrue(hasExpectedProblems(new int[] { IProblem.AbstractMethodsInConcreteClass, IProblem.AbstractMethodInAbstractClass } ));
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/RoleInheritanceTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/RoleInheritanceTest.java
new file mode 100644
index 0000000..330165b
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/RoleInheritanceTest.java
@@ -0,0 +1,357 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: RoleInheritanceTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * This class contains tests concerning role inheritance.
+ * 
+ * @author kaschja
+ * @version $Id: RoleInheritanceTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class RoleInheritanceTest extends TestBase
+{
+    public RoleInheritanceTest(String testName)
+    {
+        super(testName);
+    }
+
+    /** 
+	 * A role extends explicitly a role of a foreign team (non-superteam).
+	 * Both roles have the same name.
+	 * Comment: 
+	 * A role can only extend explicitly another role of the same team.
+	 */
+	public void testRoleExtendsRoleWithSameNameOfForeignTeam1() 
+	{
+		createFile("TeamA","public team class TeamA " +
+			  NL + "{ " +	
+			  NL + "	protected class Role {} " +
+			  NL + "}");
+		
+		createFile("TeamB","public team class TeamB " +
+			  NL + "{ " +	
+			  NL + "	protected class Role extends TeamA.Role {} " +
+			  NL + "}");
+				
+		compileFile("TeamB");
+		
+		assertFalse(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A role extends explicitly a role of a foreign team (non-superteam).
+	 * Comment: 
+	 * A role can only extend explicitly another role of the same team.
+	 */
+	public void testRoleExtendsRoleOfForeignTeam1() 
+	{
+		createFile("TeamA","public team class TeamA " +
+			  NL + "{ " +	
+			  NL + "	protected class RoleA {} " +
+			  NL + "}");
+	
+		createFile("TeamB","public team class TeamB " +
+			  NL + "{ " +	
+			  NL + "	protected class RoleB extends TeamA.RoleA {} " +
+			  NL + "}");
+			
+		compileFile("TeamB");
+		
+		assertFalse(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A role inherits implicitly and explicitly a role from the superteam.
+	 * Comment:
+	 * A role may not inherit a role explicitly if it is already inherited
+	 * implicitly from the superteam (by name-matching).
+	 */ 
+	public void testRoleInheritsRoleImplicitlyAndExplicitlyFromSuperTeam1()
+	{
+		createFile("TeamA","public team class TeamA " +
+			  NL + "{ " +	
+			  NL + "	protected class Role {} " +
+			  NL + "}");
+		
+		createFile("TeamB","public team class TeamB extends TeamA" +
+			  NL + "{ " +	
+			  NL + "	protected class Role extends TeamA.Role {} " +
+			  NL + "}");
+				
+		compileFile("TeamB");
+		
+		assertFalse(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A role inherits from an external class.
+	 */ 
+	public void testRoleExtendsExternalClass1()
+	{
+		createFile("MyClass","public class MyClass " +
+			  NL + "{ " +	
+			  NL + "}");
+		
+		createFile("Team","public team class Team " +
+			  NL + "{ " +	
+			  NL + "	protected class Role extends MyClass {} " +
+			  NL + "}");
+				
+		compileFile("Team");
+		
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A role inherits explicitly from an abstract role.
+	 * It does not implement the abstract methods.
+	 * Comment:
+	 * A role has to implement the abstract methods if it extends 
+	 * an abstract role.
+	 */
+	public void testRoleInheritsExplicitlyFromAbstractRole1()
+	{
+		createFile("MyTeam","public team class MyTeam { " +
+			  NL + "	abstract class Role1 {" +
+			  NL + "	    public abstract void role1Method();" +
+			  NL + "    }" +
+			  NL + "    class Role2 extends Role1 {} " +
+			  NL + "}");
+
+		compileFile("MyTeam");
+		
+		assertFalse(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A role inherits implicitly from an abstract role.
+	 * It does not implement the abstract methods.
+	 * Comment:
+	 * A role has to implement the abstract methods of the implicitly 
+	 * inherited abstract role.
+	 */
+	public void testRoleInheritsImplicitlyFromAbstractRole1()
+	{
+		createFile("TeamA","public team class TeamA { " +
+		      NL + "	abstract class RoleA {" +
+			  NL + "	    public abstract void roleMethod();" +
+			  NL + "    }" +
+			  NL + "}");
+				
+		createFile("TeamB","public team class TeamB extends TeamA " +
+     		  NL + "{ " +	
+		      NL + "	protected class RoleA {} " +
+		      NL + "}");
+
+		compileFile("TeamB");
+		
+		assertFalse(isCompilationSuccessful());
+	}
+	
+	/**
+	 * An implicitly inherited role inherits explicitly from an external class.
+	 * The super-role does not extend any class.
+	 */
+	public void testImplicitInheritedRoleExtendsExternalClass1()
+	{
+		createFile("ExternalClass","public class ExternalClass " +
+			  NL + "{ " +	
+			  NL + "}");
+
+		createFile("TeamA","public team class TeamA " +
+			  NL + "{ " +	
+			  NL + "	protected class Role {} " +
+			  NL + "}");
+		
+		createFile("TeamB","public team class TeamB extends TeamA" +
+			  NL + "{ " +	
+			  NL + "	protected class Role extends ExternalClass {} " +
+			  NL + "}");
+				
+		compileFile("TeamB");
+		
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	/**
+	 * An implicitly inherited role inherits explicitly from an external class.
+	 * The super-role extends a different class than the sub-role.
+	 * Comment:
+	 * An implicitly inherited role has to extend the same external class
+	 * as the super-role.
+	 */
+	public void testImplicitInheritedRoleExtendsExternalClass2()
+	{
+		createFile("ExternalClass","public class ExternalClass " +
+			  NL + "{ " +	
+			  NL + "}");
+
+		createFile("DifferentClass","public class DifferentClass " +
+			  NL + "{ " +	
+			  NL + "}");
+			  
+		createFile("TeamA","public team class TeamA " +
+			  NL + "{ " +	
+			  NL + "	protected class Role extends DifferentClass {} " +
+			  NL + "}");
+		
+		createFile("TeamB","public team class TeamB extends TeamA" +
+			  NL + "{ " +	
+			  NL + "	protected class Role extends ExternalClass {} " +
+			  NL + "}");
+				
+		compileFile("TeamB");
+		
+		assertFalse(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A sub-role has a restricted visibility compared to the super-role.
+	 * Comment:
+	 * A role may not restrain the visibility of the implicitly inherited role.
+	 * (does the private modifier actually makes sense in a role context?)
+	 */
+	public void testRestrictedVisibilityOfSubRole1()
+	{
+		createFile("TeamA","public team class TeamA " +
+			  NL + "{ " +	
+			  NL + "	public class Role {} " +
+			  NL + "}");
+		
+		createFile("TeamB","public team class TeamB extends TeamA" +
+			  NL + "{ " +	
+			  NL + "	protected class Role {} " +
+			  NL + "}");
+				
+		compileFile("TeamB");
+		
+		assertFalse(isCompilationSuccessful());
+	}
+
+	/**
+	 * An overwriting method in a sub-role has a restricted visibility compared
+	 * to the overwritten method in the super-role.
+	 * Comment:
+	 * A method in a role may not restrain the visibility of the
+	 * implicitly inherited role-method.
+	 */
+	public void testRestrictedVisibilityOfMethodInSubRole1()
+	{
+		createFile("TeamA","public team class TeamA " +
+			  NL + "{ " +	
+			  NL + "	protected class Role {" +
+			  NL + "        public void roleMethod() {};" +
+			  NL + "    }" +
+			  NL + "}");
+			
+		createFile("TeamB","public team class TeamB extends TeamA" +
+			  NL + "{ " +	
+			  NL + "	protected class Role {" +
+			  NL + "        private void roleMethod() {};" +
+			  NL + "    }" +
+			  NL + "}");
+					
+		compileFile("TeamB");
+			
+		assertFalse(isCompilationSuccessful());
+	}
+
+	/**
+	 * An implicitly inherited role does not implement all the interfaces
+	 * of the super-role.
+	 * Commment:
+	 * An implicitly inherited role has to implement all the interfaces of the
+	 * super-role.
+	 */
+	public void testImplementationOfInterfacesBySubRole1()
+	{
+		createFile("IState","public interface IState" +
+			  NL + "{" +
+			  NL + "    public IState getState();" +
+		      NL + "}");
+
+		createFile("ITransfer","public interface ITransfer" +
+			  NL + "{" +
+			  NL + "    public void doTransfer();" +
+			  NL + "}");
+		
+		createFile("TeamA","public team class TeamA " +
+			  NL + "{ " +	
+			  NL + "	protected class Role implements IState, ITransfer " +
+			  NL + "    {" +
+			  NL + "        public IState getState() {}" +
+			  NL + "        public void doTransfer() {}" +
+			  NL + "    }" +
+			  NL + "}");
+			
+		createFile("TeamB","public team class TeamB extends TeamA" +
+			  NL + "{ " +	
+			  NL + "	protected class Role implements IState " +
+			  NL + "    {" +
+			  NL + "        public IState getState() {}" +
+			  NL + "    }" +
+			  NL + "}");
+					
+		compileFile("TeamB");
+			
+		assertFalse(isCompilationSuccessful());
+	}
+
+	/**
+	 * An implicitly inherited role implements more interfaces than
+	 * the super-role.
+	 */
+	public void testImplementationOfInterfacesBySubRole2()
+	{
+		createFile("IState","public interface IState" +
+			  NL + "{" +
+			  NL + "    public IState getState();" +
+			  NL + "}");
+
+		createFile("ITransfer","public interface ITransfer" +
+			  NL + "{" +
+			  NL + "    public void doTransfer();" +
+			  NL + "}");
+		
+		createFile("TeamA","public team class TeamA " +
+			  NL + "{ " +	
+			  NL + "	protected class Role implements IState" +
+			  NL + "    {" +
+			  NL + "        public IState getState() { return null; }" +
+			  NL + "    }" +
+			  NL + "}");
+			
+		createFile("TeamB","public team class TeamB extends TeamA" +
+			  NL + "{ " +	
+			  NL + "	protected class Role implements IState, ITransfer " +
+			  NL + "    {" +
+			  NL + "        public IState getState() { return tsuper.getState(); }" +
+			  NL + "        public void doTransfer() {}" +
+			  NL + "    }" +
+			  NL + "}");
+					
+		compileFile("TeamB");
+			
+		assertTrue(isCompilationSuccessful());
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/SourceSnippetRecoveryTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/SourceSnippetRecoveryTest.java
new file mode 100644
index 0000000..cd31c03
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/SourceSnippetRecoveryTest.java
@@ -0,0 +1,55 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: SourceSnippetRecoveryTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+
+/**
+ * This class contains tests concerning source code snippets, or wrong code.
+ * 
+ * @author Markus Witte
+ */
+public class SourceSnippetRecoveryTest extends TestBase {
+	
+	public SourceSnippetRecoveryTest(String testName)
+	{
+		super(testName);
+	}
+
+	/**
+	 * A "replace-callin binding" is used with a base call.
+	 * Bound role method must be declared as callin method.
+	 */
+	public void testIncompleteCallinBinding()
+	{
+		createFile("MyClass","public class MyClass " +
+			  NL + "{ " +
+			  NL + "    baseMethod <- met1, met2;" +
+			  NL + "} ");
+	      
+		
+		compileFile("MyClass");
+		
+		assertTrue(hasExpectedProblems(new int[] {IProblem.ParsingErrorMergeTokens})); // silly but factual
+	}	
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TeamActivationTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TeamActivationTest.java
new file mode 100644
index 0000000..4894d12
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TeamActivationTest.java
@@ -0,0 +1,84 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: TeamActivationTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * This class is for testing team activation.
+ * Note, test cases which tried to test sequences of activation statements are removed,
+ * because 
+ * (a) this can only be tested when also executing the program, and 
+ * (b) test goals stated in comments were wrong. 
+ * 
+ * @author kaschja
+ * @version $Id: TeamActivationTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class TeamActivationTest extends TestBase
+{
+    public TeamActivationTest(String testName)
+    {
+        super(testName);
+    }
+	
+	/**
+	 * team activation with "within" must have team as argument
+	 */
+	public void testWithinWithTeamAsArgument() {
+		createFile("MyTeam","public team class MyTeam {}");
+										
+		createFile("MyClient","public class MyClient"+
+			  NL + "{"+
+			  NL + "	public static void main(String[] argv) {"+
+			  NL + "		MyTeam myTeam = new MyTeam();"+
+			  NL + "		within(myTeam) {"+
+			  NL + "			System.out.println(\"MyClient.main.within\");"+
+			  NL + "		}"+
+			  NL + "	}"+
+			  NL + "}");
+
+		compileFile("MyClient");
+		
+		assertTrue(isCompilationSuccessful());
+	}
+	/**
+	 * team activation with "within" dont have normal class as argument
+	 */
+	public void testWithinWithRegularClassAsArgument() {
+		createFile("MyClass","public class MyClass {}");
+										
+		createFile("MyClient","public class MyClient"+
+			  NL + "{"+
+			  NL + "	public static void main(String[] argv) {"+
+			  NL + "		MyClass myClass = new MyClass();"+
+			  NL + "		within(myClass) {"+
+			  NL + "			System.out.println(\"MyClient.main.within\");"+
+			  NL + "		}"+
+			  NL + "	}"+
+			  NL + "}");
+
+		compileFile("MyClient");
+		
+		assertTrue(hasExpectedProblems(new int[] {IProblem.WithinStatementNeedsTeamInstance}));
+	}
+	
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TeamContainmentTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TeamContainmentTest.java
new file mode 100644
index 0000000..108bd0c
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TeamContainmentTest.java
@@ -0,0 +1,188 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: TeamContainmentTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+
+/**
+ * This class contains tests concerning team inheritance.
+ * 
+ * @author kaschja
+ * @version $Id: TeamContainmentTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class TeamContainmentTest extends TestBase
+{
+    public TeamContainmentTest(String testName)
+    {
+        super(testName);
+    }
+
+	/* An empty team with no package statement should compile without 
+		 * problems. 
+		 */
+		public void testEmptyTeam1() 
+		{
+			createFile("MyTeam","public team class MyTeam " +
+				  NL + "{ " +				 					  
+				  NL + "}");
+	
+			compileFile("MyTeam");
+	
+			assertTrue(isCompilationSuccessful());
+		}
+
+	/* An empty team with a specific package statement should compile without 
+	 * problems. 
+	 */
+	public void testEmptyTeam2() 
+	{
+		createFile("MyTeam","package teams;" + 
+			  NL + "public team class MyTeam " +
+			  NL + "{ " +				 					  
+			  NL + "}");
+	
+		compileFile("teams"+File.separator+"MyTeam");
+	
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	/* An empty team with a specific package statement should compile without 
+	 * problems. 
+	 */
+	public void testEmptyTeam3() 
+	{
+		createFile("MyTeam","" + "package pkg1.pkg2.pkg3;" + 
+			  NL + "public team class MyTeam " +
+			  NL + "{ " +				 					  
+			  NL + "}");
+	
+		compileFile("pkg1"+File.separator+"pkg2"+File.separator+"pkg3"+File.separator+"MyTeam");
+	
+		assertTrue(isCompilationSuccessful());
+	}
+
+    /** 
+	 * A team that is not declared as abstract contains an abstract role.
+	 * Comment:
+	 * A team has to be declared as abstract if it contains an abstract relevant role.
+     * For the notion of "relevant roles" see OT lang.def. 7.1(c) (SH).
+	 */
+	public void testAbstractRoleInNonAbstractTeam1() 
+	{
+        // TODO (SH): differentiate relevant/irrelevant roles (s.above).
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +	
+			  NL + "	abstract protected class MyRole " +
+			  NL + "    {" +
+		      NL + "	    abstract void roleMethod();" +
+		      NL + "	}" +			  
+			  NL + "}");
+		
+		compileFile("MyTeam");
+		
+		assertTrue(isCompilationSuccessful());
+	}
+	
+	/**
+	 * A team that is not declared as abstract contains an abstract 
+	 * team-level method.
+	 * Comment:
+	 * A team has to be declared as abstract if it contains an abstract
+	 * team-level method.
+	 */
+	public void testAbstractMethodInNonAbstractTeam1() 
+	{
+		createFile("MyTeam","public team class MyTeam " +
+			  NL + "{ " +				 
+			  NL + "	abstract void teamMethod();" +					  
+			  NL + "}");
+		
+		compileFile("MyTeam");
+	
+		assertTrue(hasExpectedProblems(new int[]{ IProblem.AbstractMethodsInConcreteClass, IProblem.AbstractMethodInAbstractClass}));
+	}
+	
+	public void testRoleLackingJavadoc1() 
+	{
+		createFile("MyBase","/** Comment for MyBase. */" +
+				  NL + "public class MyBase " +				
+				  NL + "{ " +	
+				  NL + "}");
+		
+		createFile("MyTeam","/** Comment for MyTeam. */" +
+			  NL + "public team class MyTeam " +				
+			  NL + "{ " +	
+			  NL + "	public class MyRole playedBy MyBase" +
+			  NL + "    {" +
+		      NL + "	}" +			  
+			  NL + "}");
+		
+		Map<String,String> options= new HashMap<String,String>();
+		options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5);
+		options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5);
+		options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_5);
+		options.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
+		options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR);
+		options.put(CompilerOptions.OPTION_ReportInvalidJavadocTags, CompilerOptions.ERROR);
+		options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, CompilerOptions.ERROR);
+
+		compileFile("MyTeam", null, options);
+		
+		assertTrue(hasExpectedProblems(new int[]{ IProblem.JavadocMissing})); // reported only once!
+	}
+	
+	public void testRoleLackingJavadoc2() 
+	{
+		createFile("MyBase","/** Comment for MyBase. */" +
+				  NL + "public class MyBase " +				
+				  NL + "{ " +	
+				  NL + "}");
+		
+		createFile("MyTeam","/** Comment for MyTeam. */" +
+			  NL + "public team class MyTeam " +				
+			  NL + "{ " +	
+			  NL + "	protected class MyRole playedBy MyBase" +
+			  NL + "    {" +
+		      NL + "	}" +			  
+			  NL + "}");
+		
+		Map<String,String> options= new HashMap<String,String>();
+		options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5);
+		options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5);
+		options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_5);
+		options.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
+		options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR);
+		options.put(CompilerOptions.OPTION_ReportInvalidJavadocTags, CompilerOptions.ERROR);
+		options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, CompilerOptions.ERROR);
+
+		compileFile("MyTeam", null, options);
+		
+		assertTrue(isCompilationSuccessful());
+	}
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TeamInheritanceTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TeamInheritanceTest.java
new file mode 100644
index 0000000..c0e0489
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TeamInheritanceTest.java
@@ -0,0 +1,146 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: TeamInheritanceTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.objectteams.otdt.tests.compiler.TestBase;
+
+/**
+ * This class contains tests concerning team inheritance.
+ * 
+ * @author kaschja
+ * @version $Id: TeamInheritanceTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class TeamInheritanceTest extends TestBase
+{
+    public TeamInheritanceTest(String testName)
+    {
+        super(testName);
+    }
+
+    /**
+	 * A team class inherits from a non-team class.
+	 * Comment:
+	 * This is legal since Trac #144.
+	 */ 
+	public void testTeamInheritance1() 
+	{
+	    createFile("OrdinaryClass","public class OrdinaryClass {}");
+	    			
+	    createFile("MyTeam","public team class MyTeam extends OrdinaryClass {}");
+				
+		compileFile("MyTeam");
+				
+	    assertTrue(isCompilationSuccessful());
+    }
+    
+	/**
+	 * A regular class (non-team class) inherits from a team class.
+	 * Comment:
+	 * A regular Java class can only extend another Java class,not a team class.
+	 */
+	public void testInvalidTeamInheritance2()
+	{
+		createFile("MyTeam","public team class MyTeam {}");
+		
+		createFile("MyClass","public class MyClass extends MyTeam {}");
+		
+		compileFile("MyClass");
+				
+		assertFalse(isCompilationSuccessful());
+	}
+
+	/** 
+	 * 	A team class inherits from an abstract team class.
+	 *  It does not implement the inherited abstract method.
+	 *  Comment:
+	 *  A team has to implement the inherited abstract methods of the superteam.
+	 */
+	public void testNotImplementedAbstractMethod1()
+	{
+		createFile("Superteam","public abstract team class Superteam " +
+			  NL + "{ " +	
+			  NL + "	abstract void teamMethod(); " +
+			  NL + "}");
+		
+		createFile("Subteam","public team class Subteam extends Superteam" +
+			  NL + "{ " +	
+			  NL + "}");
+				
+		compileFile("Subteam");
+		
+		assertFalse(isCompilationSuccessful());	
+	}
+	
+	/** 
+	 * 	A team class contains a role class.
+	 *  Another team class that inherits from this team, does not have to
+	 *  contain the inherited role explicitly.
+	 */  
+	public void testImplicitInheritance1()
+	{
+		createFile("Superteam","public team class Superteam " +
+			  NL + "{ " +	
+			  NL + "	protected class Role {}; " +
+			  NL + "}");
+		
+		createFile("Subteam","public team class Subteam extends Superteam" +
+			  NL + "{ " +	
+			  NL + "}");
+				
+		compileFile("Superteam");
+		
+		assertTrue(isCompilationSuccessful());	
+	}
+	
+	/** 
+	 * @see testImplicitInheritance1
+	 * additional instantiation of inherited role
+	 */  
+	public void testImplicitInheritance2()
+	{
+		createFile("Superteam","public team class Superteam " +
+			  NL + "{ " +	
+			  NL + "	protected class Role {}; " +
+			  NL + "}");
+	
+		createFile("Subteam","public team class Subteam extends Superteam" +
+			  NL + "{ " +
+			  NL + "  Role _myRole = new Role(); " +
+			  NL + "}");
+			
+		compileFile("Superteam");
+	
+		assertTrue(isCompilationSuccessful());	
+	}
+	
+	public void testMissingOTRE1() {
+		createFile("T",
+				"import static org.objectteams.Team.ALL_THREADS;\n" +
+				"class B {}\n" +
+				"public team class T {\n" +
+				"    protected class R playedBy B {}\n" +
+				"    Thread a = ALL_THREADS;\n" +
+				"}");
+		compileFile("T", createClassPathNoOTRE("T"));
+		assertTrue(hasAtLeastExpectedProblems(new int[] {IProblem.ImportNotFound, IProblem.IsClassPathCorrect, IProblem.HierarchyHasProblems}));
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TestAll.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TestAll.java
new file mode 100644
index 0000000..18965e0
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/errorreporting/TestAll.java
@@ -0,0 +1,72 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: TestAll.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.errorreporting;
+
+import junit.framework.TestSuite;
+
+/**
+ * This class collects all test cases in one test suite.
+ *
+ * @author brcan
+ * @version $Id: TestAll.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class TestAll extends TestSuite
+{
+    public TestAll()
+    {
+        super();
+    }
+    
+    public static TestSuite suite()
+    {
+    	TestSuite suite = new TestSuite("All Compiler Tests");
+
+		// containment tests
+		suite.addTestSuite(CompilationUnitContainmentTest.class);
+		suite.addTestSuite(RoleContainmentTest.class);
+		suite.addTestSuite(TeamContainmentTest.class);
+		// inheritance tests
+		suite.addTestSuite(RoleBaseInheritanceTest.class);
+		suite.addTestSuite(RoleInheritanceTest.class);
+		suite.addTestSuite(TeamInheritanceTest.class);
+		// Copy Inheritance
+		suite.addTestSuite(CopyInheritanceTest.class);
+    	// binding tests
+    	suite.addTestSuite(CallinBindingTest.class);
+		suite.addTestSuite(CalloutBindingTest.class);
+    	// lifting and lowering tests
+    	suite.addTestSuite(LiftingTest.class);
+    	suite.addTestSuite(LoweringTest.class);
+    	// parameter mapping tests
+    	suite.addTestSuite(ParameterMappingsTest.class);
+		// team activation tests
+		suite.addTestSuite(TeamActivationTest.class);
+    	// parser tests
+		suite.addTestSuite(ParserTest.class);
+		//Code snippets and wrong code tests
+		suite.addTestSuite(SourceSnippetRecoveryTest.class);
+		//External Role tests
+		suite.addTestSuite(ExternalRoleTest.class);
+		
+    	
+    	return suite;
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/AbstractSourceMapGeneratorTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/AbstractSourceMapGeneratorTest.java
new file mode 100644
index 0000000..0442647
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/AbstractSourceMapGeneratorTest.java
@@ -0,0 +1,488 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AbstractSourceMapGeneratorTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.compiler.CategorizedProblem;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.core.tests.compiler.regression.InMemoryNameEnvironment;
+import org.eclipse.jdt.core.tests.util.Util;
+import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
+import org.eclipse.jdt.internal.compiler.IProblemFactory;
+import org.eclipse.jdt.internal.compiler.ISourceElementRequestor;
+import org.eclipse.jdt.internal.compiler.SourceElementParser;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.eclipse.jdt.internal.compiler.ast.ImportReference;
+import org.eclipse.jdt.internal.compiler.batch.CompilationUnit;
+import org.eclipse.jdt.internal.compiler.batch.FileSystem;
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
+import org.eclipse.jdt.internal.compiler.env.ICompilationUnit;
+import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
+import org.eclipse.objectteams.otdt.core.ext.OTDTPlugin;
+import org.eclipse.objectteams.otdt.debug.core.breakpoints.IOOTBreakPoints;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.SmapStratum;
+import org.eclipse.objectteams.otdt.tests.compiler.CustomizedCompiler;
+import org.eclipse.objectteams.otdt.tests.compiler.ICallbackClient;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * @author ike
+ */
+public abstract class AbstractSourceMapGeneratorTest extends FileBasedModelTest implements ICallbackClient, ISourceElementRequestor
+{
+    
+	protected String PROJECT_DIR;
+    
+	public static final String COMPLIANCE_1_3 = "1.3";
+	public static final String COMPLIANCE_1_4 = "1.4";
+	public static final String COMPLIANCE_1_5 = "1.5";
+	
+	private String complianceLevel = COMPLIANCE_1_5;
+	protected String[] classpaths;
+	protected Hashtable <String, List<SmapStratum>>expectedStrata;
+    
+	protected String TYPENAME;
+	
+	public static boolean optimizeStringLiterals = false;
+	public static long sourceLevel = ClassFileConstants.JDK1_5; //$NON-NLS-1$
+    
+	public String OTRE_JAR_PATH = getOTRE_Path(); 
+
+	public static String OUTPUT_DIR = Util.getOutputDirectory() + File.separator + "smaptest";
+	
+	// the source line within method Team.java:__OT__Confined._OT$getTeam().
+	public static int OT_CONFINED_GET_TEAM_LINE = IOOTBreakPoints.LINE_ConfinedGetTeam;
+    
+    public AbstractSourceMapGeneratorTest(String testName)
+    {
+        super(testName);
+    }
+
+    private String getOTRE_Path()
+    {
+        URL url = FileLocator.find(OTDTPlugin.getDefault().getBundle(), new Path("lib/otre.jar"), null);
+        URL resolved_url = null;
+        try
+        {
+            resolved_url = FileLocator.resolve(url);
+        }
+        catch (IOException e)
+        {
+            e.printStackTrace();
+        }
+
+        if (resolved_url != null)
+            return resolved_url.getPath();
+        else
+            return url.getPath();
+        
+    }
+
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(AbstractSourceMapGeneratorTest.class);
+        }
+        junit.framework.TestSuite suite = new Suite(AbstractSourceMapGeneratorTest.class
+            .getName());
+        return suite;
+    }
+    
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        expectedStrata = new Hashtable<String, List<SmapStratum>>();
+    }
+
+    protected INameEnvironment getNameEnvironment(final String[] testFiles,
+            String[] classPaths)
+    {
+        this.classpaths = classPaths == null ? getDefaultClassPaths() : classPaths;
+        return new InMemoryNameEnvironment(testFiles, getClassLibs());
+    }
+
+    protected INameEnvironment[] getClassLibs()
+    {
+        String encoding = (String)getCompilerOptions().getMap().get(CompilerOptions.OPTION_Encoding);
+        if ("".equals(encoding))
+            encoding = null;
+
+        INameEnvironment[] classLibs = new INameEnvironment[1];
+        classLibs[0] = new FileSystem(this.classpaths, new String[] {}, // ignore initial file names
+                encoding // default encoding
+        );
+        return classLibs;
+    }
+
+    @SuppressWarnings("unchecked")
+	protected CompilerOptions getCompilerOptions()
+    {
+    	CompilerOptions cOptions = new CompilerOptions();
+        Map<String, String> options = cOptions.getMap();
+        if (COMPLIANCE_1_3.equals(this.complianceLevel))
+        {
+            options.put(CompilerOptions.OPTION_Compliance,  CompilerOptions.VERSION_1_3);
+            options.put(CompilerOptions.OPTION_Source,  CompilerOptions.VERSION_1_3);
+            options.put(CompilerOptions.OPTION_TargetPlatform,  CompilerOptions.VERSION_1_3);
+        }
+        else if (COMPLIANCE_1_4.equals(this.complianceLevel))
+        {
+            options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_4);
+            options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_4);
+            options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_4);
+        }
+        else if (COMPLIANCE_1_5.equals(this.complianceLevel))
+        {
+            options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_5);
+            options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_5);
+            options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_5);
+        }
+
+        options.put(CompilerOptions.OPTION_LocalVariableAttribute, CompilerOptions.GENERATE);
+        options.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.WARNING);
+        options.put(CompilerOptions.OPTION_ReportLocalVariableHiding, CompilerOptions.WARNING);
+        options.put(CompilerOptions.OPTION_ReportFieldHiding, CompilerOptions.WARNING);
+        options.put(CompilerOptions.OPTION_ReportPossibleAccidentalBooleanAssignment, CompilerOptions.WARNING);
+        options.put(CompilerOptions.OPTION_ReportSyntheticAccessEmulation, CompilerOptions.WARNING);
+        options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);
+        options.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);
+        options.put(CompilerOptions.OPTION_ReportUnnecessaryElse, CompilerOptions.WARNING);
+               
+        return new CompilerOptions(options);
+    }
+
+    protected String[] getDefaultClassPaths()
+    {
+        return Util.concatWithClassLibs(OTRE_JAR_PATH, false);
+    }
+
+    protected IErrorHandlingPolicy getErrorHandlingPolicy()
+    {
+        return new IErrorHandlingPolicy()
+        {
+            public boolean stopOnFirstError()
+            {
+                return false;
+            }
+
+            public boolean proceedOnErrors()
+            {
+                return true;
+            }
+        };
+    }
+
+    protected IProblemFactory getProblemFactory()
+    {
+        return new DefaultProblemFactory(Locale.getDefault());
+    }
+    
+    /**
+     * @param team
+     * @param role
+     * @throws JavaModelException
+     */
+    public boolean parseAndCompile(org.eclipse.jdt.core.ICompilationUnit[] units ) throws JavaModelException
+    {
+    	return parseAndCompile(units, null);
+    }
+    public boolean parseAndCompile(org.eclipse.jdt.core.ICompilationUnit[] units, HashMap<String, int[]> methodLineNumbers ) throws JavaModelException
+    {
+    	return parseAndCompile(units, methodLineNumbers, null, null);
+    }
+    public boolean parseAndCompile(org.eclipse.jdt.core.ICompilationUnit[] units, 
+    							   HashMap<String, int[]> methodLineNumbers,
+    							   String[] classPaths,
+    							   String outputPath) 
+    		throws JavaModelException
+    {
+        SourceElementParser parser = new SourceElementParser(this,
+                new DefaultProblemFactory(Locale.getDefault()),
+                new CompilerOptions(), false, false);
+        ICompilationUnit [] cUnits = new ICompilationUnit[units.length];
+        
+        for (int idx = 0; idx < units.length; idx++)
+        {
+            org.eclipse.jdt.core.ICompilationUnit unit = units[idx];
+            
+            String unit_src = unit.getSource();
+            IResource unit_res = unit.getCorrespondingResource();
+            String unit_fileName = unit_res.toString();
+            char[] unit_source = unit_src.toCharArray();
+            ICompilationUnit unit_sourceUnit = new CompilationUnit(unit_source,
+                    unit_fileName, null);
+            
+            CompilationUnitDeclaration cuDecl = parser.parseCompilationUnit(
+                    unit_sourceUnit, true, null);
+            
+            if (cuDecl.hasErrors())
+               return false;
+            
+            cUnits[idx] = unit_sourceUnit;
+        } 
+   
+        Requestor requestor = new Requestor(
+							false,
+							null, /*no custom requestor */
+							false, /* show category */
+							false /* show warning token*/,
+							methodLineNumbers);
+        if (outputPath != null) {
+        	requestor.outputPath = outputPath;
+        	File outDir = new File(outputPath);
+        	if (!outDir.exists())
+        		outDir.mkdir();
+        }
+        
+		CompilerOptions options =  getCompilerOptions();
+
+		CustomizedCompiler batchCompiler = new CustomizedCompiler(
+        		getNameEnvironment( new String[] {}, classPaths), 
+        		getErrorHandlingPolicy(),
+        		options,
+                requestor,
+                getProblemFactory()
+                );
+        
+        batchCompiler.addCallBack(this);
+        
+        batchCompiler.compile(cUnits); // compile all files together
+        
+        boolean hasErrors = requestor.hasErrors;
+        
+        //errorlog contains errore and warnings, skip warnings
+        if (hasErrors)
+        {
+            String expectedErrorlog = "";
+            String actualErrorlog = requestor.problemLog;
+            assertEquals("COMPILATION FAILED. Errorlog should be empty.", expectedErrorlog, actualErrorlog);
+        }        
+
+        if (methodLineNumbers != null)
+        	requestor.checkAllLineNumbersSeen();
+        
+        return !hasErrors;
+    }
+    
+    public abstract void callback(CompilationUnitDeclaration cuDecl);
+    
+    public void acceptConstructorReference(char[] typeName, int argCount, int sourcePosition)
+    {
+    }
+
+    public void acceptFieldReference(char[] fieldName, int sourcePosition)
+    {
+    }
+
+    public void acceptImport(int declarationStart, int declarationEnd, char[] name, boolean onDemand, int modifiers)
+    {
+    }
+
+    public void acceptLineSeparatorPositions(int[] positions)
+    {
+    }
+
+    public void acceptMethodReference(char[] methodName, int argCount, int sourcePosition)
+    {
+    }
+
+    public void acceptPackage(ImportReference importReference) 
+    {
+    }
+    
+    public void acceptProblem(IProblem problem)
+    {
+    }
+
+    public void acceptTypeReference(char[][] typeName, int sourceStart, int sourceEnd)
+    {
+    }
+
+    public void acceptTypeReference(char[] typeName, int sourcePosition)
+    {
+    }
+
+    public void acceptUnknownReference(char[][] name, int sourceStart, int sourceEnd)
+    {
+    }
+
+    public void acceptUnknownReference(char[] name, int sourcePosition)
+    {
+    }
+
+    public void enterClass(int declarationStart, int modifiers, char[] name, int nameSourceStart, int nameSourceEnd, char[] superclass, char[][] superinterfaces)
+    {
+    }
+
+    public void enterCompilationUnit()
+    {
+    }
+
+    public void enterConstructor(int declarationStart, int modifiers, char[] name, int nameSourceStart, int nameSourceEnd, char[][] parameterTypes, char[][] parameterNames, char[][] exceptionTypes)
+    {
+    }
+
+    public void enterField(int declarationStart, int modifiers, char[] type, char[] name, int nameSourceStart, int nameSourceEnd)
+    {
+    }
+
+    public void enterInitializer(int declarationStart, int modifiers)
+    {
+    }
+
+    public void enterInterface(int declarationStart, int modifiers, char[] name, int nameSourceStart, int nameSourceEnd, char[][] superinterfaces)
+    {
+    }
+
+    public void enterMethod(int declarationStart, int modifiers, char[] returnType, char[] name, int nameSourceStart, int nameSourceEnd, char[][] parameterTypes, char[][] parameterNames, char[][] exceptionTypes)
+    {
+    }
+
+    public void exitClass(int declarationEnd)
+    {
+    }
+
+    public void exitCompilationUnit(int declarationEnd)
+    {
+    }
+
+    public void exitConstructor(int declarationEnd)
+    {
+    }
+
+    public void exitField(int initializationStart, int declarationEnd, int declarationSourceEnd)
+    {
+    }
+
+    public void exitInitializer(int declarationEnd)
+    {
+    }
+
+    public void exitMethod(int declarationEnd, Expression defaultValue) 
+    {
+    }
+    
+    public void acceptBaseReference(char[][] typeName, int sourceStart, int sourceEnd)
+    {
+    }
+
+    public void enterInterface(int declarationStart, int modifiers, char[] name, int nameSourceStart, int nameSourceEnd, char[][] superinterfaces, char[] baseclassName, boolean isRoleFile)
+    {
+    }
+
+    public void enterClass(int declarationStart, int modifiers, char[] name, int nameSourceStart, int nameSourceEnd, char[] superclass, char[][] superinterfaces, char[] baseclassName, boolean isRoleFile)
+    {
+    }
+
+    public void enterCalloutMapping(CalloutInfo calloutInfo)
+    {
+    }
+
+    public void enterCalloutToFieldMapping(CalloutToFieldInfo calloutInfo)
+    {
+    }
+
+    public void enterCallinMapping(CallinInfo callinInfo)
+    {
+    }
+
+    public void exitCalloutMapping(int sourceEnd, int declarationSourceEnd)
+    {
+    }
+
+    public void exitCalloutToFieldMapping(int sourceEnd, int declarationSourceEnd)
+    {
+    }
+
+    public void exitCallinMapping(int sourceEnd, int declarationSourceEnd)
+    {
+    }
+
+	public void acceptProblem(CategorizedProblem problem) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void enterConstructor(MethodInfo methodInfo) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void enterField(FieldInfo fieldInfo) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void enterMethod(MethodInfo methodInfo) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void enterType(TypeInfo typeInfo) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void exitMethod(int declarationEnd, int defaultValueStart, int defaultValueEnd) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void exitType(int declarationEnd) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void acceptImport(int declarationStart, int declarationEnd, char[][] tokens, boolean onDemand, int modifiers) {
+		// TODO Auto-generated method stub
+		
+	}
+	
+	public void acceptAnnotationTypeReference(char[][] annotation,
+			int sourceStart, int sourceEnd) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void acceptAnnotationTypeReference(char[] annotation,
+			int sourcePosition) {
+		// TODO Auto-generated method stub
+		
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/AllTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/AllTests.java
new file mode 100644
index 0000000..c5ff3cc
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/AllTests.java
@@ -0,0 +1,47 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author ike
+ *
+ */
+public class AllTests {
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite(
+            "All Tests for generation of SourceMaps");
+        //$JUnit-BEGIN$
+        suite.addTest(OTJStratumGenerationTest003.suite());
+        suite.addTest(OTJStratumGenerationTest005.suite());
+        suite.addTest(OTJStratumGenerationTest006.suite());
+        suite.addTest(OTJStratumGenerationTest007.suite());
+        suite.addTest(OTJStratumGenerationTest002.suite());
+        suite.addTestSuite(BaseClassSmapGenerationMethodTest.class);
+        suite.addTest(OTJStratumGenerationTest004.suite());
+        suite.addTest(OTJStratumGenerationTest001.suite());
+        //$JUnit-END$
+        return suite;
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/BaseClassSmapGenerationMethodTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/BaseClassSmapGenerationMethodTest.java
new file mode 100644
index 0000000..8df76a3
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/BaseClassSmapGenerationMethodTest.java
@@ -0,0 +1,610 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: BaseClassSmapGenerationMethodTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.util.Hashtable;
+import java.util.Iterator;
+import java.util.TreeMap;
+
+import junit.framework.TestCase;
+
+/** Tests the Method which generates the Smap for Baseclasse.
+ * @author ike
+ */
+public class BaseClassSmapGenerationMethodTest extends TestCase
+{
+    
+    public void testMethod001()
+    {
+        String baseClassFileName = "SimpleClass$1" ;
+        String baseClassSourceUnit = "path/to/SimpleClass"; 
+        int endlineNumber = 3;
+        Hashtable<String, int[][]> mappings = new Hashtable<String, int[][]>();
+        int lineMappings[][] = new int[2][3];
+        lineMappings[0] = new int[]{2,2,7};
+        lineMappings[1] = new int[]{3,0,8};
+               
+        mappings.put("path/to/TeamA.java", lineMappings);
+        
+        int baseMapping [][] = null;
+        
+        String expectedString = 
+            "SMAP" + "\n" +
+            "SimpleClass$1.class" + "\n" +
+            "OTJ" + "\n" +
+            "*S OTJ" + "\n" +
+            "*F" + "\n" +
+            "+ 1 TeamA.java" + "\n" +
+            "path/to/TeamA.java" + "\n" +
+            "+ 2 SimpleClass.java" + "\n" +
+            "path/to/SimpleClass.java" + "\n" +
+            "*L" + "\n" +
+            "1#2:1" + "\n" +
+            "2#1,2:7" + "\n" +
+            "3#1:8" + "\n" +
+            "*E"
+            ;
+        
+        byte actual[] = generateSMAP(baseClassFileName, baseClassSourceUnit, endlineNumber, mappings, baseMapping);
+        
+        String actualString = new String(actual);
+        
+        assertEquals("SMAP should be equal.", expectedString, actualString);
+    }
+    
+    public void testMethod002()
+    {
+        String baseClassFileName = "SimpleClass$1" ;
+        String baseClassSourceUnit = "SimpleClass"; 
+        int endlineNumber = 3;
+        Hashtable<String, int[][]> mappings = new Hashtable<String, int[][]>();
+        int lineMappings[][] = new int[2][3];
+        lineMappings[0] = new int[]{2,2,7};
+        lineMappings[1] = new int[]{3,0,8};
+        
+        mappings.put("TeamA.java", lineMappings);
+        
+        int baseMapping [][] = null;
+        
+        String expectedString =
+            "SMAP" + "\n" +
+            "SimpleClass$1.class" + "\n" +
+            "OTJ" + "\n" +
+            "*S OTJ" + "\n" +
+            "*F" + "\n" +
+            "1 TeamA.java" + "\n" +
+            "2 SimpleClass.java" + "\n" +
+            "*L" + "\n" +
+            "1#2:1" + "\n" +
+            "2#1,2:7" + "\n" +
+            "3#1:8" + "\n" +
+            "*E";
+        
+        byte actual[] = generateSMAP(baseClassFileName, baseClassSourceUnit, endlineNumber, mappings, baseMapping);
+        
+        String actualString = new String(actual);
+        
+        assertEquals("SMAP should be equal.", expectedString, actualString);
+        
+    }    
+    
+    public void testMethod003()
+    {
+        String baseClassFileName = "SimpleClass$1" ;
+        String baseClassSourceUnit = "SimpleClass"; 
+        int endlineNumber = 3;
+        Hashtable<String, int[][]> mappings = new Hashtable<String, int[][]>();
+        
+        int baseMapping [][] = null;
+        
+        String expectedString =
+            "SMAP" + "\n" +
+            "SimpleClass$1.class" + "\n" +
+            "OTJ" + "\n" +
+            "*S OTJ" + "\n" +
+            "*F" + "\n" +
+            "1 SimpleClass.java" + "\n" +
+            "*L" + "\n" +
+            "1#1,3:1" + "\n" +
+            "*E";
+        
+        byte actual[] = generateSMAP(baseClassFileName, baseClassSourceUnit, endlineNumber, mappings, baseMapping);
+        
+        String actualString = new String(actual);
+        
+        assertEquals("SMAP should be equal.", expectedString, actualString);
+        
+    }
+    
+    public void testMethod004()
+    {
+        String baseClassFileName = "BaseClass" ;
+        String baseClassSourceUnit = "very/very/long/path/to/BaseClass"; 
+        int endlineNumber = 50;
+        Hashtable<String, int[][]> mappings = new Hashtable<String, int[][]>();
+        int lineMappings1[][] = new int[7][3];
+        lineMappings1[0] = new int[]{7,0,10};
+        lineMappings1[1] = new int[]{14,1,25};
+        lineMappings1[2] = new int[]{21,0,30};
+        lineMappings1[3] = new int[]{28,2,35};
+        lineMappings1[4] = new int[]{35,0,40};
+        lineMappings1[5] = new int[]{42,3,45};
+        lineMappings1[6] = new int[]{125,0,250};
+        
+        mappings.put("path/to/TeamB.java", lineMappings1);
+        
+        int lineMappings2[][] = new int[4][3];
+        lineMappings2[0] = new int[]{8,0,3};
+        lineMappings2[1] = new int[]{16,1,9};
+        lineMappings2[2] = new int[]{24,0,12};
+        lineMappings2[3] = new int[]{32,5,15};
+        
+        mappings.put("very/long/path/to/TeamA.java", lineMappings1);
+        
+        int baseMapping [][] = null;
+        
+        String expectedString =
+            "SMAP" + "\n" +
+            "BaseClass.class" + "\n" +
+            "OTJ" + "\n" +
+            "*S OTJ" + "\n" +
+            "*F" + "\n" +
+            "+ 1 TeamA.java" + "\n" +
+            "very/long/path/to/TeamA.java" + "\n" +
+            "+ 2 TeamB.java" + "\n" +
+            "path/to/TeamB.java" + "\n" +
+            "+ 3 BaseClass.java" + "\n" +
+            "very/very/long/path/to/BaseClass.java" + "\n" +
+            "*L" + "\n" +
+            "1#3,6:1" + "\n" +
+            "7#2:10" + "\n" +
+            "8#3,6:8" + "\n" +
+            "14#2,1:25" + "\n" +
+            "15#3,6:15" + "\n" +
+            "21#2:30" + "\n" +
+            "22#3,6:22" + "\n" +
+            "28#2,2:35" + "\n" +
+            "29#3,6:29" + "\n" +
+            "35#2:40" + "\n" +
+            "36#3,6:36" + "\n" +
+            "42#2,3:45" + "\n" +
+            "43#3,8:43" + "\n" +
+            "125#2:250" + "\n" +
+            "*E";        
+        
+        byte actual[] = generateSMAP(baseClassFileName, baseClassSourceUnit, endlineNumber, mappings, baseMapping);
+        
+        String actualString = new String(actual);
+        
+        assertEquals("SMAP should be equal.", expectedString, actualString);
+        
+    }
+    
+    public void testSMAPIsNull001()
+    {
+        String baseClassFileName = "SimpleClass$1" ;
+        String baseClassSourceUnit = "path/to/SimpleClass";
+        int endlineNumber = 3;
+        Hashtable<String, int[][]> mappings = null;
+        
+        int baseMapping [][] = null;
+        
+        byte actual[] = generateSMAP(baseClassFileName, baseClassSourceUnit, endlineNumber, mappings, baseMapping);
+        
+        assertNull("No SMAP should be generated.", actual);
+    } 
+    
+    public void testSMAPIsNull002()
+    {
+        String baseClassFileName = null;
+        String baseClassSourceUnit = "path/to/SimpleClass";
+        int endlineNumber = 3;
+        Hashtable<String, int[][]> mappings =  new Hashtable<String, int[][]>();;
+        int lineMappings[][] = new int[2][3];
+        lineMappings[0] = new int[]{2,2,7};
+        lineMappings[1] = new int[]{3,0,8};
+        mappings.put("path/to/TeamA.java", lineMappings);
+        
+        int baseMapping[][] = null;
+        
+        byte actual[] = generateSMAP(baseClassFileName, baseClassSourceUnit, endlineNumber, mappings, baseMapping);
+        
+        assertNull("No SMAP should be generated.", actual);
+    }    
+    
+    public void testSMAPIsNotNull001()
+    {
+        String baseClassFileName = "SimpleClass$1";
+        String baseClassSourceUnit = null;
+        int endlineNumber = 3;
+        Hashtable<String, int[][]> mappings =  new Hashtable<String, int[][]>();;
+        int lineMappings[][] = new int[2][3];
+        lineMappings[0] = new int[]{2,2,7};
+        lineMappings[1] = new int[]{3,0,8};
+        mappings.put("path/to/TeamA.java", lineMappings);
+        
+        int baseMapping[][] = null;
+        
+        byte actual[] = generateSMAP(baseClassFileName, baseClassSourceUnit, endlineNumber, mappings, baseMapping);
+        
+        String expectedString =
+            "SMAP" + "\n" +
+            "SimpleClass$1.class" + "\n" +
+            "OTJ" + "\n" +
+            "*S OTJ" + "\n" +
+            "*F" + "\n" +
+            "+ 1 TeamA.java" + "\n" +
+            "path/to/TeamA.java" + "\n" +
+            "2 SimpleClass$1.java" + "\n" +
+            "*L" + "\n" +
+            "1#2:1" + "\n" +
+            "2#1,2:7" + "\n" +
+            "3#1:8" + "\n" +
+            "*E";
+        
+        
+        String actualString = new String(actual);
+        
+        assertEquals("SMAP should be equal.", expectedString, actualString);
+        
+    } 
+    
+    public void testSMAPIsNotNull002()
+    {
+        String baseClassFileName = "pkg.subpkg.SimpleClass$1";
+        String baseClassSourceUnit = null;
+        int endlineNumber = 3;
+        Hashtable<String, int[][]> mappings =  new Hashtable<String, int[][]>();;
+        int lineMappings[][] = new int[2][3];
+        lineMappings[0] = new int[]{2,2,7};
+        lineMappings[1] = new int[]{3,0,8};
+        mappings.put("path/to/TeamA.java", lineMappings);
+        
+        int baseMapping [][] = null;
+        
+        byte actual[] = generateSMAP(baseClassFileName, baseClassSourceUnit, endlineNumber, mappings, baseMapping);
+        
+        String expectedString =
+            "SMAP" + "\n" +
+            "SimpleClass$1.class" + "\n" +
+            "OTJ" + "\n" +
+            "*S OTJ" + "\n" +
+            "*F" + "\n" +
+            "+ 1 TeamA.java" + "\n" +
+            "path/to/TeamA.java" + "\n" +
+            "+ 2 SimpleClass$1.java" + "\n" +
+            "pkg/subpkg/SimpleClass$1.java" + "\n" +
+            "*L" + "\n" +
+            "1#2:1" + "\n" +
+            "2#1,2:7" + "\n" +
+            "3#1:8" + "\n" +
+            "*E";
+        
+        
+        String actualString = new String(actual);
+        
+        assertEquals("SMAP should be equal.", expectedString, actualString);
+        
+    }
+    
+    
+    public void testSMAPBaseMappings()
+    {
+        String baseClassFileName = "path.to.SimpleClass";
+        String baseClassSourceUnit = "path/to/SimpleClass";
+        int endlineNumber = 15;
+        Hashtable<String, int[][]> mappings =  new Hashtable<String, int[][]>();;
+        int lineMappings[][] = new int[2][3];
+        lineMappings[0] = new int[]{2,2,7};
+        lineMappings[1] = new int[]{3,0,8};
+        mappings.put("path/to/TeamA.java", lineMappings);
+        
+        int baseMapping[][] = new int[2][2];
+        baseMapping[0] = new int[]{10,1};
+        baseMapping[1] =  new int[]{12,6};
+
+        byte actual[] = generateSMAP(baseClassFileName, baseClassSourceUnit, endlineNumber, mappings, baseMapping);
+        String actualString = new String(actual);
+        
+        String expectedString =
+            "SMAP" + "\n" +
+            "SimpleClass.class" + "\n" +
+            "OTJ" + "\n" +
+            "*S OTJ" + "\n" +
+            "*F" + "\n" +
+            "+ 1 TeamA.java" + "\n" +
+            "path/to/TeamA.java" + "\n" +
+            "+ 2 SimpleClass.java" + "\n" +
+            "path/to/SimpleClass.java" + "\n" +
+            "*L" + "\n" +
+            "1#2:1" + "\n" +
+            "2#1,2:7" + "\n" +
+            "3#1:8" + "\n" +
+            "4#2,6:4" + "\n" +
+            "10#2:1" + "\n" +
+            "11#2:11" + "\n" +
+            "12#2:6" + "\n" +
+            "13#2,3:13" + "\n" +
+            "*E";
+        
+        assertEquals("SMAP should be equal.", expectedString, actualString);
+    }  
+    
+    ///////////////////////////////////////////////////////////////////////////////////////
+    ////                             THIS METHOD IS TESTED                             ////
+    ///////////////////////////////////////////////////////////////////////////////////////
+    
+    /** This method generates a SMAP for Baseclasses. This SMAP maps generated code for
+     *  callin bindings to theirs corresponding sourcecodepresentation. 
+     * 
+     * @param baseClassfileName - name of classfile this smap is generated for (e.g. pkg.subpkg.SimpleClass)
+     * @param baseSourceunitName - path of sourceunit of corresponding baseclasstype, 
+     *                             (e.g path/to/SimpleClass); 
+     * 							   if  baseSourceunitName is not available name and path are generated from
+     *                             baseClassfileName
+     *                               
+     * @param endlineNumber - this linenumber is the maximum linenumber of all entries in linenumbertables of all methods;
+     *                        it is not the endlinenumber of sourcefile.
+     * @param mappings - 
+     * String -> int[][]<br>
+     * key: path of Team or RoleFile sourceunit which has callins"<br>
+     * value: int-array with:<br> int[0][0] - inputstartline of callin<br>
+     * 						 int[0][1] - offset, if callin has more as one line(0 means one line, 1 means 2 lines, ...)<br>   
+     * 	 				 	 int[0][2] - written linenumber in baseclasscode (linenumber of _OT$MyRole$roleMethod$baseMethod() call in chainMethod)<br> 
+     * e.g.<br>
+     * path/to/Teamname.java -> <br>[9][0][16]<br> [20][2][18]
+     * 
+     * @param baseMappings - contains mappings to itself (int[][]):<br>
+     * 						int[0][0] - generated linenumber<br>
+     * 						int[0][1] - fixed linenumber (linenumber of e.g. signature of "_OT$xyz$orig(..)")
+     * 
+     * @return smap - the string which should be stored in Classfileattribute SourceDebugExtension
+     * 
+     * @author ike
+     */
+    public byte[] generateSMAP(String baseClassfileName, String baseSourceunitName, int endlineNumber, Hashtable<String, int[][]> mappings, int baseMappings [][])
+    {
+        if (baseClassfileName==null || mappings==null)
+        {
+            return null;
+        }
+        
+        String OTJ_STRATUM_NAME = "OTJ";
+        String CLASS_ENDING = ".class";
+        String JAVA_ENDING = ".java";
+        String generatedFileName = new String();
+        String components[] =  baseClassfileName.split("\\.");
+        String newBaseSourceunitName = null;
+        String absoluteBaseSourceunitName = null;
+        boolean baseSourceunitNameAvailable = (baseSourceunitName != null);
+        
+        if (components.length > 1)
+        {
+            generatedFileName = components[components.length -1] + CLASS_ENDING;
+            newBaseSourceunitName = components[components.length -1] + JAVA_ENDING;
+            absoluteBaseSourceunitName = (baseClassfileName.replaceAll("\\.", "/") + JAVA_ENDING);
+        }
+        else
+        {
+            generatedFileName = baseClassfileName + CLASS_ENDING;
+            newBaseSourceunitName = baseClassfileName + JAVA_ENDING;
+            absoluteBaseSourceunitName = null;
+        }
+
+        if (baseSourceunitNameAvailable)
+        {
+            String tmp[] = baseSourceunitName.split("/");
+            int index = tmp.length;
+            
+            newBaseSourceunitName = tmp[index-1] + JAVA_ENDING;
+            
+            if (tmp.length > 1)
+            {
+                absoluteBaseSourceunitName = baseSourceunitName + JAVA_ENDING;                
+            }
+        }
+        
+        Hashtable<String, Integer> typeNameToFileId = new Hashtable<String, Integer>();
+        int fileSectionIdCounter = 1;
+        
+        StringBuffer out = new StringBuffer();
+        
+        // print Header
+        out.append("SMAP\n");
+        out.append(generatedFileName + "\n");
+        
+        // print strata
+        out.append(OTJ_STRATUM_NAME+ "\n");
+        
+        // begin StratumSection
+        out.append("*S " + OTJ_STRATUM_NAME + "\n");
+        
+        // print FileSection
+        out.append("*F" + "\n");
+        
+        for (Iterator<String> iter = mappings.keySet().iterator(); iter.hasNext();)
+        {
+            String fullqualifiedName = iter.next();
+            typeNameToFileId.put(fullqualifiedName, new Integer(fileSectionIdCounter));
+            
+            // extract filename and absoluteFileName from typename
+            String tmp[] = fullqualifiedName.split("/");
+            int index = tmp.length;
+            
+            String fileName = tmp[index-1];
+            String absoluteFileName = null;
+            
+            typeNameToFileId.put(fileName, new Integer(fileSectionIdCounter));
+            
+            if (tmp.length >= 2)
+            {
+                absoluteFileName = fullqualifiedName;
+            }
+            
+            if (absoluteFileName != null)
+            {
+                out.append("+ " );
+            }
+            
+            out.append(fileSectionIdCounter + " " + fileName + "\n");
+            
+            if (absoluteFileName != null)
+            {
+                out.append(absoluteFileName + "\n");
+            }
+            
+            fileSectionIdCounter++;
+        }
+        
+        // add basename to smap
+        int baseClassFileId = -1;
+        typeNameToFileId.put(newBaseSourceunitName, new Integer(fileSectionIdCounter));
+        baseClassFileId = typeNameToFileId.get(newBaseSourceunitName).intValue();
+        
+        if (absoluteBaseSourceunitName != null)
+        {
+            out.append("+ " );
+        }
+        
+        out.append(baseClassFileId + " " + newBaseSourceunitName + "\n");
+        
+        if (absoluteBaseSourceunitName != null)
+        {
+            out.append(absoluteBaseSourceunitName + "\n");
+        }
+        
+        
+        // print LineSection
+        out.append("*L" + "\n");
+        
+        TreeMap<Integer, String> lineInfos = new TreeMap<Integer, String>();
+        StringBuffer lineBuffer = new StringBuffer();
+        for (Iterator<String> iter = mappings.keySet().iterator(); iter.hasNext();)
+        {
+            String typeName = iter.next();
+            int[][] linemappings = mappings.get(typeName);
+            int fileId = typeNameToFileId.get(typeName).intValue();
+            
+            for (int idx = 0; idx < linemappings.length; idx++)
+            {
+                int[] singleLineMapping = linemappings[idx];
+                
+                Integer inputStartLine = new Integer( singleLineMapping[0]);
+                int inputOffset = singleLineMapping[1];
+                int outputLine = singleLineMapping[2];
+                
+                if (inputOffset == 0)
+                {
+                    lineBuffer.append(inputStartLine.intValue());
+                    lineBuffer.append("#" + fileId);
+                    lineBuffer.append(":" + outputLine + "\n");
+                }
+                else
+                {
+                    lineBuffer.append(inputStartLine.intValue());
+                    lineBuffer.append("#" + fileId);
+                    lineBuffer.append("," + inputOffset);
+                    lineBuffer.append(":" + outputLine + "\n");
+                }
+                
+                lineInfos.put(inputStartLine, lineBuffer.toString());
+                lineBuffer.delete(0, lineBuffer.length());
+            }
+        }
+        
+        //add given mappings to itself (basemappings)
+        if (baseMappings != null && baseMappings.length > 0)
+        {
+            for (int idx = 0; idx < baseMappings.length; idx++)
+            {
+                int key = baseMappings[idx][0];
+                int value = baseMappings[idx][1];
+
+                lineBuffer.append(key);
+                lineBuffer.append("#" + baseClassFileId);
+                lineBuffer.append(":" + value + "\n");
+                
+                lineInfos.put(new Integer(key), lineBuffer.toString());
+                lineBuffer.delete(0, lineBuffer.length());
+            }
+        }
+        
+        //add mappings to itself, 
+        //endlinenumber is the maximum linenumber of all entries in linenumbertables of all methods;
+        //endlinenumber is not the endlinenumber of sourcefile, cause it is available at this time
+        TreeMap<Integer, int[]> baseToBaselineInfos = new TreeMap<Integer, int[]>();
+        for (int idx = 1; idx <= endlineNumber; idx++)
+        {
+        	Integer currentLineNumber = new Integer(idx);
+            if (!lineInfos.containsKey(currentLineNumber))
+            {
+            	Integer previousLineNumber = currentLineNumber-1;
+            	if (baseToBaselineInfos.containsKey(previousLineNumber))
+            	{
+            		int[] oldValues = baseToBaselineInfos.get(previousLineNumber);
+            		int intputStartline = oldValues[0];
+            		int repeatCount= oldValues[1]+1;
+            		int newValues[] = {intputStartline, repeatCount};
+            		baseToBaselineInfos.put(currentLineNumber, newValues);
+            	}
+            	else
+            	{
+            		baseToBaselineInfos.put(currentLineNumber, new int[]{currentLineNumber.intValue(), 1});
+            	}
+            }
+        }
+        
+        lineBuffer = new StringBuffer();        
+        for (Iterator<Integer> iter = baseToBaselineInfos.keySet().iterator(); iter.hasNext();)
+        {
+            Integer key= iter.next();
+            int[] endValues = baseToBaselineInfos.get(key);
+            int inputStartLine = endValues[0];
+            int repeatCount = endValues[1];
+        	
+        	lineBuffer.append(inputStartLine);
+            lineBuffer.append("#" + baseClassFileId);
+            
+            if (repeatCount > 1)
+            	lineBuffer.append("," + repeatCount);
+            
+            lineBuffer.append(":" + inputStartLine + "\n");
+            lineInfos.put(new Integer(inputStartLine), lineBuffer.toString());
+            lineBuffer.delete(0, lineBuffer.length());        	
+        }
+        
+        
+        for (Iterator<Integer> iter = lineInfos.keySet().iterator(); iter.hasNext();)
+        {
+            Integer inputStartline= iter.next();
+            String lineInfo = lineInfos.get(inputStartline);
+            
+            out.append(lineInfo);
+        }
+        
+        // print EndStratumSection
+        out.append("*E");
+        
+        return out.toString().getBytes();
+    }
+    
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest001.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest001.java
new file mode 100644
index 0000000..cbd467c
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest001.java
@@ -0,0 +1,136 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTJStratumGenerationTest001.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.objectteams.otdt.core.compiler.ISMAPConstants;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.FileInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.LineInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.RoleSmapGenerator;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.SmapStratum;
+
+/**
+ * @author ike
+ *
+ */
+public class OTJStratumGenerationTest001 extends AbstractSourceMapGeneratorTest
+{
+	private org.eclipse.jdt.core.ICompilationUnit _role; 
+	private org.eclipse.jdt.core.ICompilationUnit _team;
+	
+    public OTJStratumGenerationTest001(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        return new Suite(OTJStratumGenerationTest001.class);
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("JSR-045");
+        super.setUpSuite();
+    }
+    
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        _role = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "roleFile.TeamA",
+                "RoleA.java");
+
+        _team = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "roleFile",
+                "TeamA.java");
+    }
+    
+    public void testSimpleRoleSmapGeneration() throws JavaModelException
+    {
+        SmapStratum stratum = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo = stratum.getOrCreateFileInfo("RoleA.java","roleFile/TeamA/RoleA.java");
+        LineInfo lineInfo = new LineInfo(1,1);
+        lineInfo.setRepeatCount(11);
+        LineInfo lineInfo1 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo2 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+        fileInfo.addLineInfo(lineInfo);
+        fileInfo.addLineInfo(lineInfo1);
+        fileInfo.addLineInfo(lineInfo2);
+        
+        stratum.optimize();
+        
+        TYPENAME = "__OT__RoleA";
+        List <SmapStratum>strata = new ArrayList<SmapStratum>();
+        strata.add(stratum);
+        
+        expectedStrata.put(TYPENAME, strata);
+        
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_team, _role});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void callback(CompilationUnitDeclaration cuDecl)
+    {
+        TypeDeclaration typeDecl = cuDecl.types[0];
+        
+        assertNotNull("TypeDeclaration should not be null.", typeDecl);
+        
+        if (typeDecl.memberTypes == null)
+        {
+            return;
+        }
+        
+        TypeDeclaration [] members = typeDecl.memberTypes;
+        for (int idx = 0; idx < members.length; idx++)
+        {
+            TypeDeclaration decl = members[idx];
+            String typeName = String.valueOf(decl.name);
+            
+            if (decl.isRole() && !decl.isInterface() && typeName.equals(TYPENAME))
+            {
+                RoleSmapGenerator rolefileSmapGenerator = new RoleSmapGenerator(decl);
+                rolefileSmapGenerator.addStratum("OTJ");
+                rolefileSmapGenerator.generate();
+                List actualStrata = rolefileSmapGenerator.getStrata();
+                
+                assertEquals("Strata of type \"" + typeName + "\" should be equal.\n", expectedStrata.get(typeName), actualStrata);
+            }
+        }
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest002.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest002.java
new file mode 100644
index 0000000..157c164
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest002.java
@@ -0,0 +1,297 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTJStratumGenerationTest002.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.objectteams.otdt.core.compiler.ISMAPConstants;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.FileInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.LineInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.RoleSmapGenerator;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.SmapStratum;
+
+/**
+ * @author ike
+ *
+ */
+public class OTJStratumGenerationTest002 extends AbstractSourceMapGeneratorTest
+{
+	private org.eclipse.jdt.core.ICompilationUnit _subTeam; 
+	private org.eclipse.jdt.core.ICompilationUnit _superTeam;
+	private org.eclipse.jdt.core.ICompilationUnit _superSuperTeam;
+    private String _enclosingTypename;
+	
+    public OTJStratumGenerationTest002(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        return new Suite(OTJStratumGenerationTest002.class);
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("JSR-045");
+        super.setUpSuite();
+    }
+    
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        
+        _subTeam = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "copyInheritance",
+                "SubTeam.java");
+
+        _superTeam = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "copyInheritance",
+                "SuperTeam.java");
+
+        _superSuperTeam = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "copyInheritance",
+                "SuperSuperTeam.java");
+    }
+    public void testSimpleCopyInheritanceSmapRoleA() throws JavaModelException
+    {
+        SmapStratum stratum_role = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+ 
+        // letters (a) ... indicate the order in which lines are assigned
+        // class position is used by ctor, initFields and getTeam
+        
+        FileInfo fileInfo0 = stratum_role.getOrCreateFileInfo("SuperSuperTeam.java", "copyInheritance/SuperSuperTeam.java");
+        LineInfo lineInfo1_role0 = new LineInfo(4,25); // (c) class position (4) mapped to synthetic line 25
+        LineInfo lineInfo2_role0 = new LineInfo(8,29); // (e) method roleMethod0 (8..) mapped to synthetic lines 29-30  
+        lineInfo2_role0.setRepeatCount(2);
+        LineInfo lineInfo3_role0 = new LineInfo(12,31); // (f) method roleMethod1 (12,14,15) mapped to synthetic lines 31,33,34
+        lineInfo3_role0.setRepeatCount(4); // repeat 4 although line numbers have a "hole" at comment line 32
+        
+        fileInfo0.addLineInfo(lineInfo1_role0);
+        fileInfo0.addLineInfo(lineInfo2_role0);
+        fileInfo0.addLineInfo(lineInfo3_role0);
+         
+        FileInfo fileInfo1 = stratum_role.getOrCreateFileInfo("SuperTeam.java", "copyInheritance/SuperTeam.java");
+        LineInfo lineInfo1_role1 = new LineInfo(4,24); // (b) class position (4) mapped to synthetic line 24
+        LineInfo lineInfo2_role1 = new LineInfo(11,26); // (d) roleMethod0 (11..) mapped to synthetic lines 26-28
+        lineInfo2_role1.setRepeatCount(3);
+        LineInfo lineInfo3_role1 = new LineInfo(8,35); // (g) method roleMethod2 (8..) mapped to synthetic lines 35-36 
+        lineInfo3_role1.setRepeatCount(2);
+        
+        fileInfo1.addLineInfo(lineInfo1_role1);
+        fileInfo1.addLineInfo(lineInfo2_role1);
+        fileInfo1.addLineInfo(lineInfo3_role1);
+
+        
+        FileInfo fileInfo2 = stratum_role.getOrCreateFileInfo("SubTeam.java", "copyInheritance/SubTeam.java");
+        
+        LineInfo lineInfo1_role2 = new LineInfo(1,1); // (a) all original lines from SubTeam
+        lineInfo1_role2.setRepeatCount(23);
+        LineInfo lineInfo2_role2 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo3_role2 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+        
+        fileInfo2.addLineInfo(lineInfo1_role2);
+        fileInfo2.addLineInfo(lineInfo2_role2);
+        fileInfo2.addLineInfo(lineInfo3_role2);
+        
+        stratum_role.optimize();
+        
+        HashMap<String, int[]> expectedMethodLineNumbers = new HashMap<String, int[]>();
+        expectedMethodLineNumbers.put("copyInheritance.SubTeam$__OT__RoleA.roleMethod0(LcopyInheritance/SubTeam$TSuper__OT__SuperTeam;)V", new int[]{26,27,28});
+        expectedMethodLineNumbers.put("copyInheritance.SubTeam$__OT__RoleA.roleMethod0(LcopyInheritance/SuperTeam$TSuper__OT__SuperSuperTeam;)V", new int[]{29,30});
+        expectedMethodLineNumbers.put("copyInheritance.SubTeam$__OT__RoleA.roleMethod1()V", new int[]{31,33,34});
+        expectedMethodLineNumbers.put("copyInheritance.SubTeam$__OT__RoleA.roleMethod2()V", new int[]{35,36});
+        
+        TYPENAME = "__OT__RoleA";
+        _enclosingTypename= "SubTeam";
+        
+        List <SmapStratum>strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role);
+        
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            String outputPath = getWorkspaceRoot().getLocationURI().getPath()+"/"+getTestProjectDir()+"/bin";
+			parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_superSuperTeam, _superTeam, _subTeam}, 
+            				expectedMethodLineNumbers,
+            				null/*classPaths*/,
+            				outputPath); // need this so that class files are actually written for next phase
+			
+            // recompile SubTeam only to check usage of byte code information (CopyInheritanceSrc):
+            String [] classPaths = getDefaultClassPaths();
+            int oldLen = classPaths.length;
+			System.arraycopy(classPaths, 0, classPaths=new String[oldLen+1], 1, oldLen);
+            classPaths[0] = outputPath;
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_subTeam}, 
+            			    expectedMethodLineNumbers,
+            			    classPaths,			 // needed for retrieving class files from previous phase
+            			    null/*outputPath*/);
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSimpleCopyInheritanceSmapConfined()
+    {
+    	SmapStratum stratum_role = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+    	
+    	FileInfo fileInfo_role0 = stratum_role.getOrCreateFileInfo("Team.java", "org/objectteams/Team.java");
+    	LineInfo lineInfo1_role0 = new LineInfo(OT_CONFINED_GET_TEAM_LINE, 25); // mapped line of _OT$getTeam() to synthetic line 25
+        
+    	fileInfo_role0.addLineInfo(lineInfo1_role0);
+        
+        FileInfo fileInfo_role1 = stratum_role.getOrCreateFileInfo("SuperSuperTeam.java", "copyInheritance/SuperSuperTeam.java");
+        LineInfo lineInfo1_role1 = new LineInfo(2,24); // default ctor at team position (2) mapped to synthetic line 25
+        
+        fileInfo_role1.addLineInfo(lineInfo1_role1);
+        
+        // no contribution from SuperTeam$__OT__Confined
+        
+        FileInfo fileInfo_role3 = stratum_role.getOrCreateFileInfo("SubTeam.java", "copyInheritance/SubTeam.java");
+        LineInfo lineInfo3_role3 = new LineInfo(1,1);
+        lineInfo3_role3.setRepeatCount(23);				// all 23 lines of SubTeam.java unmapped
+        LineInfo lineInfo5_role3 = new LineInfo(65533,65533);
+        lineInfo5_role3.setRepeatCount(2);
+        
+        fileInfo_role3.addLineInfo(lineInfo3_role3);
+        fileInfo_role3.addLineInfo(lineInfo5_role3);
+        
+        TYPENAME = "__OT__Confined";
+        _enclosingTypename= "SubTeam";
+        List <SmapStratum>strata_role_confined = new ArrayList<SmapStratum>();
+        strata_role_confined.add(stratum_role);
+        
+        expectedStrata.put(TYPENAME, strata_role_confined);
+        
+        HashMap<String, int[]> expectedMethodLineNumbers = new HashMap<String, int[]>();
+        expectedMethodLineNumbers.put("copyInheritance.SubTeam$__OT__Confined._OT$getTeam()Lorg/objectteams/ITeam;", new int[]{25});
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_superSuperTeam, _superTeam, _subTeam}, expectedMethodLineNumbers);
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testCopyInheritanceOutOfOrderStatements() {
+    	SmapStratum stratum_role = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        
+        FileInfo fileInfo0 = stratum_role.getOrCreateFileInfo("SuperTeam2.java", "copyInheritance/SuperTeam2.java");
+        LineInfo lineInfo1_role0 = new LineInfo(6,7); // class position (6) mapped to synthetic line 7
+        fileInfo0.addLineInfo(lineInfo1_role0);
+        LineInfo lineInfo2_role0 = new LineInfo(8,8); // method (8) mapped to synthetic line 8..
+        lineInfo2_role0.setRepeatCount(5);
+        fileInfo0.addLineInfo(lineInfo2_role0);
+        
+        FileInfo fileInfo1 = stratum_role.getOrCreateFileInfo("SubTeam2.java", "copyInheritance/SubTeam2.java");
+        LineInfo lineInfo1_role1 = new LineInfo(1,1); // all 6 lines unmapped
+        lineInfo1_role1.setRepeatCount(6);
+        fileInfo1.addLineInfo(lineInfo1_role1);
+        
+        LineInfo lineInfo2_role1 = new LineInfo(65533,65533);
+        lineInfo2_role1.setRepeatCount(2);
+        
+        fileInfo1.addLineInfo(lineInfo2_role1);
+
+     
+        TYPENAME = "__OT__R";
+        _enclosingTypename = "SubTeam2";
+        
+        List <SmapStratum>strata_role = new ArrayList<SmapStratum>();
+        strata_role.add(stratum_role);
+        
+        expectedStrata.put(TYPENAME, strata_role);
+        
+        HashMap<String, int[]> expectedMethodLineNumbers = new HashMap<String, int[]>();
+        //expectedMethodLineNumbers.put("copyInheritance.SubTeam$__OT__Confined._OT$getTeam()Lorg/objectteams/Team;", new int[]{25});
+
+
+        try
+        {
+        	ICompilationUnit superTeam = getCompilationUnit(
+        			getTestProjectDir(),
+        			"src",
+        			"copyInheritance",
+        	"SuperTeam2.java");
+        	
+        	ICompilationUnit subTeam = getCompilationUnit(
+        			getTestProjectDir(),
+        			"src",
+        			"copyInheritance",
+        	"SubTeam2.java");
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{superTeam, subTeam}, expectedMethodLineNumbers);
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    public void callback(CompilationUnitDeclaration cuDecl)
+    {
+        String cuDeclName = String.valueOf(cuDecl.getMainTypeName());
+        if (!_enclosingTypename.equals(cuDeclName))
+            return;
+        
+        TypeDeclaration typeDecl = cuDecl.types[0];
+        
+        assertNotNull("TypeDeclaration should not be null.", typeDecl);
+        
+        assertTrue("Membertypes of TypeDeclaration should be greater than 0.", typeDecl.memberTypes.length > 0);
+        
+        TypeDeclaration [] members = typeDecl.memberTypes;
+        for (int idx = 0; idx < members.length; idx++)
+        {
+            TypeDeclaration decl = members[idx];
+            String typeName = String.valueOf(decl.name);
+            
+            if (decl.isRole() && !decl.isInterface() && typeName.equals(TYPENAME))
+            {
+                RoleSmapGenerator rolefileSmapGenerator = new RoleSmapGenerator(decl);
+                rolefileSmapGenerator.addStratum("OTJ");
+                rolefileSmapGenerator.generate();
+                List actualStrata = rolefileSmapGenerator.getStrata();
+                // note: using assert(String,String,String) helps debugging, since this one supports visual compare
+                assertEquals("Strata of type \"" + typeName + "\" should be equal.\n", expectedStrata.get(typeName).toString(), actualStrata.toString());
+            }
+        }
+    }
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest003.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest003.java
new file mode 100644
index 0000000..0511b7e
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest003.java
@@ -0,0 +1,200 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTJStratumGenerationTest003.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.objectteams.otdt.core.compiler.ISMAPConstants;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.FileInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.LineInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.RoleSmapGenerator;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.SmapStratum;
+
+/**
+ * @author ike
+ *
+ */
+public class OTJStratumGenerationTest003 extends AbstractSourceMapGeneratorTest
+{
+	private org.eclipse.jdt.core.ICompilationUnit _team1; 
+	private org.eclipse.jdt.core.ICompilationUnit _team2;
+	private org.eclipse.jdt.core.ICompilationUnit _role;
+    private String _enclosingTypename;
+	private String _packagePath;
+	
+    public OTJStratumGenerationTest003(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        return new Suite(OTJStratumGenerationTest003.class);
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("JSR-045");
+        super.setUpSuite();
+    }
+    
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        
+        _packagePath = "roleFileAndCopyInh";
+        	  
+        _team1 = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                _packagePath,
+                "SubTeam.java");
+
+        _team2 = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                _packagePath,
+                "SuperTeam.java");
+        
+        _role = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "roleFileAndCopyInh.SuperTeam",
+                "RoleA.java");
+    }
+    
+    public void testSmapGeneration1() throws JavaModelException
+    {
+    	
+        TYPENAME = "__OT__RoleA";
+        _enclosingTypename = "SubTeam";
+        
+        String roleFileSourceName = "RoleA.java";
+        
+        SmapStratum stratum_role = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo1 = stratum_role.getOrCreateFileInfo(
+        		roleFileSourceName, _packagePath + "/" + "SuperTeam" + "/" + roleFileSourceName);
+        
+        LineInfo lineInfo1 = new LineInfo(5,1);  // role (5..) mapped to synthetic line 1  (no own lines in SubTeam.RoleA).
+        LineInfo lineInfo2 = new LineInfo(9,2); // method roleMethod (9..) mapped to synthetic line 2..  
+        lineInfo2.setRepeatCount(2);
+        LineInfo lineInfo3 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo4 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+        
+        fileInfo1.addLineInfo(lineInfo1);
+        fileInfo1.addLineInfo(lineInfo2);
+        fileInfo1.addLineInfo(lineInfo3);
+        fileInfo1.addLineInfo(lineInfo4);
+
+        stratum_role.optimize();
+        
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role);
+        
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_team2, _team1, _role});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSmapGeneration2()
+    {
+        SmapStratum stratum_role = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+
+        FileInfo fileInfo = stratum_role.getOrCreateFileInfo("Team.java", "org/objectteams/Team.java");
+        LineInfo lineInfo1 = new LineInfo(OT_CONFINED_GET_TEAM_LINE,22); // getTeam mapped to synthetic line 22
+        fileInfo.addLineInfo(lineInfo1);
+    	
+        FileInfo fileInfo1 = stratum_role.getOrCreateFileInfo("SuperTeam.java", "roleFileAndCopyInh/SuperTeam.java");
+        LineInfo lineInfo2 = new LineInfo(3,21); // class position to first synthetic line 21
+        fileInfo1.addLineInfo(lineInfo2);
+        
+        FileInfo fileInfo2 = stratum_role.getOrCreateFileInfo("SubTeam.java", "roleFileAndCopyInh/SubTeam.java");
+        LineInfo lineInfo3 = new LineInfo(1,1); // all lines of SubTeam unmapped
+        lineInfo3.setRepeatCount(20);
+        LineInfo lineInfo5 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo6 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+        fileInfo2.addLineInfo(lineInfo3);
+        fileInfo2.addLineInfo(lineInfo5);
+        fileInfo2.addLineInfo(lineInfo6);
+        
+        stratum_role.optimize();
+        
+        TYPENAME = "__OT__Confined";
+        _enclosingTypename = "SubTeam";
+        List<SmapStratum> strata_role2 = new ArrayList<SmapStratum>();
+        strata_role2.add(stratum_role);
+        
+        expectedStrata.put(TYPENAME, strata_role2);
+        
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_team2, _team1, _role});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void callback(CompilationUnitDeclaration cuDecl)
+    {
+        String cuDeclName = String.valueOf(cuDecl.getMainTypeName());
+        if (!_enclosingTypename.equals(cuDeclName))
+            return;
+        
+        
+        TypeDeclaration typeDecl = cuDecl.types[0];
+        
+        assertNotNull("TypeDeclaration should not be null.", typeDecl);
+        
+        assertTrue("Membertypes of TypeDeclaration should be greater than 0.", typeDecl.memberTypes.length > 0);
+        
+        TypeDeclaration [] members = typeDecl.memberTypes;
+        for (int idx = 0; idx < members.length; idx++)
+        {
+            TypeDeclaration decl = members[idx];
+            String typeName = String.valueOf(decl.name);
+            
+            if (decl.isRole() && !decl.isInterface() && typeName.equals(TYPENAME))
+            {
+                RoleSmapGenerator roleSmapGenerator = new RoleSmapGenerator(decl);
+                roleSmapGenerator.addStratum("OTJ");
+                roleSmapGenerator.generate();
+                List actualStrata = roleSmapGenerator.getStrata();
+                
+                assertEquals("Strata of type \"" + typeName + "\" should be equal.\n", expectedStrata.get(typeName).toString(), actualStrata.toString());
+            }
+        }
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest004.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest004.java
new file mode 100644
index 0000000..46db4b5
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest004.java
@@ -0,0 +1,182 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTJStratumGenerationTest004.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.objectteams.otdt.core.compiler.ISMAPConstants;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.FileInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.LineInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.RoleSmapGenerator;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.SmapStratum;
+
+/**
+ * @author ike
+ *
+ */
+public class OTJStratumGenerationTest004 extends AbstractSourceMapGeneratorTest
+{
+	private org.eclipse.jdt.core.ICompilationUnit _team1; 
+	@SuppressWarnings("unused")
+	private org.eclipse.jdt.core.ICompilationUnit _team2;
+	private org.eclipse.jdt.core.ICompilationUnit _role;
+    private String _enclosingTypename;
+	
+    public OTJStratumGenerationTest004(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        return new Suite(OTJStratumGenerationTest004.class);
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("JSR-045");
+        super.setUpSuite();
+    }
+    
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        
+        _team1 = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "roleAndTeam",
+                "TeamA.java");
+
+        _role = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "roleAndTeam.TeamA",
+                "RoleA.java");
+    }
+    
+    public void testSmapGeneration1() throws JavaModelException
+    {
+        TYPENAME = "__OT__RoleA";
+        _enclosingTypename = "TeamA";
+
+    	SmapStratum stratum_role1 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo1 = stratum_role1.getOrCreateFileInfo("RoleA.java", "roleAndTeam/TeamA/RoleA.java");
+        LineInfo lineInfo1 = new LineInfo(1,1);
+        lineInfo1.setRepeatCount(11);
+        LineInfo lineInfo2 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo3 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+
+        fileInfo1.addLineInfo(lineInfo1);
+        fileInfo1.addLineInfo(lineInfo2);
+        fileInfo1.addLineInfo(lineInfo3);
+        
+        stratum_role1.optimize();
+        
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role1);
+        
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_team1, _role});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSmapGeneration2()
+    {
+        TYPENAME = "__OT__Confined";
+        _enclosingTypename = "TeamA";
+
+    	SmapStratum stratum_role2 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo1 = stratum_role2.getOrCreateFileInfo("Team.java", "org/objectteams/Team.java");
+        LineInfo lineInfo1 = new LineInfo(OT_CONFINED_GET_TEAM_LINE,16);
+        fileInfo1.addLineInfo(lineInfo1);
+        
+        FileInfo fileInfo2 = stratum_role2.getOrCreateFileInfo("TeamA.java", "roleAndTeam/TeamA.java");
+        LineInfo lineInfo2 = new LineInfo(1,1);
+        lineInfo2.setRepeatCount(15);
+        LineInfo lineInfo3 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo4 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+        fileInfo2.addLineInfo(lineInfo2);
+        fileInfo2.addLineInfo(lineInfo3);
+        fileInfo2.addLineInfo(lineInfo4);
+        
+        stratum_role2.optimize();
+        
+        List<SmapStratum> strata_role2 = new ArrayList<SmapStratum>();
+        strata_role2.add(stratum_role2);
+        
+        expectedStrata.put(TYPENAME, strata_role2);
+        
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_team1, _role});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void callback(CompilationUnitDeclaration cuDecl)
+    {
+        String cuDeclName = String.valueOf(cuDecl.getMainTypeName());
+        if (!_enclosingTypename.equals(cuDeclName))
+            return;
+        
+        
+        TypeDeclaration typeDecl = cuDecl.types[0];
+        
+        assertNotNull("TypeDeclaration should not be null.", typeDecl);
+        
+        assertTrue("Membertypes of TypeDeclaration should be greater than 0.", typeDecl.memberTypes.length > 0);
+        
+        TypeDeclaration [] members = typeDecl.memberTypes;
+        for (int idx = 0; idx < members.length; idx++)
+        {
+            TypeDeclaration decl = members[idx];
+            String typeName = String.valueOf(decl.name);
+            
+            if (decl.isRole() && !decl.isInterface() && typeName.equals(TYPENAME))
+            {
+                RoleSmapGenerator rolefileSmapGenerator = new RoleSmapGenerator(decl);
+                rolefileSmapGenerator.addStratum("OTJ");
+                rolefileSmapGenerator.generate();
+                List actualStrata = rolefileSmapGenerator.getStrata();
+                
+                assertEquals("Strata of type \"" + typeName + "\" should be equal.\n", expectedStrata.get(typeName).toString(), actualStrata.toString());
+            }
+        }
+    }
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest005.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest005.java
new file mode 100644
index 0000000..2261508
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest005.java
@@ -0,0 +1,265 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTJStratumGenerationTest005.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.objectteams.otdt.core.compiler.ISMAPConstants;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.FileInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.LineInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.RoleSmapGenerator;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.SmapStratum;
+
+/**
+ * @author ike
+ *
+ */
+public class OTJStratumGenerationTest005 extends AbstractSourceMapGeneratorTest
+{
+	private org.eclipse.jdt.core.ICompilationUnit _superTeam; 
+	private org.eclipse.jdt.core.ICompilationUnit _subTeam;
+	private org.eclipse.jdt.core.ICompilationUnit _baseClass;
+	private String _enclosingTypename;
+    
+	
+    public OTJStratumGenerationTest005(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        return new Suite(OTJStratumGenerationTest005.class);
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("JSR-045");
+        super.setUpSuite();
+    }
+    
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        
+        _superTeam = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "callout",
+                "SuperTeam.java");
+
+        _subTeam = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "callout",
+                "SubTeam.java");
+        
+        _baseClass = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "callout",
+                "BaseClass.java");
+    }
+    
+    public void testSmapGeneration1() throws JavaModelException
+    {
+        SmapStratum stratum_role1 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo_role1 = stratum_role1.getOrCreateFileInfo("SuperTeam.java", "callout/SuperTeam.java");
+        LineInfo lineInfo1_role1 = new LineInfo(1,1);
+        lineInfo1_role1.setRepeatCount(10);
+        LineInfo lineInfo2 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo3 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+
+        fileInfo_role1.addLineInfo(lineInfo1_role1);
+        fileInfo_role1.addLineInfo(lineInfo2);
+        fileInfo_role1.addLineInfo(lineInfo3);
+        
+        stratum_role1.optimize();
+        
+        TYPENAME = "__OT__RoleA";
+        _enclosingTypename = "SuperTeam";
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role1);
+        
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_baseClass, _superTeam, _subTeam});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSmapGeneration2()
+    {
+        SmapStratum stratum_role2 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);;
+        
+        FileInfo fileinfo = stratum_role2.getOrCreateFileInfo("Team.java", "org/objectteams/Team.java");
+        LineInfo lineInfo1 = new LineInfo(OT_CONFINED_GET_TEAM_LINE,11);
+        fileinfo.addLineInfo(lineInfo1);
+        
+        FileInfo fileInfo_role2 = stratum_role2.getOrCreateFileInfo("SuperTeam.java", "callout/SuperTeam.java");
+        LineInfo lineInfo2 = new LineInfo(1,1);
+        lineInfo2.setRepeatCount(10);
+        LineInfo lineInfo3 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo4 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+        fileInfo_role2.addLineInfo(lineInfo2);
+        fileInfo_role2.addLineInfo(lineInfo3);
+        fileInfo_role2.addLineInfo(lineInfo4);
+        
+        stratum_role2.optimize();
+        
+        TYPENAME = "__OT__Confined";
+        _enclosingTypename = "SuperTeam";
+        List<SmapStratum> strata_role2 = new ArrayList<SmapStratum>();
+        strata_role2.add(stratum_role2);
+        
+        expectedStrata.put(TYPENAME, strata_role2);
+        
+        try
+        {
+        	 parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_baseClass, _superTeam, _subTeam});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSmapGeneration3() throws JavaModelException
+    {
+        SmapStratum stratum_role1 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        
+        FileInfo fileInfo1_role1 = stratum_role1.getOrCreateFileInfo("SuperTeam.java", "callout/SuperTeam.java");
+        LineInfo fileInfo1_lineInfo1 = new LineInfo(4,10);
+        LineInfo fileInfo1_lineInfo2 = new LineInfo(8,11);
+        fileInfo1_role1.addLineInfo(fileInfo1_lineInfo1);
+        fileInfo1_role1.addLineInfo(fileInfo1_lineInfo2);
+        FileInfo fileInfo2_role1 = stratum_role1.getOrCreateFileInfo("SubTeam.java", "callout/SubTeam.java");
+        LineInfo fileInfo2_lineInfo1 = new LineInfo(1,1);
+        fileInfo2_lineInfo1.setRepeatCount(9);
+        LineInfo fileInfo2_lineInfo4 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo fileInfo2_lineInfo5 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+
+        fileInfo2_role1.addLineInfo(fileInfo2_lineInfo1);
+        fileInfo2_role1.addLineInfo(fileInfo2_lineInfo4);
+        fileInfo2_role1.addLineInfo(fileInfo2_lineInfo5);
+
+        stratum_role1.optimize();
+        
+        TYPENAME = "__OT__RoleA";
+        _enclosingTypename = "SubTeam";
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role1);
+        
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_baseClass, _superTeam, _subTeam});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSmapGeneration4()
+    {
+    	SmapStratum stratum_role2 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+    
+    	FileInfo fileinfo = stratum_role2.getOrCreateFileInfo("Team.java", "org/objectteams/Team.java");
+    	LineInfo lineInfo1 = new LineInfo(OT_CONFINED_GET_TEAM_LINE,11);
+    	fileinfo.addLineInfo(lineInfo1);
+    
+        FileInfo fileInfo1 = stratum_role2.getOrCreateFileInfo("SuperTeam.java", "callout/SuperTeam.java");
+        LineInfo lineInfo2 = new LineInfo(2,10);
+        fileInfo1.addLineInfo(lineInfo2);
+        
+        FileInfo fileInfo2 = stratum_role2.getOrCreateFileInfo("SubTeam.java", "callout/SubTeam.java");
+        LineInfo lineInfo3 = new LineInfo(1,1);
+        lineInfo3.setRepeatCount(9);
+        LineInfo lineInfo5 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo6 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+        fileInfo2.addLineInfo(lineInfo3);
+        fileInfo2.addLineInfo(lineInfo5);
+        fileInfo2.addLineInfo(lineInfo6);        
+        
+        stratum_role2.optimize();
+        
+        TYPENAME = "__OT__Confined";
+        _enclosingTypename = "SubTeam";
+        List<SmapStratum> strata_role2 = new ArrayList<SmapStratum>();
+        strata_role2.add(stratum_role2);
+        
+        expectedStrata.put(TYPENAME, strata_role2);
+        
+        try
+        {
+        	 parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_baseClass, _superTeam, _subTeam});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void callback(CompilationUnitDeclaration cuDecl)
+    {
+        String cuDeclName = String.valueOf(cuDecl.getMainTypeName());
+        if (!_enclosingTypename.equals(cuDeclName))
+            return;
+        
+        
+        TypeDeclaration typeDecl = cuDecl.types[0];
+        
+        assertNotNull("TypeDeclaration should not be null.", typeDecl);
+        
+        assertTrue("Membertypes of TypeDeclaration should be greater than 0.", typeDecl.memberTypes.length > 0);
+        
+        TypeDeclaration [] members = typeDecl.memberTypes;
+        for (int idx = 0; idx < members.length; idx++)
+        {
+            TypeDeclaration decl = members[idx];
+            String typeName = String.valueOf(decl.name);
+            
+            if (decl.isRole() && !decl.isInterface() && typeName.equals(TYPENAME))
+            {
+                RoleSmapGenerator rolefileSmapGenerator = new RoleSmapGenerator(decl);
+                rolefileSmapGenerator.addStratum("OTJ");
+                rolefileSmapGenerator.generate();
+                List actualStrata = rolefileSmapGenerator.getStrata();
+                
+                assertEquals("Strata of type \"" + typeName + "\" should be equal.\n", expectedStrata.get(typeName).toString(), actualStrata.toString());
+            }
+        }
+    }
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest006.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest006.java
new file mode 100644
index 0000000..d208996
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest006.java
@@ -0,0 +1,271 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTJStratumGenerationTest006.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.objectteams.otdt.core.compiler.ISMAPConstants;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.FileInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.LineInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.RoleSmapGenerator;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.SmapStratum;
+
+/**
+ * @author ike
+ *
+ */
+public class OTJStratumGenerationTest006 extends AbstractSourceMapGeneratorTest
+{
+	private org.eclipse.jdt.core.ICompilationUnit _superTeam; 
+	private org.eclipse.jdt.core.ICompilationUnit _subTeam;
+	private org.eclipse.jdt.core.ICompilationUnit _baseClass;
+	private String _enclosingTypename;
+    
+	
+    public OTJStratumGenerationTest006(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        return new Suite(OTJStratumGenerationTest006.class);
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("JSR-045");
+        super.setUpSuite();
+    }
+    
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        
+        _superTeam = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "calloutOverride",
+                "SuperTeam.java");
+
+        _subTeam = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "calloutOverride",
+                "SubTeam.java");
+        
+        _baseClass = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                "calloutOverride",
+                "BaseClass.java");
+    }
+    
+    public void testSmapGeneration1() throws JavaModelException
+    {
+    	TYPENAME = "__OT__RoleA";
+    	_enclosingTypename = "SuperTeam";
+
+    	SmapStratum stratum_role1 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo_role1 = stratum_role1.getOrCreateFileInfo("SuperTeam.java", "calloutOverride/SuperTeam.java");
+        LineInfo lineInfo1_role1 = new LineInfo(1,1);
+        lineInfo1_role1.setRepeatCount(16);
+        LineInfo lineInfo1_role2 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo1_role3 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+
+        fileInfo_role1.addLineInfo(lineInfo1_role1);
+        fileInfo_role1.addLineInfo(lineInfo1_role2);
+        fileInfo_role1.addLineInfo(lineInfo1_role3);
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role1);
+        
+        stratum_role1.optimize();
+        
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_baseClass, _superTeam, _subTeam});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSmapGeneration2()
+    {
+        SmapStratum stratum_role2 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        
+    	FileInfo fileinfo = stratum_role2.getOrCreateFileInfo("Team.java", "org/objectteams/Team.java");
+    	LineInfo lineInfo1 = new LineInfo(OT_CONFINED_GET_TEAM_LINE,17);
+    	fileinfo.addLineInfo(lineInfo1);
+        
+        FileInfo fileinfo2 = stratum_role2.getOrCreateFileInfo("SuperTeam.java", "calloutOverride/SuperTeam.java");
+        LineInfo lineInfo2 = new LineInfo(1,1);
+        lineInfo2.setRepeatCount(16);
+        LineInfo lineInfo3 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo4 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+        fileinfo2.addLineInfo(lineInfo2);
+        fileinfo2.addLineInfo(lineInfo3);
+        fileinfo2.addLineInfo(lineInfo4);
+        
+        stratum_role2.optimize();
+        
+        TYPENAME = "__OT__Confined";
+        _enclosingTypename = "SuperTeam";
+        List<SmapStratum> strata_role2 = new ArrayList<SmapStratum>();
+        strata_role2.add(stratum_role2);
+        
+        expectedStrata.put(TYPENAME, strata_role2);
+        
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_baseClass, _superTeam, _subTeam});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSmapGeneration3() throws JavaModelException
+    {
+        TYPENAME = "__OT__RoleA";
+        _enclosingTypename = "SubTeam";
+
+    	SmapStratum stratum_role1 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo1 = stratum_role1.getOrCreateFileInfo("SuperTeam.java", "calloutOverride/SuperTeam.java");
+        LineInfo lineInfo1 = new LineInfo(4,15);
+        LineInfo lineInfo2 = new LineInfo(8,18);
+        lineInfo2.setRepeatCount(2);
+        LineInfo lineInfo3 = new LineInfo(13,16);
+        lineInfo3.setRepeatCount(2);
+        
+        fileInfo1.addLineInfo(lineInfo1);
+        fileInfo1.addLineInfo(lineInfo2);
+        fileInfo1.addLineInfo(lineInfo3);
+
+        FileInfo fileInfo2 = stratum_role1.getOrCreateFileInfo("SubTeam.java", "calloutOverride/SubTeam.java");
+        LineInfo lineInfo4 = new LineInfo(1,1);
+        lineInfo4.setRepeatCount(14);
+        LineInfo lineInfo7 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo8 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+
+        fileInfo2.addLineInfo(lineInfo4);
+        fileInfo2.addLineInfo(lineInfo7);
+        fileInfo2.addLineInfo(lineInfo8);
+        
+        stratum_role1.optimize();
+
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role1);
+        
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_baseClass, _superTeam, _subTeam});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSmapGeneration4()
+    {
+        SmapStratum stratum_role2 = new SmapStratum(ISMAPConstants.OTJ_STRATUM_NAME);
+    
+		FileInfo fileinfo = stratum_role2.getOrCreateFileInfo("Team.java", "org/objectteams/Team.java");
+		LineInfo lineInfo1 = new LineInfo(OT_CONFINED_GET_TEAM_LINE,16);
+		fileinfo.addLineInfo(lineInfo1);
+    
+		FileInfo fileInfo2 = stratum_role2.getOrCreateFileInfo("SuperTeam.java", "calloutOverride/SuperTeam.java");
+        LineInfo lineInfo2 = new LineInfo(2,15);
+        fileInfo2.addLineInfo(lineInfo2);
+		
+		FileInfo fileInfo3 = stratum_role2.getOrCreateFileInfo("SubTeam.java", "calloutOverride/SubTeam.java");
+        LineInfo lineInfo3 = new LineInfo(1,1);
+        lineInfo3.setRepeatCount(14);
+        LineInfo lineInfo5 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo6 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+        fileInfo3.addLineInfo(lineInfo3);
+        fileInfo3.addLineInfo(lineInfo5);
+        fileInfo3.addLineInfo(lineInfo6);
+        
+        stratum_role2.optimize();
+        
+        TYPENAME = "__OT__Confined";
+        _enclosingTypename = "SubTeam";
+        List<SmapStratum> strata_role2 = new ArrayList<SmapStratum>();
+        strata_role2.add(stratum_role2);
+        
+        expectedStrata.put(TYPENAME, strata_role2);
+        
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[]{_baseClass, _superTeam, _subTeam});
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void callback(CompilationUnitDeclaration cuDecl)
+    {
+        String cuDeclName = String.valueOf(cuDecl.getMainTypeName());
+        if (!_enclosingTypename.equals(cuDeclName))
+            return;
+        
+        
+        TypeDeclaration typeDecl = cuDecl.types[0];
+        
+        assertNotNull("TypeDeclaration should not be null.", typeDecl);
+        
+        assertTrue("Membertypes of TypeDeclaration should be greater than 0.", typeDecl.memberTypes.length > 0);
+        
+        TypeDeclaration [] members = typeDecl.memberTypes;
+        for (int idx = 0; idx < members.length; idx++)
+        {
+            TypeDeclaration decl = members[idx];
+            String typeName = String.valueOf(decl.name);
+            
+            if (decl.isRole() && !decl.isInterface() && typeName.equals(TYPENAME))
+            {
+                RoleSmapGenerator rolefileSmapGenerator = new RoleSmapGenerator(decl);
+                rolefileSmapGenerator.addStratum("OTJ");
+                rolefileSmapGenerator.generate();
+                List actualStrata = rolefileSmapGenerator.getStrata();
+                
+                assertEquals("Strata of type \"" + typeName + "\" should be equal.\n", expectedStrata.get(typeName).toString(), actualStrata.toString());
+            }
+        }
+    }
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest007.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest007.java
new file mode 100644
index 0000000..2549ea8
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/OTJStratumGenerationTest007.java
@@ -0,0 +1,280 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTJStratumGenerationTest007.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.objectteams.otdt.core.compiler.ISMAPConstants;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.FileInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.LineInfo;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.LineInfoReminder;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.RoleSmapGenerator;
+import org.eclipse.objectteams.otdt.internal.core.compiler.smap.SmapStratum;
+
+/**
+ * @author ike
+ *  
+ */
+public class OTJStratumGenerationTest007 extends AbstractSourceMapGeneratorTest
+{
+    private org.eclipse.jdt.core.ICompilationUnit _teamA;
+
+    @SuppressWarnings("unused")
+	private org.eclipse.jdt.core.ICompilationUnit _tea1m2;
+
+    private org.eclipse.jdt.core.ICompilationUnit _teamB;
+
+    private org.eclipse.jdt.core.ICompilationUnit _baseClass;
+
+    private String _enclosingTypename;
+
+    private String _packagePath;
+
+    private boolean _buildPartially;
+
+    public OTJStratumGenerationTest007(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        return new Suite(OTJStratumGenerationTest007.class);
+    }
+
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("JSR-045");
+        super.setUpSuite();
+    }
+
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+
+        _packagePath = "callin_after_before";
+
+        _teamA = getCompilationUnit(
+                getTestProjectDir(), 
+                "src",
+                _packagePath,
+                "TeamA.java");
+
+        _teamB = getCompilationUnit(
+                getTestProjectDir(), 
+                "src", 
+                _packagePath,
+                "TeamB.java");
+
+        _baseClass = getCompilationUnit(
+                getTestProjectDir(),
+                "src",
+                _packagePath,
+                "BaseClass.java");
+    }
+
+    public void testSmapGeneration1() throws JavaModelException
+    {
+        TYPENAME = "__OT__RoleA";
+        _enclosingTypename = "TeamA";
+        String enclTypeSourceName = _enclosingTypename + ".java";
+        _buildPartially = false;
+
+        SmapStratum stratum_role1 = new SmapStratum(
+                ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo_role1 = stratum_role1.getOrCreateFileInfo(
+                enclTypeSourceName, _packagePath + "/" + enclTypeSourceName);
+        LineInfo lineInfo1_role1 = new LineInfo(1, 1);
+        lineInfo1_role1.setRepeatCount(15);
+        LineInfo lineInfo1_role2 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo1_role3 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+
+        
+        fileInfo_role1.addLineInfo(lineInfo1_role1);
+        fileInfo_role1.addLineInfo(lineInfo1_role2);
+        fileInfo_role1.addLineInfo(lineInfo1_role3);
+
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role1);
+
+        stratum_role1.optimize();
+        
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[] {
+                    _baseClass, _teamA, _teamB });
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+
+    public void testSmapGeneration2() throws JavaModelException
+    {
+        TYPENAME = "__OT__RoleA";
+        _enclosingTypename = "TeamA";
+        String enclTypeSourceName = _enclosingTypename + ".java";
+        _buildPartially = true;
+
+        SmapStratum stratum_role1 = new SmapStratum(
+                ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo_role1 = stratum_role1.getOrCreateFileInfo(
+                enclTypeSourceName, _packagePath + "/" + enclTypeSourceName);
+        fileInfo_role1.addLineInfo(new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER));
+
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role1);
+
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[] {
+                    _baseClass, _teamA, _teamB });
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void testSmapGeneration3() throws JavaModelException
+    {
+        TYPENAME = "__OT__RoleB";
+        _enclosingTypename = "TeamB";
+        String enclTypeSourceName = _enclosingTypename + ".java";
+        _buildPartially = false;
+        
+        SmapStratum stratum_role1 = new SmapStratum(
+                ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo_role1 = stratum_role1.getOrCreateFileInfo(
+                enclTypeSourceName, _packagePath + "/" + enclTypeSourceName);
+        LineInfo lineInfo1_role1 = new LineInfo(1, 1);
+        lineInfo1_role1.setRepeatCount(13);
+        LineInfo lineInfo1_role2 = new LineInfo(ISMAPConstants.STEP_INTO_LINENUMBER,ISMAPConstants.STEP_INTO_LINENUMBER);
+        LineInfo lineInfo1_role3 = new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER);
+
+        fileInfo_role1.addLineInfo(lineInfo1_role1);
+        fileInfo_role1.addLineInfo(lineInfo1_role2);
+        fileInfo_role1.addLineInfo(lineInfo1_role3);
+
+        stratum_role1.optimize();
+        
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role1);
+
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[] {
+                    _baseClass, _teamA, _teamB });
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+
+    
+    public void testSmapGeneration4() throws JavaModelException
+    {
+        TYPENAME = "__OT__RoleB";
+        _enclosingTypename = "TeamB";
+        String enclTypeSourceName = _enclosingTypename + ".java";
+        _buildPartially = true;
+        
+        SmapStratum stratum_role1 = new SmapStratum(
+                ISMAPConstants.OTJ_STRATUM_NAME);
+        FileInfo fileInfo_role1 = stratum_role1.getOrCreateFileInfo(
+                enclTypeSourceName, _packagePath + "/" + enclTypeSourceName);
+        fileInfo_role1.addLineInfo(new LineInfo(ISMAPConstants.STEP_OVER_LINENUMBER,ISMAPConstants.STEP_OVER_LINENUMBER));
+
+        List<SmapStratum> strata_role1 = new ArrayList<SmapStratum>();
+        strata_role1.add(stratum_role1);
+
+        expectedStrata.put(TYPENAME, strata_role1);
+
+        try
+        {
+            parseAndCompile(new org.eclipse.jdt.core.ICompilationUnit[] {
+                    _baseClass, _teamA, _teamB });
+        }
+        catch (JavaModelException e)
+        {
+            fail(e.getMessage());
+        }
+    }
+    
+    public void callback(CompilationUnitDeclaration cuDecl)
+    {
+        String cuDeclName = String.valueOf(cuDecl.getMainTypeName());
+        if (!_enclosingTypename.equals(cuDeclName))
+            return;
+
+        TypeDeclaration typeDecl = cuDecl.types[0];
+
+        assertNotNull("TypeDeclaration should not be null.", typeDecl);
+
+        assertTrue("Membertypes of TypeDeclaration should be greater than 0.",
+                typeDecl.memberTypes.length > 0);
+
+        TypeDeclaration[] members = typeDecl.memberTypes;
+        for (int idx = 0; idx < members.length; idx++)
+        {
+            TypeDeclaration decl = members[idx];
+            String typeName = String.valueOf(decl.name);
+
+            if (decl.isRole() && !decl.isInterface()
+                    && typeName.equals(TYPENAME))
+            {
+                RoleSmapGenerator rolefileSmapGenerator = new RoleSmapGenerator(decl);
+                if (_buildPartially)
+                {
+                    rolefileSmapGenerator.addStratum("OTJ");
+                    SmapStratum stratum = (SmapStratum)rolefileSmapGenerator.getStrata().get(0);
+                    rolefileSmapGenerator.generatePartialOTJSmap(stratum, new LineInfoReminder());
+                }
+                else
+                {
+                    rolefileSmapGenerator.addStratum("OTJ");
+                    rolefileSmapGenerator.generate();
+                }
+                
+                List actualStrata = rolefileSmapGenerator.getStrata();
+
+                assertEquals("Strata of type \"" + typeName
+                        + "\" should be equal.\n",
+                        expectedStrata.get(typeName).toString(), actualStrata.toString());
+            }
+        }
+    }
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/Requestor.java b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/Requestor.java
new file mode 100644
index 0000000..ef9ac20
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/compiler/org/eclipse/objectteams/otdt/tests/compiler/smap/Requestor.java
@@ -0,0 +1,129 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: Requestor.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.compiler.smap;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+import junit.framework.Assert;
+import junit.framework.AssertionFailedError;
+
+import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.core.tests.util.Util;
+import org.eclipse.jdt.core.util.ClassFormatException;
+import org.eclipse.jdt.core.util.IClassFileReader;
+import org.eclipse.jdt.core.util.ILineNumberAttribute;
+import org.eclipse.jdt.core.util.IMethodInfo;
+import org.eclipse.jdt.internal.compiler.ClassFile;
+import org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.eclipse.jdt.internal.compiler.ICompilerRequestor;
+import org.eclipse.jdt.internal.core.util.ClassFileReader;
+
+// from org.eclipse.jdt.core.tests.compiler.regression.Requestor
+// added capability to check generated line numbers.
+public class Requestor extends Assert implements ICompilerRequestor {
+	public boolean hasErrors = false;
+	public String outputPath;
+	private boolean forceOutputGeneration;
+	public Hashtable expectedProblems = new Hashtable();
+	public String problemLog = "";
+	public ICompilerRequestor clientRequestor;
+	public boolean showCategory = false;
+	public boolean showWarningToken = false;
+	HashMap<String, int[]> lineNumbers = new HashMap<String, int[]>();
+
+	
+public Requestor(boolean forceOutputGeneration, ICompilerRequestor clientRequestor, boolean showCategory, boolean showWarningToken, HashMap<String, int[]> lineNumbers) {
+	this.forceOutputGeneration = forceOutputGeneration;
+	this.clientRequestor = clientRequestor;
+	this.showCategory = showCategory;
+	this.showWarningToken = showWarningToken;
+	this.lineNumbers = lineNumbers;
+}
+public void acceptResult(CompilationResult compilationResult) {
+	this.hasErrors |= compilationResult.hasErrors();
+	this.problemLog += Util.getProblemLog(compilationResult, this.showCategory, this.showWarningToken);
+	outputClassFiles(compilationResult);
+	if (this.clientRequestor != null) {
+		this.clientRequestor.acceptResult(compilationResult);
+	}
+}
+protected void outputClassFiles(CompilationResult unitResult) {
+	if ((unitResult != null) && (!unitResult.hasErrors() || forceOutputGeneration)) {
+		ClassFile[]classFiles = unitResult.getClassFiles();
+		for (int i = 0, fileCount = classFiles.length; i < fileCount; i++) {
+			// retrieve the key and the corresponding classfile
+			ClassFile classFile = classFiles[i];
+			if (outputPath != null) {
+				String relativeName = 
+					new String(classFile.fileName()).replace('/', File.separatorChar) + ".class";
+				try {
+					org.eclipse.jdt.internal.compiler.util.Util.writeToDisk(true, outputPath, relativeName, classFile);
+				} catch(IOException e) {
+					e.printStackTrace();
+				}
+			}
+			if (this.lineNumbers != null) {
+				ClassFileReader cfr;
+				try {
+					cfr = new ClassFileReader(classFile.getBytes(), IClassFileReader.METHOD_INFOS|IClassFileReader.METHOD_BODIES);
+				} catch (ClassFormatException e) {
+					throw new AssertionFailedError("Can't read class file: "+e.getMessage());
+				}
+				for (IMethodInfo method : cfr.getMethodInfos()) {
+					String fullMethodDesignator = String.valueOf(
+															CharOperation.concatWith(
+																classFile.getCompoundName(),
+																CharOperation.concat(method.getName(), method.getDescriptor()),
+																'.'));
+					int[] expectedNumbers = this.lineNumbers.get(fullMethodDesignator);
+					if (expectedNumbers != null) {
+						this.lineNumbers.remove(fullMethodDesignator);
+						ILineNumberAttribute lineNumberAttribute = method.getCodeAttribute().getLineNumberAttribute();
+						int[][] table = lineNumberAttribute.getLineNumberTable();
+						Assert.assertEquals("wrong number of line numbers", expectedNumbers.length, table.length);
+						for (int n=0; n<expectedNumbers.length; n++)
+							Assert.assertEquals("wrong line numeber", expectedNumbers[n], table[n][1]);
+					}					
+				}
+			}
+		}
+	}
+}
+public void checkAllLineNumbersSeen() {
+	if (this.lineNumbers != null) {
+		if (!this.lineNumbers.isEmpty()) {
+			String methods = "";
+			for (Map.Entry<String, int[]> entry : this.lineNumbers.entrySet()) {
+				System.out.print("Unmatched line numbers for method "+entry.getKey());
+				for(int l : entry.getValue())
+					System.out.print(" "+l);
+				System.out.println();
+				methods += " "+entry.getKey();
+			}
+			Assert.fail("Unmatched line numbers"+methods);
+		}
+	}
+}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/formatter/org/eclipse/objectteams/otdt/core/tests/formatter/FormatterTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/formatter/org/eclipse/objectteams/otdt/core/tests/formatter/FormatterTests.java
new file mode 100644
index 0000000..85303fd
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/formatter/org/eclipse/objectteams/otdt/core/tests/formatter/FormatterTests.java
@@ -0,0 +1,229 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: FormatterTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.core.tests.formatter;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IWorkspaceDescription;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.formatter.CodeFormatter;
+import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
+
+import org.eclipse.jdt.core.tests.util.Util;
+import org.eclipse.jdt.internal.formatter.DefaultCodeFormatter;
+import org.eclipse.jdt.internal.formatter.DefaultCodeFormatterOptions;
+import org.eclipse.objectteams.otdt.tests.AbstractJavaModelTests;
+import org.eclipse.text.edits.TextEdit;
+
+/** 
+ * Test infra-structure copied from org.eclipse.jdt.core.tests.formatter.FormatterRegressionTests.
+ * 
+ * @author stephan
+ */
+@SuppressWarnings("restriction")
+public class FormatterTests extends AbstractJavaModelTests {
+		
+	public static final int UNKNOWN_KIND = 0;
+	public static final String IN = "_in";
+	public static final String OUT = "_out";
+	public static final boolean DEBUG = false;
+	private static final String LINE_SEPARATOR = System.getProperty("line.separator");
+	private long time;
+	
+	static {
+//		TESTS_NUMBERS = new int[] { 620 } ;
+	}
+	public static Test suite() {
+		return buildModelTestSuite(FormatterTests.class);
+	}
+
+	public FormatterTests(String name) {
+		super(name);
+	}
+	
+	/**
+	 * Returns the OS path to the directory that contains this plugin.
+	 */
+	protected String getPluginDirectoryPath() {
+		try {
+			URL platformURL = Platform.getBundle("org.eclispe.objectteams.otdt.tests").getEntry("/");
+			return new File(FileLocator.toFileURL(platformURL).getFile()).getAbsolutePath();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+
+	public String getSourceWorkspacePath() {
+		return getPluginDirectoryPath() +  java.io.File.separator + "workspace";
+	}
+	
+	private String runFormatter(CodeFormatter codeFormatter, String source, int kind, int indentationLevel, int offset, int length, String lineSeparator) {
+//		long time = System.currentTimeMillis();
+		TextEdit edit = codeFormatter.format(kind, source, offset, length, indentationLevel, lineSeparator);//$NON-NLS-1$
+//		System.out.println((System.currentTimeMillis() - time) + " ms");
+		if (edit == null) return null;
+//		System.out.println(edit.getChildrenSize() + " edits");
+		String result = org.eclipse.jdt.internal.core.util.Util.editedString(source, edit);
+
+		if (length == source.length()) {
+//			time = System.currentTimeMillis();
+			edit = codeFormatter.format(kind, result, 0, result.length(), indentationLevel, lineSeparator);//$NON-NLS-1$
+//			System.out.println((System.currentTimeMillis() - time) + " ms");
+			if (edit == null) return null;
+//			assertEquals("Should not have edits", 0, edit.getChildren().length);
+			final String result2 = org.eclipse.jdt.internal.core.util.Util.editedString(result, edit);
+			if (!result.equals(result2)) {
+				assertSourceEquals("Different reformatting", Util.convertToIndependantLineDelimiter(result), Util.convertToIndependantLineDelimiter(result2));
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Create project and set the jar placeholder.
+	 */
+	public void setUpSuite() throws Exception {
+		// ensure autobuilding is turned off
+		IWorkspaceDescription description = getWorkspace().getDescription();
+		if (description.isAutoBuilding()) {
+			description.setAutoBuilding(false);
+			getWorkspace().setDescription(description);
+		}
+		setUpJavaProject("Formatter", "1.5"); //$NON-NLS-1$ $NON-NLS-2$
+		if (DEBUG) {
+			this.time = System.currentTimeMillis();
+		}
+	}	
+
+	/**
+	 * Reset the jar placeholder and delete project.
+	 */
+	public void tearDownSuite() throws Exception {
+		this.deleteProject("Formatter"); //$NON-NLS-1$
+		if (DEBUG) {
+			System.out.println("Time spent = " + (System.currentTimeMillis() - this.time));//$NON-NLS-1$
+		}
+		super.tearDown();
+	}	
+
+	private String getIn(String compilationUnitName) {
+		assertNotNull(compilationUnitName);
+		int dotIndex = compilationUnitName.indexOf('.');
+		assertTrue(dotIndex != -1);
+		return compilationUnitName.substring(0, dotIndex) + IN + compilationUnitName.substring(dotIndex);
+	}
+	
+	private String getOut(String compilationUnitName) {
+		assertNotNull(compilationUnitName);
+		int dotIndex = compilationUnitName.indexOf('.');
+		assertTrue(dotIndex != -1);
+		return compilationUnitName.substring(0, dotIndex) + OUT + compilationUnitName.substring(dotIndex);
+	}
+
+	private void assertLineEquals(String actualContents, String originalSource, String expectedContents, boolean checkNull) {
+		if (actualContents == null) {
+			assertTrue("actualContents is null", checkNull);
+			assertEquals(expectedContents, originalSource);
+			return;
+		}
+		assertSourceEquals("Different source", Util.convertToIndependantLineDelimiter(expectedContents), actualContents);
+	}
+
+	private void runTest(String packageName, String compilationUnitName) {
+		DefaultCodeFormatterOptions preferences = new DefaultCodeFormatterOptions(DefaultCodeFormatterConstants.getEclipse21Settings());
+		preferences.number_of_empty_lines_to_preserve = 0;
+		DefaultCodeFormatter codeFormatter = new DefaultCodeFormatter(preferences);
+		runTest(codeFormatter, packageName, compilationUnitName, CodeFormatter.K_COMPILATION_UNIT, 0);
+	}
+
+	private void runTest(CodeFormatter codeFormatter, String packageName, String compilationUnitName, int kind, int indentationLevel) {
+		runTest(codeFormatter, packageName, compilationUnitName, kind, indentationLevel, false, 0, -1);
+	}
+	private void runTest(CodeFormatter codeFormatter, String packageName, String compilationUnitName, int kind, int indentationLevel, boolean checkNull, int offset, int length) {
+		runTest(codeFormatter, packageName, compilationUnitName, kind, indentationLevel, checkNull, offset, length, null);
+	}
+
+	private void runTest(CodeFormatter codeFormatter, String packageName, String compilationUnitName, int kind, int indentationLevel, boolean checkNull, int offset, int length, String lineSeparator) {
+		try {
+			ICompilationUnit sourceUnit = getCompilationUnit("Formatter" , "", packageName, getIn(compilationUnitName)); //$NON-NLS-1$ //$NON-NLS-2$
+			String s = sourceUnit.getSource();
+			assertNotNull(s);
+			ICompilationUnit outputUnit = getCompilationUnit("Formatter" , "", packageName, getOut(compilationUnitName)); //$NON-NLS-1$ //$NON-NLS-2$
+			assertNotNull(outputUnit);
+			String result;
+			if (length == -1) {
+				result = runFormatter(codeFormatter, s, kind, indentationLevel, offset, s.length(), lineSeparator);
+			} else {
+				result = runFormatter(codeFormatter, s, kind, indentationLevel, offset, length, lineSeparator);
+			}
+			assertLineEquals(result, s, outputUnit.getSource(), checkNull);
+		} catch (JavaModelException e) {
+			e.printStackTrace();
+			assertTrue(false);
+		}
+	}
+
+	String getSource(ASTNode astNode, char[] source) {
+		String result = new String(CharOperation.subarray(source, astNode.getStartPosition() + 1, astNode.getStartPosition() + astNode.getLength() - 1));
+		if (result.endsWith("\\n")) {
+			return result.substring(0, result.length() - 2) + LINE_SEPARATOR;
+		}
+		return result;
+	}
+
+	public void test001() {
+		runTest("test001", "T1.java");//$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	public void test002() {
+		runTest("test002", "T1.java");//$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	public void test003() {
+		runTest("test003", "T1.java");//$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	public void test004() {
+		runTest("test004", "T1.java");//$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	public void test005() {
+		runTest("test005", "T1.java");//$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	public void test006() {
+		runTest("test006", "T1.java");//$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	public void test007() {
+		runTest("test007", "Class1.java");//$NON-NLS-1$ //$NON-NLS-2$
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/AllTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/AllTests.java
new file mode 100644
index 0000000..270f57f
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/AllTests.java
@@ -0,0 +1,44 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.hierarchy;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author anklam
+ *
+ * @version $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class AllTests {
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("All CompleteRoleHierarchy Tests");
+
+        //$JUnit-BEGIN$
+        suite.addTest(CompleteRoleHierarchyWithClasses.suite());
+        suite.addTest(OTTypeHierarchyTests.suite());
+        suite.addTest(ITypeIOTTypeTest.suite());
+        //$JUnit-END$
+
+        return suite;
+    }
+}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/CompleteRoleHierarchyWithClasses.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/CompleteRoleHierarchyWithClasses.java
new file mode 100644
index 0000000..f67bda4
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/CompleteRoleHierarchyWithClasses.java
@@ -0,0 +1,560 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: CompleteRoleHierarchyWithClasses.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.hierarchy;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.IRoleType;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * @author jwloka
+ * @version $Id: CompleteRoleHierarchyWithClasses.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+/*
+ * The testdata setting looks like this:
+ *                                                                              
+ * SuperSuperTeam
+ *             R1                                             SuperClass
+ *      /\                                                       /\
+ *       |                                                        |
+ *   SuperTeam                                                    |
+ *          R1------------------------------------------------> AClass
+ *      /\                      explicit inheritance             /\
+ *       |                      ~~~~~~~~~~~~~~~~~~~~              |'''''''''''''''''|
+ *     ATeam                                                      |                 |
+ *        R1                                                  SubClass1         SubClass2
+ *      /\                                                       /\                /\
+ *       |'''''''''''''''''''|                |''''''''''''|'''''''''''''|          |
+ *    SubTeam1            SubTeam2            |            |             |          |
+ *          R1                  R1------------------>SubSubClass11 SubSubClass12    |
+ *      /\                                    |                                     | 
+ *       |'''''''''''|                        |                                     |
+ * SubSubTeam11  SubSubTeam12                 |                                     |
+ *           R1            R1-----------------|                                     |
+ *            |                                                                     |
+ *            |---------------------------------------------------------------------|
+ * 
+ * The focus role is ATeam.R1 .
+ */
+public class CompleteRoleHierarchyWithClasses extends FileBasedModelTest
+{
+    private IRoleType _focusRole;
+    private IRoleType _implSuperRole;
+    private IRoleType _implSuperSuperRole;
+    private IRoleType _implSubRole1;
+    private IRoleType _implSubRole2;
+    private IRoleType _implSubSubRole11;
+    private IRoleType _implSubSubRole12;
+    private IType     _class;
+    private IType     _superClass;
+    private IType     _subClass1;
+    private IType     _subClass2;
+    private IType     _subSubClass11;
+    private IType     _subSubClass12;
+    private IType	  _object;
+    
+    private OTTypeHierarchy _hierarchy;
+    
+    
+    public CompleteRoleHierarchyWithClasses(String name)
+    {
+        super(name);
+    }
+    
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(CompleteRoleHierarchyWithClasses.class);
+        }
+        junit.framework.TestSuite suite = 
+            new Suite(CompleteRoleHierarchyWithClasses.class.getName());
+        return suite;
+    }
+    
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("Hierarchy");
+        super.setUpSuite();
+        
+        _focusRole = 
+            getRole(getTestProjectDir(),
+                "complete_rolehierarchy_with_classes",
+                "test002.inlined",
+                "ATeam",
+                "R1");
+ 
+        _hierarchy = new OTTypeHierarchy(_focusRole, _focusRole.getJavaProject(), true);
+        _hierarchy.refresh(new NullProgressMonitor());        
+        
+        _implSuperRole = 
+            getRole(getTestProjectDir(),
+                "complete_rolehierarchy_with_classes",
+                "test002.inlined",
+                "SuperTeam",
+                "R1");
+        
+        _implSuperSuperRole = 
+            getRole(getTestProjectDir(),
+                "complete_rolehierarchy_with_classes",
+                "test002.inlined",
+                "SuperSuperTeam",
+                "R1");
+        
+        _implSubRole1 = 
+            getRole(getTestProjectDir(),
+                    "complete_rolehierarchy_with_classes",
+                    "test002.inlined",
+                    "SubTeam1",
+                    "R1");
+        
+        _implSubRole2 = 
+            getRole(getTestProjectDir(),
+                    "complete_rolehierarchy_with_classes",
+                    "test002.inlined",
+                    "SubTeam2",
+                    "R1");
+        
+        _implSubSubRole11 =
+            getRole(getTestProjectDir(),
+                    "complete_rolehierarchy_with_classes",
+                    "test002.inlined",
+                    "SubSubTeam11",
+                    "R1");
+        
+        _implSubSubRole12 =
+            getRole(getTestProjectDir(),
+                    "complete_rolehierarchy_with_classes",
+                    "test002.inlined",
+                    "SubSubTeam12",
+                    "R1");
+        
+        _class =
+            getType(getTestProjectDir(), 
+                "complete_rolehierarchy_with_classes", 
+                "test002.standard", 
+                "AClass");
+        
+        _superClass =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SuperClass");
+        
+        _subClass1 =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SubClass1");
+        
+        _subClass2 =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SubClass2");
+        
+        _subSubClass11 =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SubSubClass11");
+        
+        _subSubClass12 =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SubSubClass12");
+        
+        _object = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        
+    }
+    
+    public void testContainment_implSuperRole()
+    {
+        assertTrue(_hierarchy.contains((IType)_implSuperRole.getCorrespondingJavaElement()));
+    }
+ 
+    public void testGetExplicitSuperclass_ofFocusRole() throws JavaModelException
+    {
+        assertEquals(_class, _hierarchy.getExplicitSuperclass((IType)_focusRole.getCorrespondingJavaElement()));
+    }        
+    
+    
+    public void testGetExplicitSuperclass_ofImplSuperSuperRole() throws JavaModelException
+    {
+        assertEquals(_object, _hierarchy.getExplicitSuperclass((IType)_implSuperSuperRole.getCorrespondingJavaElement()));
+    }
+    
+    
+    public void testGetExplicitSuperclass_ofImplSuperRole() throws JavaModelException
+    {
+        assertEquals(_class, _hierarchy.getExplicitSuperclass((IType)_implSuperRole.getCorrespondingJavaElement()));
+    }
+
+    
+    public void testGetExplicitSuperclass_ofImplSubRole1() throws JavaModelException
+    {
+        assertEquals(_class, _hierarchy.getExplicitSuperclass((IType)_implSubRole1.getCorrespondingJavaElement()));
+    }
+    
+    
+    public void testGetExplicitSuperclass_ofImplSubRole2() throws JavaModelException
+    {
+        assertEquals(_subSubClass11, _hierarchy.getExplicitSuperclass((IType)_implSubRole2.getCorrespondingJavaElement()));
+    }
+    
+    
+    public void testGetExplicitSuperclass_ofImplSubSubRole11() throws JavaModelException
+    {
+        assertEquals(_subClass2, _hierarchy.getExplicitSuperclass((IType)_implSubSubRole11.getCorrespondingJavaElement()));
+    }
+    
+    
+    public void testGetExplicitSuperclass_ofImplSubSubRole12() throws JavaModelException
+    {
+        assertEquals(_subClass1, _hierarchy.getExplicitSuperclass((IType)_implSubSubRole12.getCorrespondingJavaElement()));
+    }
+    
+    
+    public void testGetAllClasses()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_implSubRole1);
+        expectedList.add(_implSubRole2);
+        expectedList.add(_implSubSubRole11);
+        expectedList.add(_implSubSubRole12);
+        expectedList.add(_object);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_subClass1);
+        expectedList.add(_subClass2);
+        expectedList.add(_subSubClass11);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllClasses();
+        
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllTypes()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_implSubRole1);
+        expectedList.add(_implSubRole2);
+        expectedList.add(_implSubSubRole11);
+        expectedList.add(_implSubSubRole12);
+        expectedList.add(_superClass);
+        expectedList.add(_object);
+        expectedList.add(_class);
+        expectedList.add(_subClass1);
+        expectedList.add(_subClass2);
+        expectedList.add(_subSubClass11);
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        
+        assertTrue(compareTypes(expected, _hierarchy.getAllTypes()));
+    }
+    
+    public void testGetAllSuperclasses_ofFocusRole()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]); 
+        IType[] actual = _hierarchy.getAllSuperclasses((IType)_focusRole.getCorrespondingJavaElement());
+        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_ofImplSuperSuperRole()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_object);
+    
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllSuperclasses((IType)_implSuperSuperRole.getCorrespondingJavaElement());
+        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_ofImplSuperRole()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllSuperclasses((IType)_implSuperRole.getCorrespondingJavaElement());
+
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_ofImplSubRole1()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllSuperclasses((IType)_implSubRole1.getCorrespondingJavaElement());
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_ofImplSubRole2()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_subClass1);
+        expectedList.add(_subSubClass11);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllSuperclasses((IType)_implSubRole2.getCorrespondingJavaElement());
+        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_ofImplSubSubRole11()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_implSubRole1);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_subClass2);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllSuperclasses((IType)_implSubSubRole11.getCorrespondingJavaElement());
+        
+		assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_ofImplSubSubRole12()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_implSubRole1);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_subClass1);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);        
+        IType[] actual = _hierarchy.getAllSuperclasses((IType)_implSubSubRole12.getCorrespondingJavaElement());
+        
+		assertTrue(compareTypes(expected, actual));
+    }
+    
+    
+    public void testGetAllSupertypes_ofFocusRole()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_object);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+       
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]); 
+        IType[] actual = _hierarchy.getAllSupertypes((IType)_focusRole.getCorrespondingJavaElement());
+       
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSupertypes_ofImplSuperSuperRole()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_object);
+
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]); 
+        IType[] actual = _hierarchy.getAllSupertypes((IType)_implSuperSuperRole.getCorrespondingJavaElement());
+
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSupertypes_ofImplSuperRole()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);        
+        IType[] actual = _hierarchy.getAllSupertypes((IType)_implSuperRole.getCorrespondingJavaElement());
+        
+        assertEquals(expected.length, actual.length);
+		assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSupertypes_ofImplSubRole1()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllSupertypes((IType)_implSubRole1.getCorrespondingJavaElement());
+        
+		assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSupertypes_ofImplSubRole2()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_subClass1);
+        expectedList.add(_subSubClass11);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllSupertypes((IType)_implSubRole2.getCorrespondingJavaElement());
+        
+        assertEquals(expected.length, actual.length);
+		assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSupertypes_ofImplSubSubRole11()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_implSubRole1);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_subClass2);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllSupertypes((IType)_implSubSubRole11.getCorrespondingJavaElement());
+        
+        assertEquals(expected.length, actual.length);
+		assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSupertypes_ofImplSubSubRole12()
+    {
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_implSuperSuperRole);
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_implSubRole1);
+        expectedList.add(_superClass);
+        expectedList.add(_class);
+        expectedList.add(_subClass1);
+        expectedList.add(_object);
+        
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _hierarchy.getAllSupertypes((IType)_implSubSubRole12.getCorrespondingJavaElement());
+        
+        assertEquals(expected.length, actual.length);
+		assertTrue(compareTypes(expected, actual));
+    }
+    
+    // succeeds although hierarchy was not built for type.
+    public void testGetAllSubtypes_ofSubClass2()
+    {
+        ArrayList<IRoleType> expectedList = new ArrayList<IRoleType>();
+        expectedList.add(_implSubSubRole11);
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        
+        assertTrue(compareTypes(expected, _hierarchy.getAllSubtypes(_subClass2)));       
+    }
+
+    // succeeds although hierarchy was not built for type.
+    public void testGetAllSubtypes_ofSubSubClass11()
+    {
+        ArrayList<IRoleType> expectedList = new ArrayList<IRoleType>();
+        expectedList.add(_implSubRole2);
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        
+        assertTrue(compareTypes(expected, _hierarchy.getAllSubtypes(_subSubClass11)));       
+    }
+
+    // succeeds although hierarchy was not built for type.
+    public void testGetAllSubtypes_ofSubSubClass12()
+    {
+        IType[] expected = new IType[0];
+        assertTrue(compareTypes(expected, _hierarchy.getAllSubtypes(_subSubClass12)));       
+    }
+    
+    public void testGetAllSubtypes_ofImplSuperSuperRole()
+    {
+        ArrayList<IRoleType> expectedList = new ArrayList<IRoleType>();
+        expectedList.add(_implSuperRole);
+        expectedList.add(_focusRole);
+        expectedList.add(_implSubRole1);
+        expectedList.add(_implSubRole2);
+        expectedList.add(_implSubSubRole11);
+        expectedList.add(_implSubSubRole12);
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        
+        assertTrue(compareTypes(expected, _hierarchy.getAllSubtypes((IType)_implSuperSuperRole.getCorrespondingJavaElement())));                
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/FileBasedHierarchyTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/FileBasedHierarchyTest.java
new file mode 100644
index 0000000..a191e7c
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/FileBasedHierarchyTest.java
@@ -0,0 +1,58 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: FileBasedHierarchyTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.hierarchy;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+public class FileBasedHierarchyTest extends FileBasedModelTest
+{
+	protected OTTypeHierarchy _testObj;
+	protected IType _focusType;
+
+    public FileBasedHierarchyTest(String name)
+    {
+        super(name);
+    }
+    
+    private OTTypeHierarchy createOTTypeHierarchy(IType focusType, boolean computeSubtypes) throws JavaModelException
+    {
+    	OTTypeHierarchy hierarchy = new OTTypeHierarchy(focusType, focusType.getJavaProject(), computeSubtypes);
+		hierarchy.refresh(new NullProgressMonitor());
+        return hierarchy;
+    }
+
+    public OTTypeHierarchy createOTTypeHierarchy(IType focusType) throws JavaModelException
+    {
+    	return createOTTypeHierarchy(focusType, true);
+    }
+
+    public OTTypeHierarchy createOTSuperTypeHierarchy(IType focusType) throws JavaModelException
+    {
+        return createOTTypeHierarchy(focusType, false);
+    }
+
+
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/ITypeIOTTypeTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/ITypeIOTTypeTest.java
new file mode 100644
index 0000000..00b9204
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/ITypeIOTTypeTest.java
@@ -0,0 +1,309 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: ITypeIOTTypeTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.hierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.IOTType;
+import org.eclipse.objectteams.otdt.core.IOTTypeHierarchy;
+import org.eclipse.objectteams.otdt.core.OTModelManager;
+import org.eclipse.objectteams.otdt.core.PhantomType;
+
+/**
+ * Testing OTTypeHiearchy with respect to IType vs. IOTType instances as input
+ * @author Carsten Pfeiffer (carp)
+ *
+ * $Id: ITypeIOTTypeTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class ITypeIOTTypeTest extends FileBasedHierarchyTest
+{
+    @SuppressWarnings("unused")
+	private IType _objectType;
+
+    private IType _MyTeam;
+    private IType _MySubTeam;
+    private IType _MyOtherSubTeam;
+    
+    private IType _MyTeam_MyRole;
+    private IType _MySubTeam_MyRole; // phantom-type!
+    private IType _MyOtherSubTeam_MyRole;
+    
+    private IOTType _OT_MyTeam;
+    private IOTType _OT_MySubTeam;
+    @SuppressWarnings("unused")
+	private IOTType _OT_MyOtherSubTeam;
+
+    private IOTType _OT_MyTeam_MyRole;
+    private IOTType _OT_MyOtherSubTeam_MyRole;
+    	
+	public ITypeIOTTypeTest(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(ITypeIOTTypeTest.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(ITypeIOTTypeTest.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "simple";
+		
+        _objectType =
+            getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+        
+        _MyTeam = getType(getTestProjectDir(), srcFolder, pkg, "MyTeam");
+        _MySubTeam = getType(getTestProjectDir(), srcFolder, pkg, "MySubTeam");
+        _MyOtherSubTeam = getType(getTestProjectDir(), srcFolder, pkg, "MyOtherSubTeam");
+        
+        _MyTeam_MyRole = getRole(_MyTeam, "MyTeam.MyRole");
+        _MySubTeam_MyRole = new PhantomType(_MySubTeam, _MyTeam_MyRole);
+        _MyOtherSubTeam_MyRole = getRole(_MyOtherSubTeam, "MyOtherSubTeam.MyRole");
+        
+        _OT_MyTeam = OTModelManager.getOTElement(_MyTeam);
+        _OT_MySubTeam = OTModelManager.getOTElement(_MySubTeam);
+        _OT_MyOtherSubTeam = OTModelManager.getOTElement(_MyOtherSubTeam);
+        _OT_MyTeam_MyRole = OTModelManager.getOTElement(_MyTeam_MyRole);
+        _OT_MyOtherSubTeam_MyRole = OTModelManager.getOTElement(_MyOtherSubTeam_MyRole);
+	}
+	
+    public void testCreation()
+	{
+		assertCreation(_MyTeam);
+		assertCreation(_MySubTeam);
+		
+		assertCreation(_MyTeam_MyRole);
+		assertCreation(_MySubTeam_MyRole);
+		
+		assertCreation(_OT_MyTeam);
+		assertCreation(_OT_MySubTeam);
+		assertCreation(_OT_MyTeam_MyRole);
+	}
+	    
+    public void testHierarchyCreation_equalFocusType() throws JavaModelException
+    {
+        IOTTypeHierarchy first  = createOTTypeHierarchy(_MyTeam);
+        IOTTypeHierarchy second = createOTTypeHierarchy(_OT_MyTeam);
+        
+		assertEquals(first.getFocusType(), second.getFocusType());		
+    }
+    
+    public void testGetOTSuperTypeHierarchy() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyTeam);
+        
+		ITypeHierarchy first  = _testObj.getOTSuperTypeHierarchy(_MyTeam);
+		ITypeHierarchy second = _testObj.getOTSuperTypeHierarchy(_OT_MyTeam);
+
+		assertEquals(first, second);		
+    }
+    
+    public void testGetSubtypes() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyTeam);
+        
+		IType [] first  = _testObj.getSubtypes(_MyTeam);
+		IType [] second = _testObj.getSubtypes(_OT_MyTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+    public void testGetAllSuperclasses() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MySubTeam);
+        
+		IType [] first  = _testObj.getAllSuperclasses(_MySubTeam);
+		IType [] second = _testObj.getAllSuperclasses(_OT_MySubTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+    // TODO: actually use test data with interfaces
+    public void testGetAllSuperInterfaces() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyTeam);
+        
+		IType [] first  = _testObj.getAllSuperInterfaces(_MyTeam);
+		IType [] second = _testObj.getAllSuperInterfaces(_OT_MyTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+	
+    public void testGetAllSupertypes() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MySubTeam);
+        
+		IType [] first  = _testObj.getAllSupertypes(_MySubTeam);
+		IType [] second = _testObj.getAllSupertypes(_OT_MySubTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+	public void testGetAllSubtypes() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyTeam);
+        
+		IType [] first  = _testObj.getAllSubtypes(_MyTeam);
+		IType [] second = _testObj.getAllSubtypes(_OT_MyTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+	
+	public void testGetCachedFlags() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyTeam);
+        
+		int first  = _testObj.getCachedFlags(_MyTeam);
+		int second = _testObj.getCachedFlags(_OT_MyTeam);
+
+		assertTrue(first == second);
+    }
+
+	public void testGetSubclasses() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyTeam);
+        
+		IType [] first  = _testObj.getSubclasses(_MyTeam);
+		IType [] second = _testObj.getSubclasses(_OT_MyTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+	public void testGetSuperclass() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MySubTeam);
+        
+		IType first  = _testObj.getSuperclass(_MySubTeam);
+		IType second = _testObj.getSuperclass(_OT_MySubTeam);
+
+		assertTrue(compareTypes(first, second));
+    }
+
+	public void testGetSuperclasses() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MySubTeam);
+        
+		IType [] first  = _testObj.getSuperclasses(_MySubTeam);
+		IType [] second = _testObj.getSuperclasses(_OT_MySubTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+	// TODO: actually use test data with interfaces
+	public void testGetSuperInterfaces() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyTeam);
+        
+		IType [] first  = _testObj.getSuperInterfaces(_MyTeam);
+		IType [] second = _testObj.getSuperInterfaces(_OT_MyTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+	public void testGetSupertypes() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MySubTeam);
+        
+		IType [] first  = _testObj.getSupertypes(_MySubTeam);
+		IType [] second = _testObj.getSupertypes(_OT_MySubTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+	public void testGetTSuperTypes() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyOtherSubTeam_MyRole);
+        
+		IType [] first  = _testObj.getTSuperTypes(_MyOtherSubTeam_MyRole);
+		IType [] second = _testObj.getTSuperTypes(_OT_MyOtherSubTeam_MyRole);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+    public void testGetAllTSuperTypes() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyOtherSubTeam_MyRole);
+        
+		IType [] first  = _testObj.getAllTSuperTypes(_MyOtherSubTeam_MyRole);
+		IType [] second = _testObj.getAllTSuperTypes(_OT_MyOtherSubTeam_MyRole);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+    public void testGetExplicitSuperclass() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MySubTeam);
+        
+		IType first  = _testObj.getExplicitSuperclass(_MySubTeam);
+		IType second = _testObj.getExplicitSuperclass(_OT_MySubTeam);
+
+		assertTrue(compareTypes(first, second));
+    }
+
+    // TODO: actually use test data with interfaces
+    public void testGetExtendingInterfaces() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyTeam);
+        
+		IType [] first  = _testObj.getExtendingInterfaces(_MyTeam);
+		IType [] second = _testObj.getExtendingInterfaces(_OT_MyTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+
+    // TODO: actually use test data with interfaces
+    public void testGetImplementingClasses() throws JavaModelException
+    {
+        _testObj = createOTTypeHierarchy(_MyTeam);
+        
+		IType [] first  = _testObj.getImplementingClasses(_MyTeam);
+		IType [] second = _testObj.getImplementingClasses(_OT_MyTeam);
+
+		assertEquals(first.length, second.length);		
+		assertTrue(compareTypes(first, second));
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/OTTypeHierarchyTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/OTTypeHierarchyTests.java
new file mode 100644
index 0000000..544f6ae
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/hierarchy/OTTypeHierarchyTests.java
@@ -0,0 +1,46 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTTypeHierarchyTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.hierarchy;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * 
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTTypeHierarchyTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ */
+public class OTTypeHierarchyTests
+{
+
+    public static Test suite()
+    {
+        TestSuite suite = new TestSuite("All OTTypeHierarchy Tests");
+
+        //$JUnit-BEGIN$
+        suite.addTest(org.eclipse.objectteams.otdt.tests.superhierarchy.AllTests.suite());
+        suite.addTest(org.eclipse.objectteams.otdt.tests.subhierarchy.AllTests.suite());
+        //$JUnit-END$
+
+        return suite;
+    }
+}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/AllTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/AllTests.java
new file mode 100644
index 0000000..9055e06
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/AllTests.java
@@ -0,0 +1,50 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author Michael Krueger (mkr)
+ *
+ * @version $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class AllTests {
+
+    public static Test suite() {
+        TestSuite suite = new TestSuite("All OT-SubhierarchyTests");
+        //$JUnit-BEGIN$
+        suite.addTest(OTTypeHierarchyBuilderTest.suite());
+        suite.addTest(OTSubTypeHierarchyTest001.suite());
+        suite.addTest(OTSubTypeHierarchyTest002.suite());
+        suite.addTest(OTSubTypeHierarchyTest004.suite());
+        suite.addTest(OTSubTypeHierarchyTest006.suite());
+        suite.addTest(OTSubTypeHierarchyTest010.suite());
+        suite.addTest(OTSubTypeHierarchyTest011.suite());
+        suite.addTest(OTSubTypeHierarchyTest016.suite());
+        suite.addTest(OTSubTypeHierarchyTest017.suite());
+        suite.addTest(OTSubTypeHierarchyTest018.suite());
+        suite.addTest(OTSubTypeHierarchyTest019.suite());
+        //$JUnit-END$
+        return suite;
+    }
+}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest001.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest001.java
new file mode 100644
index 0000000..85ba0f4
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest001.java
@@ -0,0 +1,411 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest001.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import java.util.HashMap;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.PhantomType;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSubTypeHierarchyTest001.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSubTypeHierarchyTest001 extends FileBasedHierarchyTest
+{
+	
+    private IType _T1;
+    private IType _T2;
+    private IType _T3;
+    private IType _T4;
+    private IType _T5;
+    private IType _T6;
+    private IType _T7;
+    private IType _T8;
+    
+    private IType _T1_R1;
+    private IType _T1_R2;   
+
+    private IType _T2_R1;
+    private IType _T2_R2;
+    
+    private IType _T3_R1;
+    private IType _T3_R2;
+    
+    private IType _phantom_T4_R1;
+    private IType _T4_R2;
+    
+    private IType _T5_R1;
+    private IType _T5_R2;
+    private IType _T5_R3;
+    
+    private IType _T6_R1;
+    private IType _phantom_T6_R2;
+    
+    private IType _phantom_T7_R1;
+    private IType _T7_R2;
+    private IType _T7_R3;   
+    
+    private IType _phantom_T8_R1;
+    private IType _T8_R2;
+    
+    @SuppressWarnings("unused")
+	private IType _objectType;
+	
+	public OTSubTypeHierarchyTest001(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest001.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest001.class.getName());
+		return suite;
+	}
+	
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("Hierarchy");
+        super.setUpSuite();
+        
+        String srcFolder = "src";
+        String pkg = "test001";
+        
+        _T1 = getType(getTestProjectDir(), srcFolder, pkg, "T1");
+        _T2 = getType(getTestProjectDir(), srcFolder, pkg, "T2");
+        _T3 = getType(getTestProjectDir(), srcFolder, pkg, "T3");
+        _T4 = getType(getTestProjectDir(), srcFolder, pkg, "T4");
+        _T5 = getType(getTestProjectDir(), srcFolder, pkg, "T5");
+        _T6 = getType(getTestProjectDir(), srcFolder, pkg, "T6");
+        _T7 = getType(getTestProjectDir(), srcFolder, pkg, "T7");
+        _T8 = getType(getTestProjectDir(), srcFolder, pkg, "T8");
+
+        _T1_R1 = getRole(_T1, "T1.R1");
+        _T1_R2 = getRole(_T1, "T1.R2");
+
+        _T2_R1 = getRole(_T2, "T2.R1");
+        _T2_R2 = getRole(_T2, "T2.R2");
+
+        _T3_R1 = getRole(_T3, "T3.R1");
+        _T3_R2 = getRole(_T3, "T3.R2");
+
+        _phantom_T4_R1 = new PhantomType(_T4, _T2_R1);
+        _T4_R2 = getRole(_T4, "T4.R2");
+
+        _T5_R1 = getRole(_T5, "T5.R1");
+        _T5_R2 = getRole(_T5, "T5.R2");
+        _T5_R3 = getRole(_T5, "T5.R3");
+
+        _T6_R1 = getRole(_T6, "T6.R1");
+        _phantom_T6_R2 = new PhantomType(_T6, _T2_R2);
+        
+        _phantom_T7_R1 = new PhantomType(_T7, _T5_R1);
+        _T7_R2 = getRole(_T7, "T7.R2");
+        _T7_R3 = getRole(_T7, "T7.R3");
+
+        _phantom_T8_R1 = new PhantomType(_T8, _T6_R1);
+        _T8_R2 = getRole(_T8, "T8.R2");
+        
+        _objectType = getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+    }
+	
+    public void testCreation()
+    {
+        assertCreation(_T1);
+        assertCreation(_T2);
+        assertCreation(_T3);
+        assertCreation(_T4);
+        assertCreation(_T5);
+        assertCreation(_T6);
+        assertCreation(_T7);
+        assertCreation(_T8);
+
+        assertCreation(_T1_R1);
+        assertCreation(_T1_R2);
+
+        assertCreation(_T2_R1);
+        assertCreation(_T2_R2);
+
+        assertCreation(_T3_R1);
+        assertCreation(_T3_R2);
+
+        assertCreation(_phantom_T4_R1);
+        assertCreation(_T4_R2);
+
+        assertCreation(_T5_R1);
+        assertCreation(_T5_R2);
+        assertCreation(_T5_R3);
+
+        assertCreation(_T6_R1);
+        assertCreation(_phantom_T6_R2);
+        
+        assertCreation(_phantom_T7_R1);
+        assertCreation(_T7_R2);
+        assertCreation(_T7_R3);
+
+        assertCreation(_phantom_T8_R1);
+        assertCreation(_T8_R2);
+    }
+    
+	public void testGetAllSubtypes_T1_R1() throws JavaModelException
+	{
+		_focusType = _T1_R1;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] {
+								         _T2_R1, _T2_R2,
+								         _T3_R1, _T3_R2,
+								         _T4_R2,
+										 _T5_R1, _T5_R2, _T5_R3,
+										 _T6_R1,
+										 _T7_R2, _T7_R3,
+										 _T8_R2
+								         };
+		
+		IType [] actual = _testObj.getAllSubtypes(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+    
+
+	public void testGetAllSubtypes_T1_R2() throws JavaModelException
+	{
+		_focusType = _T1_R2;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] {
+								         _T2_R2,
+								         _T3_R2,
+								         _T4_R2,
+										 _T5_R2,
+										 _T7_R2,
+										 _T8_R2
+								         };
+		
+		IType [] actual = _testObj.getAllSubtypes(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetSubtypes_T2_R1() throws JavaModelException
+	{
+		_focusType = _T2_R1;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] {
+										_T4_R2,
+								        _T2_R2,
+								        _T3_R1,
+										_T5_R1,
+										_T6_R1
+										};
+		
+		IType [] actual = _testObj.getSubtypes(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	
+	public void testGetSubclasses_T2_R1() throws JavaModelException
+	{
+		_focusType = _T2_R1;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] {
+										_T4_R2,
+										_T2_R2,
+								        _T3_R1,
+										_T5_R1,
+										_T6_R1
+										};
+		
+		IType [] actual = _testObj.getSubclasses(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+	
+	public void testGetSubclasses_T5_R1() throws JavaModelException
+	{
+		_focusType = _T5_R1;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] { _T5_R3, _T7_R3 };
+		
+		IType [] actual = _testObj.getSubclasses(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	
+	public void testGetSubclasses_T6_R1() throws JavaModelException
+	{
+		_focusType = _T6_R1;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] { _T8_R2,
+                                         _T2_R2 };
+		
+		IType [] actual = _testObj.getSubclasses(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+    public void testGetSubclasses_T6_R1_phantomMode() throws JavaModelException
+    {
+        _focusType = _T6_R1;
+        _testObj = createOTTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _phantom_T8_R1,
+                                         _phantom_T6_R2,
+                                         _T8_R2};
+        
+        IType [] actual = _testObj.getSubclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSubclasses_T6_R1_in_T2_R2() throws JavaModelException
+    {
+        _focusType = _T2_R2;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T8_R2,
+                                         _T2_R2 };
+        
+        IType [] actual = _testObj.getSubclasses(_T6_R1);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetSubtypes_T6_R1() throws JavaModelException
+    {
+        _focusType = _T6_R1;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T8_R2,
+                                         _T2_R2 };
+        
+        IType [] actual = _testObj.getSubtypes(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSubtypes_T6_R1_phantomMode() throws JavaModelException
+    {
+        _focusType = _T6_R1;
+        _testObj = createOTTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _phantom_T6_R2,
+                                         _phantom_T8_R1,
+                                         _T8_R2 };        
+        IType [] actual = _testObj.getSubtypes(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetAllSubtypes_T6_R1_in_T2R1() throws JavaModelException
+    {
+        _focusType = (_T2_R1);
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T8_R2, _T2_R2 };
+        IType [] actual = _testObj.getAllSubtypes(_T6_R1);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testPhantomTypeEquality1() throws JavaModelException
+    {
+        PhantomType phantom1 = new PhantomType(_T6, _T2_R2);
+        PhantomType phantom2 = new PhantomType(_T6, _T2_R2);
+                
+        assertEquals(phantom1.hashCode(), phantom2.hashCode());
+        assertTrue(phantom1.equals(phantom2));
+    }
+
+    public void testPhantomTypeHashability1() throws JavaModelException
+    {
+    	PhantomType phantom1 = new PhantomType(_T6, _T2_R2);
+        PhantomType phantom2 = new PhantomType(_T6, _T2_R2);
+        
+        HashMap<PhantomType, Double> map = new HashMap<PhantomType, Double>();
+        Double dummy = new Double(0.0);
+        map.put(phantom1, dummy);
+        
+        Double expected = dummy;
+        Double actual = map.get(phantom2);
+
+        assertEquals(expected, actual);
+    }
+    
+    public void testPhantomTypeEquality2() throws JavaModelException
+    {
+        PhantomType phantom1 = new PhantomType(_T6, _T2_R2);
+        PhantomType phantom2 = new PhantomType(_T6, _T2_R2);
+        
+        PhantomType phantom11 = new PhantomType(phantom1, _T1_R1);
+        PhantomType phantom12 = new PhantomType(phantom2, _T1_R1);
+        
+        assertEquals(phantom11.hashCode(), phantom12.hashCode());
+        assertTrue(phantom11.equals(phantom12));
+    }
+
+    public void testPhantomTypeHashability2() throws JavaModelException
+    {
+        PhantomType phantom1 = new PhantomType(_T6, _T2_R2);
+        PhantomType phantom2 = new PhantomType(_T6, _T2_R2);
+        
+        PhantomType phantom11 = new PhantomType(phantom1, _T1_R1);
+        PhantomType phantom12 = new PhantomType(phantom2, _T1_R1);
+        
+        HashMap<PhantomType, Double> map = new HashMap<PhantomType, Double>();
+        Double dummy = new Double(0.0);
+        map.put(phantom11, dummy);
+        
+        Double expected = dummy;
+        Double actual = map.get(phantom12);
+        assertEquals(expected, actual);
+    }
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest002.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest002.java
new file mode 100644
index 0000000..4896b45
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest002.java
@@ -0,0 +1,144 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest002.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * @author Michael Krueger (mkr)
+ *
+ * $Id: OTSubTypeHierarchyTest002.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSubTypeHierarchyTest002 extends FileBasedModelTest {
+	
+	private OTTypeHierarchy _testObj;
+
+	private IType _focusType;
+	
+	private IType _T1_R1;
+	
+	private IType _T2_R1;
+	
+	private IType _T3_R1;
+
+    private IType _classA;
+    
+	@SuppressWarnings("unused")
+	private IType _objectType;
+
+    private IType _T1;
+
+    private IType _T2;
+
+    private IType _T3;
+
+	public OTSubTypeHierarchyTest002(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest002.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest002.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test002";
+		_T1 = getType(getTestProjectDir(),
+                srcFolder,
+                pkg,
+                "T1");
+		
+		_T2 = getType(getTestProjectDir(),
+                srcFolder,
+                pkg,
+                "T2");
+
+		_T3 = getType(getTestProjectDir(),
+                srcFolder,
+                pkg,
+                "T3");
+
+		_T1_R1 = getRole(_T1, "T1.R1");
+		
+		_T2_R1 = getRole(_T2, "T2.R1");
+		
+		_T3_R1 = getRole(_T3, "T3.R1");
+		
+		_classA = getType(getTestProjectDir(),
+		        srcFolder,
+		        pkg,
+		        "ClassA");
+		
+		_objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+	}
+	
+	public void testGetAllSubtypes_T1_R1() throws JavaModelException
+	{
+		_focusType = _T1_R1;
+
+		_testObj = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        _testObj.refresh(new NullProgressMonitor());
+        
+		IType[] expected = new IType[] { _T2_R1, _T3_R1};
+		
+		IType [] actual = _testObj.getAllSubtypes(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetAllSubtypes_ClassA() throws JavaModelException
+	{
+		_focusType = _classA;
+
+		_testObj = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        _testObj.refresh(new NullProgressMonitor());
+        
+		IType[] expected = new IType[] { _T2_R1, _T3_R1};
+		
+		IType [] actual = _testObj.getAllSubtypes(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest004.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest004.java
new file mode 100644
index 0000000..3574c63
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest004.java
@@ -0,0 +1,189 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest004.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.TypeHelper;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSubTypeHierarchyTest004.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSubTypeHierarchyTest004 extends FileBasedHierarchyTest 
+{
+	
+	private ITypeHierarchy _testObj;
+	private IType _focusType;
+	@SuppressWarnings("unused")
+	private IType _objectType;
+	private IType _T20;
+	private IType _T21;
+	
+	private IType _T20T10T00R0;
+	private IType _T20T10T00R1;
+	private IType _T21T10T00R1;
+	private IType _T21T10T00R2;
+	private IType _T21T11T00R0;
+	private IType _T21T11T00R1;
+	private IType _T21T11T00R2;
+    
+    
+	public OTSubTypeHierarchyTest004(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest004.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest004.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test004";
+		
+		_T20 = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T20");
+
+        _T21 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "T21");
+        
+        
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _T20T10T00R0 = TypeHelper.findNestedRoleType(_T20, "T20.T10.T00.R0");
+        _T20T10T00R1 = TypeHelper.findNestedRoleType(_T20, "T20.T10.T00.R1");
+
+        _T21T10T00R1 = TypeHelper.findNestedRoleType(_T21, "T21.T10.T00.R1");
+        _T21T10T00R2 = TypeHelper.findNestedRoleType(_T21, "T21.T10.T00.R2");
+        
+        _T21T11T00R0 = TypeHelper.findNestedRoleType(_T21, "T21.T11.T00.R0");
+        _T21T11T00R1 = TypeHelper.findNestedRoleType(_T21, "T21.T11.T00.R1");
+        _T21T11T00R2 = TypeHelper.findNestedRoleType(_T21, "T21.T11.T00.R2");
+    }
+
+    
+	public void testCreation()
+	{
+		assertCreation(_T20);
+		assertCreation(_T21);
+		
+		assertCreation(_T20T10T00R0);
+		assertCreation(_T20T10T00R1);
+
+		assertCreation(_T21T10T00R1);
+		assertCreation(_T21T10T00R2);
+		
+		assertCreation(_T21T11T00R0);
+		assertCreation(_T21T11T00R1);
+		assertCreation(_T21T11T00R2);
+    }
+ 
+	public void testGetAllSubtypes_T20T10T00R0() throws JavaModelException
+	{
+	    _focusType = _T20T10T00R0;
+        _testObj = createOTTypeHierarchy(_focusType);
+
+	    IType[] expected = { _T21T11T00R0, _T21T11T00R1, _T21T11T00R2 };
+	    IType[] actual = _testObj.getAllSubtypes(_focusType);
+	    
+	    assertTrue(compareTypes(expected, actual));
+	}
+
+	public void testGetAllSubtypes_T20T10T00R1() throws JavaModelException
+	{
+	    _focusType = _T20T10T00R1;
+	    OTTypeHierarchy hierarchy = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+	    hierarchy.refresh(new NullProgressMonitor());
+
+	    IType[] expected = { _T21T10T00R1, _T21T10T00R2, _T21T11T00R1, _T21T11T00R2 };
+	    IType[] actual = hierarchy.getAllSubtypes(_focusType);
+	    
+	    assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetSubtypes_T20T10T00R0() throws JavaModelException
+	{
+	    _focusType = _T20T10T00R0;
+        _testObj = createOTTypeHierarchy(_focusType);
+
+	    IType[] expected = { _T21T11T00R0 };
+	    IType[] actual = _testObj.getSubtypes(_focusType);
+	    
+	    assertEquals(expected.length, actual.length);
+	    assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetTSuperTypes_T21T11T00R0() throws JavaModelException
+	{
+	    _focusType = _T21T11T00R0;
+	    OTTypeHierarchy hierarchy = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+	    hierarchy.refresh(new NullProgressMonitor());
+
+	    IType[] expected = { _T20T10T00R0 };
+	    IType[] actual = hierarchy.getTSuperTypes(_focusType);
+	    
+	    assertTrue(compareTypes(expected, actual));
+	}
+
+	public void testGetTSuperTypes_T21T11T00R1() throws JavaModelException
+	{
+	    _focusType = _T21T11T00R1;
+	    OTTypeHierarchy hierarchy = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+	    hierarchy.refresh(new NullProgressMonitor());
+
+	    IType[] expected = { _T21T10T00R1 };
+	    IType[] actual = hierarchy.getTSuperTypes(_focusType);
+	    
+	    assertTrue(compareTypes(expected, actual));
+	}
+
+	
+	
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest006.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest006.java
new file mode 100644
index 0000000..c15387a
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest006.java
@@ -0,0 +1,225 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest006.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.PhantomType;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author Michael Kr?ger (mkr)
+ *
+ * $Id: OTSubTypeHierarchyTest006.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSubTypeHierarchyTest006 extends FileBasedHierarchyTest
+{
+    private IType _T1;
+    private IType _T2;
+    private IType _T3;
+    
+    private IType _T1_R1;
+    private IType _T1_R2;
+    
+    private IType _T2_R1;
+    private IType _phantom_T2_R2;
+
+    private IType _phantom_T3_R1;
+    private IType _T3_R2;
+    
+    private IType _classA;    
+    @SuppressWarnings("unused")
+	private IType _objectType;
+    private IType _MyTeam_MyRole;
+    private IType _MySubTeam_MyRole;
+    private IType _MyOtherSubTeam_MyRole;
+
+    private IType _MyTeam;
+    private IType _MySubTeam;
+    private IType _MyOtherSubTeam;
+    	
+	public OTSubTypeHierarchyTest006(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest006.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest006.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test006";
+		
+        _T1 = getType(getTestProjectDir(), srcFolder, pkg, "T1");
+        _T2 = getType(getTestProjectDir(), srcFolder, pkg, "T2");
+        _T3 = getType(getTestProjectDir(), srcFolder, pkg, "T3");
+        
+        _T1_R1 = getRole(_T1, "T1.R1");
+        _T1_R2 = getRole(_T1, "T1.R2");
+        
+        _T2_R1 = getRole(_T2, "T2.R1");
+        _phantom_T2_R2 = new PhantomType(_T2, _T1_R2);
+        
+        _phantom_T3_R1 = new PhantomType(_T3, _T2_R1);
+        _T3_R2 = getRole(_T3, "T3.R2");
+        
+        _classA =
+            getType(getTestProjectDir(), srcFolder, pkg, "ClassA");             
+        
+        _objectType =
+            getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+        
+        setupExtraStuff();
+	}
+	
+	private void setupExtraStuff() throws JavaModelException
+    {
+		String srcFolder = "src";
+		String pkg = "simple";
+		
+        _MyTeam = getType(getTestProjectDir(), srcFolder, pkg, "MyTeam");
+        _MySubTeam = getType(getTestProjectDir(), srcFolder, pkg, "MySubTeam");
+        _MyOtherSubTeam = getType(getTestProjectDir(), srcFolder, pkg, "MyOtherSubTeam");
+        
+        _MyTeam_MyRole = getRole(_MyTeam, "MyTeam.MyRole");
+        _MySubTeam_MyRole = new PhantomType(_MySubTeam, _MyTeam_MyRole);
+        _MyOtherSubTeam_MyRole = getRole(_MyOtherSubTeam, "MyOtherSubTeam.MyRole");
+    }
+
+    public void testCreation()
+	{
+		assertCreation(_T1);
+		assertCreation(_T2);
+		assertCreation(_T3);
+		
+		assertCreation(_T1_R1);
+		assertCreation(_T1_R2);
+		
+		assertCreation(_T2_R1);
+		assertCreation(_phantom_T2_R2);
+		
+		assertCreation(_phantom_T3_R1);
+		assertCreation(_T3_R2);
+		
+		assertCreation(_MyTeam);
+		assertCreation(_MySubTeam);
+		
+		assertCreation(_MyTeam_MyRole);
+		assertCreation(_MySubTeam_MyRole);
+	}
+	
+    
+	public void testGetAllSubtypes_ClassA() throws JavaModelException
+    {
+        _focusType = _classA;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T1_R1, _T2_R1, _T3_R2 };        
+        IType [] actual = _testObj.getAllSubtypes(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetAllSubtypes_MyTeam_MyRole_phantomMode() throws JavaModelException
+    {
+        _focusType = _MyTeam_MyRole;
+        _testObj = createOTTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] {
+                _MySubTeam_MyRole,
+                _MyOtherSubTeam_MyRole
+        };
+		IType [] actual = _testObj.getAllSubtypes(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSubtypes_ClassA_phantomMode() throws JavaModelException
+    {
+        _focusType = _classA;
+        _testObj = createOTTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _T1_R1,
+                                         _T2_R1,
+                                         _T3_R2,
+                                         _phantom_T3_R1 };        
+        IType [] actual = _testObj.getAllSubtypes(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetSubtypes_ClassA() throws JavaModelException
+    {
+        _focusType = _classA;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T1_R1, _T2_R1 };        
+        IType [] actual = _testObj.getSubtypes(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSubtypes_T2R1_in_ClassA() throws JavaModelException
+    {
+        _focusType = _classA;
+        _testObj = createOTTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T3_R2 };        
+        IType [] actual = _testObj.getSubtypes(_T2_R1);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSubtypes_T2R1_in_ClassA_phantomMode() throws JavaModelException
+    {
+        _focusType = _classA;
+        _testObj = createOTTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _T3_R2, _phantom_T3_R1 };        
+        IType [] actual = _testObj.getSubtypes(_T2_R1);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+	
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest010.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest010.java
new file mode 100644
index 0000000..cfe1259
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest010.java
@@ -0,0 +1,393 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest010.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+import org.eclipse.objectteams.otdt.core.TypeHelper;
+
+/**
+ * @author mkr
+ *
+ * $Id: OTSubTypeHierarchyTest010.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSubTypeHierarchyTest010 extends FileBasedModelTest
+{
+	
+	private IType _focusType;
+    private IType _T1;
+    private IType _T2;
+    private IType _T3;
+    private IType _T1R1;
+    private IType _T2R1;
+    private IType _T3R1;
+    private IType _interfaceA;
+	private IType _objectType;
+    
+    
+	public OTSubTypeHierarchyTest010(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest010.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest010.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test010";
+		
+		_T1 = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T1");
+
+        _T2 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "T2");
+        
+        _T3 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "T3");
+
+        _interfaceA = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "InterfaceA");
+        
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _T1R1 = TypeHelper.findNestedRoleType(_T1, "T1.R1");
+        _T2R1 = TypeHelper.findNestedRoleType(_T2, "T2.R1");
+        _T3R1 = TypeHelper.findNestedRoleType(_T3, "T3.R1");
+
+    }
+
+    
+	public void testCreation()
+	{
+		assertCreation(_T1R1);
+        assertCreation(_T2R1);
+        assertCreation(_T3R1);
+        assertCreation(_interfaceA);
+    }
+    
+    
+    public void testGetSubtypes_T1R1() throws JavaModelException
+    {
+        _focusType = _T1R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] { _T2R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetSubtypes_T2R1() throws JavaModelException
+    {
+        _focusType = _T2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] { _T3R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetSubtypes_interfaceA() throws JavaModelException
+    {
+        _focusType = _interfaceA;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] { _T2R1, _T3R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+        
+    public void testGetAllSubtypes_T1R1() throws JavaModelException
+    {
+        _focusType = _T1R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSubtypes(_focusType);
+        IType[] expected = new IType[] {
+        								_T2R1,
+										_T3R1
+										};
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetAllSubtypes_T2R1() throws JavaModelException
+    {
+        _focusType = _T2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSubtypes(_focusType);
+        IType[] expected = new IType[] { _T3R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+    public void testGetAllSubtypes_interfaceA() throws JavaModelException
+    {
+        _focusType = _interfaceA;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSubtypes(_focusType);
+        IType[] expected = new IType[] {
+        								_T2R1,
+										_T3R1
+										};
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+    public void testGetRootClasses_T1R1() throws JavaModelException
+    {
+        _focusType = _T1R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getRootClasses();
+        IType[] expected = new IType[] { _objectType };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+    public void testGetRootClasses_interfaceA() throws JavaModelException
+    {
+        _focusType = _interfaceA;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getRootClasses();
+        IType[] expected = new IType[] { _objectType };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+    public void testGetRootInterfaces_interfaceA() throws JavaModelException
+    {
+        _focusType = _interfaceA;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getRootInterfaces();
+        IType[] expected = new IType[] { _focusType };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+    
+    public void testGetType_T1R1() throws JavaModelException
+    {
+        _focusType = _T1R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getType();
+        IType expected = _focusType;
+           
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+    public void testGetImplementingClasses_interfaceA() throws JavaModelException
+    {
+        _focusType = _interfaceA;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getImplementingClasses(_focusType);
+        IType[] expected = new IType[] {
+        								_T2R1,
+										_T3R1
+										};
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+
+    public void testGetAllInterfaces_interfaceA() throws JavaModelException
+    {
+        _focusType = _interfaceA;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+
+        IType[] actual = hierarchy.getAllInterfaces();
+        IType[] expected = new IType[] { _interfaceA };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetAllClasses_T1R1() throws JavaModelException
+    {
+        _focusType = _T1R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllClasses();
+        IType[] expected = new IType[] {
+        								_T1R1,
+										_T2R1,
+										_T3R1,
+										_objectType
+										};
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetTSuperTypes_T1R1() throws JavaModelException
+    {
+        _focusType = _T1R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getTSuperTypes(_T3R1);
+        IType[] expected = new IType[] { _T2R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetExplicitSuperclass_T2R1_in_T2R1() throws JavaModelException
+    {
+        _focusType = _T2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_T2R1);
+        IType expected = _objectType;
+           
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetExplicitSuperclass_T3R1_in_T2R1() throws JavaModelException
+    {
+        _focusType = _T2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_T3R1);
+        IType expected = _objectType;
+           
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetExplicitSuperclass_T1R1_in_T2R1() throws JavaModelException
+    {
+        _focusType = _T2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_T1R1);
+        IType expected = _objectType;
+           
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest011.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest011.java
new file mode 100644
index 0000000..02dc26c
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest011.java
@@ -0,0 +1,177 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest011.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+import org.eclipse.objectteams.otdt.core.TypeHelper;
+
+/**
+ * 
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSubTypeHierarchyTest011.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSubTypeHierarchyTest011 extends FileBasedModelTest {
+	
+	@SuppressWarnings("unused")
+	private ITypeHierarchy _testObj;
+	private IType _focusType;
+    private IType _T10;
+    private IType _T21;    
+	@SuppressWarnings("unused")
+	private IType _objectType;
+    private IType _T21T11T0R1;
+    private IType _T10T0R1;
+    private IType _T10T0R2;
+    
+    
+	public OTSubTypeHierarchyTest011(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest011.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest011.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test011";
+		
+		_T10 = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T10");
+
+        _T21 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "T21");
+        
+        
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _T21T11T0R1 = TypeHelper.findNestedRoleType(_T21, "T21.T11.T0.R1");
+        _T10T0R1 = TypeHelper.findNestedRoleType(_T10, "T10.T0.R1");
+        _T10T0R2 = TypeHelper.findNestedRoleType(_T10, "T10.T0.R2");
+
+    }
+
+    
+	public void testCreation()
+	{
+		assertCreation(_T10);
+        assertCreation(_T21);
+        assertCreation(_T21T11T0R1);
+        assertCreation(_T10T0R1);
+        assertCreation(_T10T0R2);
+    }
+    
+    
+    public void testGetSubtypes_T10T0R1() throws JavaModelException
+    {
+        _focusType = _T10T0R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] { _T21T11T0R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetSubtypes_T10T0R2() throws JavaModelException
+    {
+        _focusType = _T10T0R2;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] {
+        								_T21T11T0R1,
+        								_T10T0R1
+										};
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetAllSubtypes_T10T0R1() throws JavaModelException
+    {
+        _focusType = _T10T0R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSubtypes(_focusType);
+        IType[] expected = new IType[] { _T21T11T0R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetAllSubtypes_T10T0R2() throws JavaModelException
+    {
+        _focusType = _T10T0R2;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSubtypes(_focusType);
+        IType[] expected = new IType[] { _T10T0R1, _T21T11T0R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest016.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest016.java
new file mode 100644
index 0000000..c6ea7f5
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest016.java
@@ -0,0 +1,373 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest016.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+import org.eclipse.objectteams.otdt.core.TypeHelper;
+
+/**
+ * 
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSubTypeHierarchyTest016.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSubTypeHierarchyTest016 extends FileBasedModelTest {
+	
+	@SuppressWarnings("unused")
+	private ITypeHierarchy _testObj;
+	private IType _focusType;
+    private IType _C1;
+    private IType _I1;
+    private IType _T1;
+    private IType _T1R1;
+    private IType _T1R2;
+    private IType _T1R3;
+    private IType _T1R4;
+    private IType _T1R5;
+    private IType _T2;
+    private IType _T2R1;
+    private IType _T2R2;
+    private IType _T2R3;
+    private IType _T2R4;
+    
+    @SuppressWarnings("unused")
+	private IType _objectType;
+    
+    
+	public OTSubTypeHierarchyTest016(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest016.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest016.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test016";
+
+        _C1 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "C1");
+
+        _I1 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "I1");
+
+		_T1 = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T1");
+
+        _T2 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "T2");
+
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _T1R1 = TypeHelper.findNestedRoleType(_T1, "T1.R1");
+        _T1R2 = TypeHelper.findNestedRoleType(_T1, "T1.R2");
+        _T1R3 = TypeHelper.findNestedRoleType(_T1, "T1.R3");
+        _T1R4 = TypeHelper.findNestedRoleType(_T1, "T1.R4");
+        _T1R5 = TypeHelper.findNestedRoleType(_T1, "T1.R5");
+        _T2R1 = TypeHelper.findNestedRoleType(_T2, "T2.R1");
+        _T2R2 = TypeHelper.findNestedRoleType(_T2, "T2.R2");
+        _T2R3 = TypeHelper.findNestedRoleType(_T2, "T2.R3");
+        _T2R4 = TypeHelper.findNestedRoleType(_T2, "T2.R4");
+
+    }
+
+    
+	public void testCreation()
+	{
+        assertCreation(_C1);
+        assertCreation(_T1);
+        assertCreation(_T1R1);
+        assertCreation(_T1R2);
+        assertCreation(_T1R3);
+        assertCreation(_T1R4);
+        assertCreation(_T2);
+        assertCreation(_T2R1);
+        assertCreation(_T2R2);
+        assertCreation(_T2R3);
+        assertCreation(_T2R4);
+    }
+    
+    public void testGetSubtypes_C1() throws JavaModelException
+    {
+        _focusType = _C1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] { _T1R5 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetSubtypes_T1R1() throws JavaModelException
+    {
+        _focusType = _T1R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] { _T1R2, _T2R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetSubtypes_T1R2() throws JavaModelException
+    {
+        _focusType = _T1R2;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] { _T1R3, _T2R2 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetSubtypes_T1R3() throws JavaModelException
+    {
+        _focusType = _T1R3;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] { _T1R4, _T2R3 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetSubtypes_T1R4() throws JavaModelException
+    {
+        _focusType = _T1R4;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSubtypes(_focusType);
+        IType[] expected = new IType[] { _T2R4 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetExplicitSuperclass_T1R2() throws JavaModelException
+    {
+        _focusType = _T1R2;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_focusType);
+        IType expected = _T1R1;
+   
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetExplicitSuperclass_T1R3() throws JavaModelException
+    {
+        _focusType = _T1R3;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_focusType);
+        IType expected = _T1R2;
+   
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetExplicitSuperclass_T1R4() throws JavaModelException
+    {
+        _focusType = _T1R4;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_focusType);
+        IType expected = _T1R3;
+   
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetExplicitSuperclass_T1R5() throws JavaModelException
+    {
+        _focusType = _T1R5;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_focusType);
+        IType expected = _C1;
+
+        String errorMsg = _focusType.getElementName()
+                          + " extends "
+                          + expected.getElementName()
+                          + " not in OTTypeHierarchy!";
+        
+        assertTrue(errorMsg, compareTypes(expected, actual));        
+    }
+
+    public void testTypeHierarchy_GetSuperclass_T1R5() throws JavaModelException
+    {
+        _focusType = _T1R5;
+        
+        
+        ITypeHierarchy hierarchy = _focusType.newSupertypeHierarchy(new NullProgressMonitor());
+
+        IType actual = hierarchy.getSuperclass(_focusType);
+        IType expected = _C1;
+   
+        String errorMsg = _focusType.getElementName()
+                          + " extends "
+                          + expected.getElementName()
+                          + " not in TypeHierarchy!";
+
+        assertTrue(errorMsg, compareTypes(expected, actual));        
+    }
+    
+    
+    public void testGetSuperInterfaces_T1R5() throws JavaModelException
+    {
+        _focusType = _T1R5;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSuperInterfaces(_focusType);
+        IType[] expected = new IType[] { _I1 };
+   
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetTSuperTypes_T2R1() throws JavaModelException
+    {
+        _focusType = _T2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getTSuperTypes(_focusType);
+        IType[] expected = new IType[] {_T1R1 };
+   
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetTSuperTypes_T2R2() throws JavaModelException
+    {
+        _focusType = _T2R2;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getTSuperTypes(_focusType);
+        IType[] expected = new IType[] {_T1R2 };
+   
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetTSuperTypes_T2R3() throws JavaModelException
+    {
+        _focusType = _T2R3;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getTSuperTypes(_focusType);
+        IType[] expected = new IType[] {_T1R3 };
+   
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetTSuperTypes_T2R4() throws JavaModelException
+    {
+        _focusType = _T2R4;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getTSuperTypes(_focusType);
+        IType[] expected = new IType[] {_T1R4 };
+   
+        assertTrue(compareTypes(expected, actual));        
+    }
+ 
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest017.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest017.java
new file mode 100644
index 0000000..17f2ad3
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest017.java
@@ -0,0 +1,192 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest017.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.TypeHelper;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * 
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSubTypeHierarchyTest017.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSubTypeHierarchyTest017 extends FileBasedModelTest {
+	
+	private ITypeHierarchy _testObj;
+	@SuppressWarnings("unused")
+	private IType _focusType;
+    private IType _TA;
+    private IType _TB;
+    private IType _TC;
+    private IType _TD;
+    private IType _TE;
+
+    private IType _TA_R1;
+    private IType _TA_R2;
+    private IType _TA_R3;
+    private IType _TB_R1;
+    private IType _TB_R2;
+    private IType _TC_R2;
+    private IType _TC_R3;
+    private IType _TD_R1;
+    private IType _TE_R2;
+    private IType _TE_R3;
+
+    
+    
+    @SuppressWarnings("unused")
+	private IType _objectType;
+    
+    
+	public OTSubTypeHierarchyTest017(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest017.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest017.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test017";
+
+        _TA = getType(getTestProjectDir(), srcFolder, pkg, "TA");
+        _TB = getType(getTestProjectDir(), srcFolder, pkg, "TB");
+        _TC = getType(getTestProjectDir(), srcFolder, pkg, "TC");
+        _TD = getType(getTestProjectDir(), srcFolder, pkg, "TD");
+        _TE = getType(getTestProjectDir(), srcFolder, pkg, "TE");
+
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _TA_R1 = TypeHelper.findNestedRoleType(_TA, "TA.R1");
+        _TA_R2 = TypeHelper.findNestedRoleType(_TA, "TA.R2");
+        _TA_R3 = TypeHelper.findNestedRoleType(_TA, "TA.R3");
+        _TB_R1 = TypeHelper.findNestedRoleType(_TB, "TB.R1");
+        _TB_R2 = TypeHelper.findNestedRoleType(_TB, "TB.R2");
+        _TC_R2 = TypeHelper.findNestedRoleType(_TC, "TC.R2");
+        _TC_R3 = TypeHelper.findNestedRoleType(_TC, "TC.R3");
+        _TD_R1 = TypeHelper.findNestedRoleType(_TD, "TD.R1");
+        _TE_R2 = TypeHelper.findNestedRoleType(_TE, "TE.R2");
+        _TE_R3 = TypeHelper.findNestedRoleType(_TE, "TE.R3");
+
+    }
+
+    private void initHierarchy(IType focus, boolean computeSubtypes)
+            throws JavaModelException
+    {        
+    	_testObj = new OTTypeHierarchy(focus, focus.getJavaProject(), computeSubtypes);
+    	_testObj.refresh(new NullProgressMonitor());
+        _focusType = focus;
+    }
+        
+	public void testCreation()
+	{
+        assertCreation(_TA);
+        assertCreation(_TB);
+        assertCreation(_TD);
+        assertCreation(_TE);
+
+        assertCreation(_TA_R1);
+        assertCreation(_TA_R2);
+        assertCreation(_TA_R3);
+
+        assertCreation(_TB_R1);
+        assertCreation(_TB_R2);
+
+        assertCreation(_TC_R2);
+        assertCreation(_TC_R3);
+
+        assertCreation(_TD_R1);
+        
+        assertCreation(_TE_R2);
+        assertCreation(_TE_R3);        
+    }
+
+    public void testGetSubtypes_TD_R1() throws JavaModelException
+    {
+        initHierarchy(_TA_R1, true);
+        
+        IType[] expected = new IType[] { _TB_R2, _TE_R2 };
+        IType[] actual = _testObj.getSubtypes(_TD_R1);
+        
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetAllSubtypes_TD_R1() throws JavaModelException
+    {
+        initHierarchy(_TA_R1, true);
+        
+        IType[] expected = new IType[] { _TA_R3, _TB_R2, _TE_R2, _TE_R3 };
+        IType[] actual = _testObj.getAllSubtypes(_TD_R1);
+        
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSubtypes_TB_R2() throws JavaModelException
+    {
+        initHierarchy(_TA_R1, true);
+        
+        IType[] expected = new IType[] { _TA_R3, _TC_R2, _TC_R3, _TE_R2, _TE_R3};
+        IType[] actual = _testObj.getSubtypes(_TB_R2);
+        
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetAllSubtypes_TB_R2() throws JavaModelException
+    {
+        initHierarchy(_TA_R1, true);
+        
+        IType[] expected = new IType[] { _TA_R3, _TC_R2, _TC_R3, _TE_R2, _TE_R3 };
+        IType[] actual = _testObj.getAllSubtypes(_TB_R2);
+        
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest018.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest018.java
new file mode 100644
index 0000000..6cb1741
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest018.java
@@ -0,0 +1,166 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest018.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+import org.eclipse.objectteams.otdt.core.TypeHelper;
+
+/**
+ * 
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSubTypeHierarchyTest018.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSubTypeHierarchyTest018 extends FileBasedModelTest {
+	
+	private ITypeHierarchy _testObj;
+	@SuppressWarnings("unused")
+	private IType _focusType;
+    private IType _TA1;
+    private IType _TA2;
+    private IType _TA3;
+    private IType _TZ1;
+    private IType _TZ2;
+
+    private IType _TA1_TB1_R1;
+    private IType _TA2_TB1_R1;
+    private IType _TA2_TB2_R1;
+    private IType _TA2_TB2_R2;
+    private IType _TA3_TB2_R2;
+
+    private IType _TZ1_TX1;    
+
+    private IType _TZ1_TX1_TB2_R2;    
+    private IType _TZ1_TX2_TB2_R2;    
+    private IType _TZ2_TX2_TB2_R1;    
+
+    
+    @SuppressWarnings("unused")
+	private IType _objectType;
+    
+    
+	public OTSubTypeHierarchyTest018(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest018.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest018.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test018";
+
+        _TA1 = getType(getTestProjectDir(), srcFolder, pkg, "TA1");
+        _TA2 = getType(getTestProjectDir(), srcFolder, pkg, "TA2");
+        _TA3 = getType(getTestProjectDir(), srcFolder, pkg, "TA3");
+        _TZ1 = getType(getTestProjectDir(), srcFolder, pkg, "TZ1");
+        _TZ2 = getType(getTestProjectDir(), srcFolder, pkg, "TZ2");
+
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _TA1_TB1_R1 = TypeHelper.findNestedRoleType(_TA1, "TA1.TB1.R1");
+        _TA2_TB1_R1 = TypeHelper.findNestedRoleType(_TA2, "TA2.TB1.R1");
+        _TA2_TB2_R1 = TypeHelper.findNestedRoleType(_TA2, "TA2.TB2.R1");
+        _TA2_TB2_R2 = TypeHelper.findNestedRoleType(_TA2, "TA2.TB2.R2");
+        _TA3_TB2_R2 = TypeHelper.findNestedRoleType(_TA3, "TA3.TB2.R2");
+        _TZ1_TX1 = TypeHelper.findNestedRoleType(_TZ1, "TZ1.TX1");
+        _TZ1_TX1_TB2_R2 = TypeHelper.findNestedRoleType(_TZ1, "TZ1.TX1.TB2.R2");
+        _TZ1_TX2_TB2_R2 = TypeHelper.findNestedRoleType(_TZ1, "TZ1.TX2.TB2.R2");
+        _TZ2_TX2_TB2_R1 = TypeHelper.findNestedRoleType(_TZ2, "TZ2.TX2.TB2.R1");
+
+
+    }
+
+    private void initHierarchy(IType focus, boolean computeSubtypes)
+            throws JavaModelException
+    {        
+    	_testObj = new OTTypeHierarchy(focus, focus.getJavaProject(), computeSubtypes);
+    	_testObj.refresh(new NullProgressMonitor());
+        _focusType = focus;
+    }
+        
+	public void testCreation()
+	{
+        assertCreation(_TA1);
+        assertCreation(_TA2);
+        assertCreation(_TZ1);
+        assertCreation(_TZ2);
+
+        assertCreation(_TA1_TB1_R1);
+        assertCreation(_TA2_TB1_R1);
+        assertCreation(_TA2_TB2_R1);
+        assertCreation(_TA2_TB2_R2);
+        assertCreation(_TA3_TB2_R2);
+
+        assertCreation(_TZ1_TX1_TB2_R2);
+        assertCreation(_TZ1_TX2_TB2_R2);
+        assertCreation(_TZ2_TX2_TB2_R1);
+
+        assertCreation(_TZ1_TX1);
+    }
+
+
+    public void testGetAllSubtypes_TA1_TB1_R1() throws JavaModelException
+    {
+        initHierarchy(_TA1_TB1_R1, true);
+        
+        IType[] expected = new IType[] { _TA2_TB1_R1,
+                                         _TA2_TB2_R1,
+                                         _TA2_TB2_R2,
+                                         _TA3_TB2_R2,
+                                         _TZ1_TX1_TB2_R2,
+                                         _TZ1_TX2_TB2_R2,
+                                         _TZ2_TX2_TB2_R1
+                                       };    
+        
+        
+        IType[] actual = _testObj.getAllSubtypes(_TA1_TB1_R1);
+        
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest019.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest019.java
new file mode 100644
index 0000000..62820db
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTSubTypeHierarchyTest019.java
@@ -0,0 +1,154 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSubTypeHierarchyTest019.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * @author Michael Krueger (mkr)
+ *
+ * $Id: OTSubTypeHierarchyTest019.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSubTypeHierarchyTest019 extends FileBasedModelTest
+{
+	
+	private OTTypeHierarchy _testObj;
+
+	private IType _focusType;
+	
+    private IType _TA;
+    private IType _TB;
+    private IType _TC;
+
+    private IType _TB_R1;
+    private IType _TB_R2;
+    private IType _TB_R3;
+    private IType _TB_R4;
+    private IType _TB_R5;
+    private IType _TB_R6;
+    private IType _TB_R7;
+    private IType _TB_R8;
+    private IType _TB_R9;
+    private IType _TB_R10;
+    private IType _TB_R11;
+    private IType _TB_R12;
+    private IType _TB_R13;
+    private IType _TB_R14;
+    private IType _TB_R15;
+
+    
+	public OTSubTypeHierarchyTest019(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSubTypeHierarchyTest019.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSubTypeHierarchyTest019.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test019";
+
+        _TA = getType(getTestProjectDir(),
+                srcFolder,
+                pkg,
+                "TA");
+		
+		_TB = getType(getTestProjectDir(),
+                srcFolder,
+                pkg,
+                "TB");
+
+		_TC = getType(getTestProjectDir(),
+                srcFolder,
+                pkg,
+                "TC");
+
+		_TB_R1 = getRole(_TB, "TB.R1");
+        _TB_R2 = getRole(_TB, "TB.R2");
+        _TB_R3 = getRole(_TB, "TB.R3");
+        _TB_R4 = getRole(_TB, "TB.R4");
+        _TB_R5 = getRole(_TB, "TB.R5");
+        _TB_R6 = getRole(_TB, "TB.R6");
+        _TB_R7 = getRole(_TB, "TB.R7");
+        _TB_R8 = getRole(_TB, "TB.R8");
+        _TB_R9 = getRole(_TB, "TB.R9");
+        _TB_R10 = getRole(_TB, "TB.R10");
+        _TB_R11 = getRole(_TB, "TB.R11");
+        _TB_R12 = getRole(_TB, "TB.R12");
+        _TB_R13 = getRole(_TB, "TB.R13");
+        _TB_R14 = getRole(_TB, "TB.R14");
+        _TB_R15 = getRole(_TB, "TB.R15");
+		
+	}
+	
+    public void testCreation()
+    {
+        assertCreation(_TA);
+        assertCreation(_TB);
+        assertCreation(_TC);
+
+        assertCreation(_TB_R1);
+        assertCreation(_TB_R2);
+        assertCreation(_TB_R3);
+        assertCreation(_TB_R4);
+        assertCreation(_TB_R5);
+        assertCreation(_TB_R6);
+        assertCreation(_TB_R7);
+        assertCreation(_TB_R8);
+        assertCreation(_TB_R9);
+        assertCreation(_TB_R10);
+        assertCreation(_TB_R11);
+        assertCreation(_TB_R12);
+        assertCreation(_TB_R13);
+        assertCreation(_TB_R14);
+        assertCreation(_TB_R15);    
+    }
+    
+	public void testOTTypeHiearchyCreation() throws JavaModelException
+	{
+		_focusType = _TB_R1;
+
+		_testObj = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), true);
+        _testObj.refresh(new NullProgressMonitor());
+        
+		assertTrue(true);
+	}
+}
+	
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTTypeHierarchyBuilderTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTTypeHierarchyBuilderTest.java
new file mode 100644
index 0000000..7a072df
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/subhierarchy/OTTypeHierarchyBuilderTest.java
@@ -0,0 +1,161 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTTypeHierarchyBuilderTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.subhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchyBuilder;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+import org.eclipse.objectteams.otdt.core.TypeHelper;
+
+/**
+ * 
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTTypeHierarchyBuilderTest.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTTypeHierarchyBuilderTest extends FileBasedModelTest 
+{
+	
+	@SuppressWarnings("unused")
+	private ITypeHierarchy _testObj;
+	private IType _focusType;
+	@SuppressWarnings("unused")
+	private IType _objectType;
+	private IType _T20;
+	private IType _T21;
+	
+	private IType _T20T10T00R0;
+	private IType _T20T10T00R1;
+	private IType _T21T10T00R1;
+	private IType _T21T10T00R2;
+	private IType _T21T11T00R0;
+	private IType _T21T11T00R1;
+	private IType _T21T11T00R2;
+    
+    
+	public OTTypeHierarchyBuilderTest(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTTypeHierarchyBuilderTest.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTTypeHierarchyBuilderTest.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test004";
+		
+		_T20 = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T20");
+
+        _T21 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "T21");
+        
+        
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _T20T10T00R0 = TypeHelper.findNestedRoleType(_T20, "T20.T10.T00.R0");
+        _T20T10T00R1 = TypeHelper.findNestedRoleType(_T20, "T20.T10.T00.R1");
+
+        _T21T10T00R1 = TypeHelper.findNestedRoleType(_T21, "T21.T10.T00.R1");
+        _T21T10T00R2 = TypeHelper.findNestedRoleType(_T21, "T21.T10.T00.R2");
+        
+        _T21T11T00R0 = TypeHelper.findNestedRoleType(_T21, "T21.T11.T00.R0");
+        _T21T11T00R1 = TypeHelper.findNestedRoleType(_T21, "T21.T11.T00.R1");
+        _T21T11T00R2 = TypeHelper.findNestedRoleType(_T21, "T21.T11.T00.R2");
+    }
+
+    
+	public void testCreation()
+	{
+		assertCreation(_T20);
+		assertCreation(_T21);
+		
+		assertCreation(_T20T10T00R0);
+		assertCreation(_T20T10T00R1);
+
+		assertCreation(_T21T10T00R1);
+		assertCreation(_T21T10T00R2);
+		
+		assertCreation(_T21T11T00R0);
+		assertCreation(_T21T11T00R1);
+		assertCreation(_T21T11T00R2);
+    }
+ 
+	public void testGetResult_T20T10T00R0() throws JavaModelException
+	{
+	    _focusType = _T20T10T00R0;
+	    OTTypeHierarchy hierarchy = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+	    hierarchy.refresh(new NullProgressMonitor());
+	    OTTypeHierarchyBuilder builder = new OTTypeHierarchyBuilder(hierarchy);
+
+	    IType[] expected = { _T21T11T00R0, _T21T11T00R1, _T21T11T00R2 };
+	    
+	    builder.build(true);
+	    IType[] actual = hierarchy.getAllSubtypes(_focusType);
+	    
+	    assertTrue(compareTypes(expected, actual));
+	}
+
+	public void testGetResult_T20T10T00R1() throws JavaModelException
+	{
+	    _focusType = _T20T10T00R1;
+	    OTTypeHierarchy hierarchy = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+	    hierarchy.refresh(new NullProgressMonitor());
+	    OTTypeHierarchyBuilder builder = new OTTypeHierarchyBuilder(hierarchy);
+	    
+	    IType[] expected = { _T21T10T00R1, _T21T10T00R2, _T21T11T00R1, _T21T11T00R2 };
+
+	    builder.build(true);
+	    IType[] actual = hierarchy.getAllSubtypes(_focusType);
+	    
+	    assertTrue(compareTypes(expected, actual));
+	}
+	
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/AllTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/AllTests.java
new file mode 100644
index 0000000..1e8115c
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/AllTests.java
@@ -0,0 +1,57 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * @author anklam
+ *
+ * @version $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class AllTests {
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite("All OT-SuperhierarchyTests");
+		//$JUnit-BEGIN$
+		suite.addTest(HierarchyResolverTestWithSrc003.suite());
+		suite.addTest(OrdinaryInterfaceHierarchyTests.suite());
+		suite.addTest(OrdinaryClassesHierarchyWithSubRolesTest.suite());
+
+        suite.addTest(OTSuperTypeHierarchyTest001.suite());
+		suite.addTest(OTSuperTypeHierarchyTest002.suite());
+		suite.addTest(OTSuperTypeHierarchyTest003.suite());
+		suite.addTest(OTSuperTypeHierarchyTest004.suite());
+		suite.addTest(OTSuperTypeHierarchyTest006.suite());
+		suite.addTest(OTSuperTypeHierarchyTest007.suite());
+		suite.addTest(OTSuperTypeHierarchyTest007_Stress.suite());
+		suite.addTest(OTSuperTypeHierarchyTest008.suite());
+		suite.addTest(OTSuperTypeHierarchyTest009.suite());
+		suite.addTest(OTSuperTypeHierarchyTest010.suite());
+		suite.addTest(OTSuperTypeHierarchyTest011.suite());
+		suite.addTest(OTSuperTypeHierarchyTest013.suite());
+		suite.addTest(OTSuperTypeHierarchyTest014.suite());
+		suite.addTest(OTSuperTypeHierarchyTest015.suite());
+		//$JUnit-END$
+		return suite;
+	}
+}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/HierarchyResolverTestWithSrc003.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/HierarchyResolverTestWithSrc003.java
new file mode 100644
index 0000000..8f9f417
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/HierarchyResolverTestWithSrc003.java
@@ -0,0 +1,175 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: HierarchyResolverTestWithSrc003.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.core.hierarchy.TypeHierarchy;
+import org.eclipse.objectteams.otdt.core.IRoleType;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * @author anklam
+ *
+ * @version $Id: HierarchyResolverTestWithSrc003.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+@SuppressWarnings("unused")
+public class HierarchyResolverTestWithSrc003 extends FileBasedModelTest {
+	
+	private ITypeHierarchy _testObj;
+	private NullProgressMonitor _monitor;
+	
+	private IType _focusType;
+	
+	private IRoleType _T1_R1;
+	private IRoleType _T1_R2;
+	
+	private IRoleType _T2_R2;
+	
+	private IRoleType _T3_R1;
+	private IRoleType _T3_R2;
+
+	private IRoleType _T4_R1;
+	private IRoleType _T4_R2;
+	private IRoleType _T4_R3;
+
+	private IType _interfaceA;
+    
+    private IType _objectType;
+	
+	public HierarchyResolverTestWithSrc003(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(HierarchyResolverTestWithSrc003.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(HierarchyResolverTestWithSrc003.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		_monitor = new NullProgressMonitor();
+		
+		String srcFolder = "src";
+		String pkg = "test003";
+		
+		_T1_R1 = 
+			getRole(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T1",
+			        "R1");
+		
+		_T1_R2 = 
+			getRole(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T1",
+			        "R2");
+		
+		_T2_R2 = 
+			getRole(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T2",
+			        "R2");
+        
+		
+		_T3_R1 = 
+			getRole(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T3",
+			        "R1");
+		
+		_T3_R2 = 
+			getRole(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T3",
+			        "R2");
+		
+		
+		_T4_R1 = 
+			getRole(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T4",
+			        "R1");
+		
+		_T4_R2 = 
+			getRole(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T4",
+			        "R2");
+		
+		_T4_R3 = 
+			getRole(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T4",
+			        "R3");
+
+        _interfaceA = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "InterfaceA");
+        
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+	}
+	
+	
+    public void testGetSuperInterfacesFor_T2R2() 
+    throws JavaModelException
+    {
+        _focusType = (IType)_T2_R2.getCorrespondingJavaElement();
+        
+        
+        ITypeHierarchy hierarchy = _focusType.newTypeHierarchy(_monitor);
+
+        IType[] expected = new IType[] { _interfaceA };
+        
+        IType [] actual = ((TypeHierarchy)hierarchy).getSuperInterfaces(_focusType);
+        assertEquals(expected.length, actual.length);
+        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest001.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest001.java
new file mode 100644
index 0000000..9e8e2ff
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest001.java
@@ -0,0 +1,816 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest001.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.PhantomType;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSuperTypeHierarchyTest001.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSuperTypeHierarchyTest001 extends FileBasedHierarchyTest
+{
+
+    private IType _T1;
+    private IType _T2;
+    private IType _T3;
+    private IType _T4;
+    private IType _T5;
+    private IType _T6;
+    private IType _T7;
+    private IType _T8;
+    
+	private IType _T1_R1;
+	private IType _T1_R2;	
+
+    private IType _T2_R1;
+	private IType _T2_R2;
+	
+    private IType _T3_R1;
+	private IType _T3_R2;
+	
+    private IType _phantom_T4_R1;
+    private IType _T4_R2;
+    
+    private IType _T5_R1;
+	private IType _T5_R2;
+	private IType _T5_R3;
+	
+    private IType _T6_R1;
+    private IType _phantom_T6_R2;
+    
+    private IType _phantom_T7_R1;
+    private IType _T7_R2;
+	private IType _T7_R3;	
+	
+    private IType _phantom_T8_R1;
+    private IType _T8_R2;
+	
+	private IType _objectType;
+	
+    
+	public OTSuperTypeHierarchyTest001(String name)
+	{
+		super(name);
+	}
+	
+    
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest001.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest001.class.getName());
+		return suite;
+	}
+	
+    
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test001";
+		
+        _T1 = getType(getTestProjectDir(), srcFolder, pkg, "T1");
+        _T2 = getType(getTestProjectDir(), srcFolder, pkg, "T2");
+        _T3 = getType(getTestProjectDir(), srcFolder, pkg, "T3");
+        _T4 = getType(getTestProjectDir(), srcFolder, pkg, "T4");
+        _T5 = getType(getTestProjectDir(), srcFolder, pkg, "T5");
+        _T6 = getType(getTestProjectDir(), srcFolder, pkg, "T6");
+        _T7 = getType(getTestProjectDir(), srcFolder, pkg, "T7");
+        _T8 = getType(getTestProjectDir(), srcFolder, pkg, "T8");
+
+        _T1_R1 = getRole(_T1, "T1.R1");
+        _T1_R2 = getRole(_T1, "T1.R2");
+
+        _T2_R1 = getRole(_T2, "T2.R1");
+        _T2_R2 = getRole(_T2, "T2.R2");
+
+        _T3_R1 = getRole(_T3, "T3.R1");
+        _T3_R2 = getRole(_T3, "T3.R2");
+
+        _phantom_T4_R1 = new PhantomType(_T4, _T2_R1);
+        _T4_R2 = getRole(_T4, "T4.R2");
+
+        _T5_R1 = getRole(_T5, "T5.R1");
+        _T5_R2 = getRole(_T5, "T5.R2");
+        _T5_R3 = getRole(_T5, "T5.R3");
+
+        _T6_R1 = getRole(_T6, "T6.R1");
+        _phantom_T6_R2 = new PhantomType(_T6, _T2_R2);
+        
+        _phantom_T7_R1 = new PhantomType(_T7, _T5_R1);
+        _T7_R2 = getRole(_T7, "T7.R2");
+        _T7_R3 = getRole(_T7, "T7.R3");
+
+        _phantom_T8_R1 = new PhantomType(_T8, _T6_R1);
+        _T8_R2 = getRole(_T8, "T8.R2");
+        
+		_objectType = getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+	}
+	
+    
+    public void testCreation()
+    {
+    	assertCreation(_T1);
+        assertCreation(_T2);
+        assertCreation(_T3);
+        assertCreation(_T4);
+        assertCreation(_T5);
+        assertCreation(_T6);
+        assertCreation(_T7);
+        assertCreation(_T8);
+
+        assertCreation(_T1_R1);
+        assertCreation(_T1_R2);
+
+        assertCreation(_T2_R1);
+        assertCreation(_T2_R2);
+
+        assertCreation(_T3_R1);
+        assertCreation(_T3_R2);
+
+        assertCreation(_phantom_T4_R1);
+        assertCreation(_T4_R2);
+
+        assertCreation(_T5_R1);
+        assertCreation(_T5_R2);
+        assertCreation(_T5_R3);
+
+        assertCreation(_T6_R1);
+        assertCreation(_phantom_T6_R2);
+        
+        assertCreation(_phantom_T7_R1);
+        assertCreation(_T7_R2);
+        assertCreation(_T7_R3);
+
+        assertCreation(_phantom_T8_R1);
+        assertCreation(_T8_R2);
+    }
+
+    public void testGetExplicitSuperclass_T8R2() throws JavaModelException
+    {
+        _focusType = _T8_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType expected = _T6_R1;
+        IType actual = _testObj.getExplicitSuperclass(_focusType);
+
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetExplicitSuperclass_T8R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T8_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType expected = _phantom_T8_R1;
+        IType actual = _testObj.getExplicitSuperclass(_focusType);
+
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetTSuperTypes_T8R2() throws JavaModelException
+    {
+        _focusType = _T8_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T2_R2 };        
+        IType[] actual = _testObj.getTSuperTypes(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetTSuperTypes_T8R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T8_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _phantom_T6_R2 };        
+        IType[] actual = _testObj.getTSuperTypes(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllTSuperTypes_T8R2() throws JavaModelException
+    {
+        _focusType = _T8_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T2_R2,
+                                         _T1_R2
+                                       };
+        
+        IType[] actual = _testObj.getAllTSuperTypes(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetAllTSuperTypes_T8R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T8_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _phantom_T6_R2,
+                                         _T2_R2,
+                                         _T1_R2
+                                       };
+        
+        IType[] actual = _testObj.getAllTSuperTypes(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetSuperclasses_T8R2() throws JavaModelException
+    {
+        _focusType = _T8_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T6_R1,
+                                         _T2_R2,
+                                       };
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSuperclasses_T8R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T8_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _phantom_T8_R1,
+                                         _phantom_T6_R2
+                                       };
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+        
+	public void testGetAllSuperclasses_T8R2() throws JavaModelException
+	{
+		_focusType = _T8_R2;
+		_testObj = createOTSuperTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] { _objectType,
+								         _T6_R1,
+								         _T2_R2,
+								         _T2_R1,
+								         _T1_R2,
+								         _T1_R1
+								       };
+		
+		IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+    public void testGetAllSuperclasses_T8R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T8_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+
+        IType[] expected = new IType[] { _objectType,
+                                         _phantom_T8_R1,
+                                         _T6_R1,
+                                         _phantom_T6_R2,
+                                         _T2_R2,
+                                         _T2_R1,
+                                         _T1_R2,
+                                         _T1_R1
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+
+
+    public void testGetSuperclasses_T6R1() throws JavaModelException
+    {
+        _focusType = _T6_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T2_R1,
+                                       };
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetSuperclasses_T6R1_phantomMode() throws JavaModelException
+    {
+        _focusType = _T6_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T2_R1,
+                                       };
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetAllSuperclasses_T6R1() throws JavaModelException
+    {
+        _focusType = _T6_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T2_R1,
+                                         _T1_R1
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+
+    public void testGetSuperclasses_T2R2() throws JavaModelException
+    {
+        _focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T2_R1,
+                                         _T1_R2
+                                       };
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetAllSuperclasses_T2R2() throws JavaModelException
+    {
+        _focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         _T1_R2
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    
+    public void testGetAllSuperclasses_T2R1() throws JavaModelException
+    {
+        _focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T1_R1
+                                         };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    
+    public void testGetAllSuperclasses_T1R1() throws JavaModelException
+    {
+        _focusType = _T1_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    
+    public void testGetAllSuperclasses_T1R2() throws JavaModelException
+    {
+        _focusType = _T1_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetSuperclasses_T7R3() throws JavaModelException
+    {
+        _focusType = _T7_R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T5_R1,
+                                         _T5_R3
+                                       };
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+
+    public void testGetSuperclasses_T7R3_phantomMode() throws JavaModelException
+    {
+        _focusType = _T7_R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _phantom_T7_R1,
+                                         _T5_R3
+                                       };
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetAllSuperclasses_T7R3() throws JavaModelException
+    {
+        _focusType = _T7_R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T5_R1,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         _T5_R3
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetAllSuperclasses_T7R3_phantomMode() throws JavaModelException
+    {
+        _focusType = _T7_R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _phantom_T7_R1,
+                                         _T5_R1,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         _T5_R3
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+	public void testGetAllSuperclasses_T7R2() throws JavaModelException
+	{
+		_focusType = _T7_R2;
+		_testObj = createOTSuperTypeHierarchy(_focusType);
+		
+		IType[] expected = new IType[] { _objectType,
+								         _T7_R3,
+								         _T5_R1,
+								         _T5_R3,
+								         _T5_R2,
+								         _T2_R2,
+								         _T2_R1,
+								         _T1_R2,
+								         _T1_R1
+                                       };
+		
+		IType[] actual = _testObj.getAllSuperclasses(_T7_R2);
+
+        assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+    
+    
+    public void testGetAllSuperclasses_T7R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T7_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T7_R3,
+                                         _phantom_T7_R1,
+                                         _T5_R1,
+                                         _T5_R3,
+                                         _T5_R2,
+                                         _T2_R2,
+                                         _T2_R1,
+                                         _T1_R2,
+                                         _T1_R1
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_T7_R2);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+
+    public void testGetAllSuperclasses_T7R3inT7R2() throws JavaModelException
+    {
+        _focusType = _T7_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T5_R1,
+                                         _T5_R3,
+                                         _T2_R1,
+                                         _T1_R1
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_T7_R3);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+
+    public void testGetAllSuperclasses_T2R1inT7R2() throws JavaModelException
+    {
+        _focusType = _T7_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T1_R1
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_T2_R1);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+        
+    public void testGetAllSuperclasses_T5R2() throws JavaModelException
+    {
+        _focusType = _T5_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T5_R3,
+                                         _T5_R1,
+                                         _T2_R2,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         _T1_R2
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    
+    public void testGetAllSuperclasses_T5R3() throws JavaModelException
+    {
+        _focusType = _T5_R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T5_R1,
+                                         _T2_R1,
+                                         _T1_R1
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    
+    public void testGetAllSuperclasses_T5R1() throws JavaModelException
+    {
+        _focusType = _T5_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T2_R1,
+                                         _T1_R1
+                                         };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetSuperclasses_T4R2() throws JavaModelException
+    {
+        _focusType = _T4_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T2_R2,
+                                         _T2_R1
+                                       };
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetSuperclasses_T4R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T4_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _T2_R2,
+                                         _phantom_T4_R1
+                                       };
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetAllSuperclasses_T4R2() throws JavaModelException
+    {
+        _focusType = _T4_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T2_R2,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         _T1_R2
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+
+    public void testGetAllSuperclasses_T4R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T4_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _phantom_T4_R1,
+                                         _T2_R2,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         _T1_R2
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    
+    public void testGetAllSuperclasses_T3R2() throws JavaModelException
+    {
+        _focusType = _T3_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T3_R1,
+                                         _T2_R2,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         _T1_R2
+                                       };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T3R1() throws JavaModelException
+    {
+        _focusType = _T3_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         };
+        
+        IType[] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    
+    public void testGetAllTSuperTypes_T5R1inT7R2() throws JavaModelException
+    {
+        _focusType = _T7_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T2_R1,
+                                         _T1_R1,
+                                       };
+        
+        IType[] actual = _testObj.getAllTSuperTypes(_T5_R1);
+        assertEquals(expected.length, actual.length);
+        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    
+    public void testToString_forNoException() throws JavaModelException
+    {
+        _focusType = _T5_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        try
+        {
+        	_testObj.toString();		
+		}
+		catch (Exception ex)
+		{
+			assertTrue(ex.getClass().toString() + " in OTTypeHierarchy.toString()", false);
+		}
+		
+        assertTrue(true);
+    }
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest002.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest002.java
new file mode 100644
index 0000000..40b0e97
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest002.java
@@ -0,0 +1,203 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest002.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSuperTypeHierarchyTest002.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSuperTypeHierarchyTest002 extends FileBasedHierarchyTest
+{
+    
+    private IType _T1;
+    private IType _T2;
+    private IType _T3;
+	private IType _T1_R1;
+	private IType _T2_R1;
+	private IType _T3_R1;
+    private IType _classA;
+	private IType _objectType;
+	
+	public OTSuperTypeHierarchyTest002(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest002.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest002.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test002";
+		
+        _T1 = getType(getTestProjectDir(), srcFolder, pkg, "T1");
+        _T2 = getType(getTestProjectDir(), srcFolder, pkg, "T2");
+        _T3 = getType(getTestProjectDir(), srcFolder, pkg, "T3");
+        
+		_T1_R1 = getRole(_T1, "T1.R1");
+		_T2_R1 = getRole(_T2, "T2.R1");
+        _T3_R1 = getRole(_T3, "T3.R1");
+
+        _classA =  getType(getTestProjectDir(), srcFolder, pkg, "ClassA");
+
+        _objectType = getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+	}
+	    
+    public void testCreation()
+    {
+        assertCreation(_T1);
+        assertCreation(_T2);
+        assertCreation(_T3);
+        assertCreation(_T1_R1);
+        assertCreation(_T2_R1);
+        assertCreation(_T3_R1);
+        assertCreation(_classA);
+    }
+    
+	public void testGetAllSuperclasses_T3R1() throws JavaModelException
+	{
+		_focusType = _T3_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+		
+		IType[] expected = new IType[] { _objectType,
+								         _T2_R1,
+								         _T1_R1,
+								         _classA };
+		
+		IType [] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+	public void testGetAllSuperclasses_T2R1() throws JavaModelException
+	{
+		_focusType = _T2_R1;
+		_testObj = createOTSuperTypeHierarchy(_focusType);
+
+		IType[] expected = new IType[] { _objectType,
+								         _T1_R1,
+								         _classA };
+		
+		IType [] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetAllClasses_T2R1() throws JavaModelException
+	{
+		_focusType = _T2_R1;
+		_testObj = createOTSuperTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] { _objectType,
+								         _T1_R1,
+										 _T2_R1,
+								         _classA };
+		
+		IType [] actual = _testObj.getAllClasses();
+
+        assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+    public void testGetSuperclasses_T2R1() throws JavaModelException
+    {
+        _focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T1_R1,
+                                         _classA };
+        
+        IType [] actual = _testObj.getSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetExplicitSuperclass_T2R1() throws JavaModelException
+    {
+        _focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType expected = _classA;
+        
+        IType actual = _testObj.getExplicitSuperclass(_focusType);
+
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetExplicitSuperclass_T3R1() throws JavaModelException
+    {
+        _focusType = _T3_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType expected = _classA;
+        
+        IType actual = _testObj.getExplicitSuperclass(_focusType);
+
+        assertTrue(compareTypes(expected, actual));
+    }
+
+	public void testGetAllSuperclasses_T1R1() throws JavaModelException
+	{
+		_focusType = _T1_R1;
+		_testObj = createOTSuperTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] { _objectType };		
+		IType [] actual =_testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+	public void testGetAllTSuperTypes() throws JavaModelException
+	{
+		_focusType = _T3_R1;
+		_testObj = createOTSuperTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] { _T2_R1,
+		         						 _T1_R1 };
+		IType [] actual = _testObj.getAllTSuperTypes(_focusType);
+		assertEquals(expected.length, actual.length);
+		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest003.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest003.java
new file mode 100644
index 0000000..a5cad29
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest003.java
@@ -0,0 +1,409 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest003.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.PhantomType;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSuperTypeHierarchyTest003.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSuperTypeHierarchyTest003 extends FileBasedHierarchyTest
+{
+	private IType _T1;
+    private IType _T2;
+    private IType _T3;
+    private IType _T4;
+
+	private IType _T1_R1;
+	private IType _T1_R2;
+    private IType _phantom_T2_R1;
+	private IType _T2_R2;
+	private IType _T3_R1;
+	private IType _T3_R2;
+	private IType _T4_R1;
+	private IType _T4_R2;
+	private IType _T4_R3;
+
+	private IType _interfaceA;
+    private IType _objectType;
+	
+	public OTSuperTypeHierarchyTest003(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest003.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest003.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test003";
+
+        _T1 = getType(getTestProjectDir(), srcFolder, pkg, "T1");
+        _T2 = getType(getTestProjectDir(), srcFolder, pkg, "T2");
+        _T3 = getType(getTestProjectDir(), srcFolder, pkg, "T3");
+        _T4 = getType(getTestProjectDir(), srcFolder, pkg, "T4");
+        
+        _T1_R1 = getRole(_T1, "T1.R1");
+        _T1_R2 = getRole(_T1, "T1.R2");
+
+        _phantom_T2_R1 = new PhantomType(_T2, _T1_R1);
+        _T2_R2 = getRole(_T2, "T2.R2");
+
+        _T3_R1 = getRole(_T3, "T3.R1");
+        _T3_R2 = getRole(_T3, "T3.R2");
+
+        _T4_R1 = getRole(_T4, "T4.R1");
+        _T4_R2 = getRole(_T4, "T4.R2");
+        _T4_R3 = getRole(_T4, "T4.R3");
+
+        _interfaceA =
+            getType(getTestProjectDir(), srcFolder, pkg, "InterfaceA");
+        
+        _objectType =
+            getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+	}
+	
+    public void testCreation()
+    {
+        assertCreation(_T1);
+        assertCreation(_T2);
+        assertCreation(_T3);
+        assertCreation(_T4);
+
+        assertCreation(_T1_R1);
+        assertCreation(_T1_R2);
+
+        assertCreation(_phantom_T2_R1);
+        assertCreation(_T2_R2);
+
+        assertCreation(_T3_R1);
+        assertCreation(_T3_R2);
+
+        assertCreation(_T4_R1);
+        assertCreation(_T4_R2);
+        assertCreation(_T4_R3);
+    }
+
+    public void testGetSuperInterfaces_T4R1() throws JavaModelException
+    {
+        _focusType = _T4_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _T1_R1 };        
+        IType [] actual = _testObj.getSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+
+    public void testGetSuperInterfaces_T4R1_phantomMode() throws JavaModelException
+    {
+        _focusType = _T4_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _phantom_T2_R1 };        
+        IType [] actual = _testObj.getSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+
+    public void testGetSuperInterfaces_T4R2() throws JavaModelException
+    {
+        _focusType = _T4_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _T2_R2, _interfaceA };        
+        IType [] actual = _testObj.getSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+
+    public void testGetSuperInterfaces_T4R3() throws JavaModelException
+    {
+        _focusType = _T4_R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _T4_R2 };        
+        IType [] actual = _testObj.getSuperInterfaces(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetSuperInterfaces_T2R2() throws JavaModelException
+    {
+        _focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _T1_R2, _interfaceA };        
+        IType [] actual = _testObj.getSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperInterfaces_T4R1() throws JavaModelException
+    {
+        _focusType = _T4_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _T1_R1 };        
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperInterfaces_T4R2() throws JavaModelException
+    {
+        _focusType = _T4_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _interfaceA,
+                                         _T1_R2,
+                                         _T2_R2 };        
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperInterfaces_T3R1() throws JavaModelException
+    {
+        _focusType = _T3_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _T1_R1 };        
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperInterfaces_T3R2() throws JavaModelException
+    {
+        _focusType = _T3_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _interfaceA,
+                                         _T1_R2,
+                                         _T2_R2 };        
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperInterfaces_T2R2() throws JavaModelException
+    {
+        _focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T1_R2,
+                                         _interfaceA };        
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+
+    public void testGetAllSuperInterfaces_T1R2() throws JavaModelException
+    {
+        _focusType = _T1_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperInterfaces_T1R1() throws JavaModelException
+    {
+        _focusType = _T1_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};        
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperInterfaces_interfaceA() throws JavaModelException
+    {
+        _focusType = _interfaceA;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T4R1() throws JavaModelException
+    {
+        _focusType = _T4_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T4R2() throws JavaModelException
+    {
+        _focusType = _T4_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T3R1() throws JavaModelException
+    {
+        _focusType = _T3_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T3R2() throws JavaModelException
+    {
+        _focusType = _T3_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T2R2() throws JavaModelException
+    {
+        _focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T1R1() throws JavaModelException
+    {
+        _focusType = _T1_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};       
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetAllSuperclasses_T1R2() throws JavaModelException
+    {
+        _focusType = _T1_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_interfaceA() throws JavaModelException
+    {
+        _focusType = _interfaceA;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {};        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperInterfaces_T4R3() throws JavaModelException
+    {
+        _focusType = _T4_R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _T4_R2,
+                                         _T2_R2,
+                                         _T1_R2,
+                                         _interfaceA };        
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T4R3() throws JavaModelException
+    {
+        _focusType = _T4_R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _objectType };        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue("Wrong Types", compareTypes(expected, actual));
+    }
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest004.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest004.java
new file mode 100644
index 0000000..426678c
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest004.java
@@ -0,0 +1,143 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest004.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * 
+ * @author michael
+ * @version $Id: OTSuperTypeHierarchyTest004.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSuperTypeHierarchyTest004 extends FileBasedModelTest {
+	
+	@SuppressWarnings("unused")
+	private ITypeHierarchy _testObj;
+	private IType _focusType;
+    private IType _T20;
+    private IType _T21;    
+	private IType _objectType;
+    private IType _T20T10T00R0;
+    private IType _T20T10T00R1;
+    private IType _T21T10T00R1;
+    private IType _T21T10T00R2;
+    private IType _T21T11T00R0;
+    private IType _T21T11T00R1;
+    private IType _T21T11T00R2;
+    
+    
+    
+	public OTSuperTypeHierarchyTest004(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest004.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest004.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test004";
+		
+		_T20 = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T20");
+
+        _T21 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "T21");
+        
+        
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _T20T10T00R0 = getRole(_T20, "T20.T10.T00.R0");
+        _T20T10T00R1 = getRole(_T20, "T20.T10.T00.R1");
+        _T21T10T00R1 = getRole(_T21, "T21.T10.T00.R1");
+        _T21T10T00R2 = getRole(_T21, "T21.T10.T00.R2");
+        _T21T11T00R0 = getRole(_T21, "T21.T11.T00.R0");
+        _T21T11T00R1 = getRole(_T21, "T21.T11.T00.R1");
+        _T21T11T00R2 = getRole(_T21, "T21.T11.T00.R2");
+    }
+	
+	public void testCreation()
+	{
+		assertCreation(_T20);
+        assertCreation(_T21);
+        assertCreation(_T20T10T00R0);
+        assertCreation(_T20T10T00R1);
+        assertCreation(_T21T10T00R1);
+        assertCreation(_T21T10T00R2);
+        assertCreation(_T21T11T00R0);
+        assertCreation(_T21T11T00R1);
+        assertCreation(_T21T11T00R2);
+    }
+
+	public void testGetAllSuperclasses_T21T11T00R2() throws JavaModelException
+    {
+        _focusType = _T21T11T00R2;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSuperclasses(_focusType);
+        IType[] expected = new IType[] { _objectType,
+                                         _T20T10T00R0,
+										 _T20T10T00R1,
+										 _T21T10T00R1,
+										 _T21T10T00R2,
+										 _T21T11T00R0,
+										 _T21T11T00R1,
+                                       };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest006.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest006.java
new file mode 100644
index 0000000..6d33bb8
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest006.java
@@ -0,0 +1,239 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest006.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.PhantomType;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author michael
+ * @version $Id: OTSuperTypeHierarchyTest006.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSuperTypeHierarchyTest006 extends FileBasedHierarchyTest
+{
+	private IType _T1;
+    private IType _T2;
+    private IType _T3;
+    
+	private IType _T1_R1;
+	private IType _T1_R2;
+	
+	private IType _T2_R1;
+    private IType _phantom_T2_R2;
+
+    private IType _phantom_T3_R1;
+	private IType _T3_R2;
+	
+    private IType _classA;    
+	private IType _objectType;
+	
+	public OTSuperTypeHierarchyTest006(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest006.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest006.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test006";
+		_T1 = getType(getTestProjectDir(), srcFolder, pkg, "T1");
+		_T2 = getType(getTestProjectDir(), srcFolder, pkg, "T2");
+		_T3 = getType(getTestProjectDir(), srcFolder, pkg, "T3");
+		
+		_T1_R1 = getRole(_T1, "T1.R1");
+		_T1_R2 = getRole(_T1, "T1.R2");
+		
+		_T2_R1 = getRole(_T2, "T2.R1");
+		_phantom_T2_R2 = new PhantomType(_T2, _T1_R2);
+		
+		_phantom_T3_R1 = new PhantomType(_T3, _T2_R1);
+		_T3_R2 = getRole(_T3, "T3.R2");
+        
+		_classA =
+            getType(getTestProjectDir(), srcFolder, pkg, "ClassA");				
+		
+        _objectType =
+            getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+	}
+	
+    public void testCreation()
+    {
+        assertCreation(_T1);
+        assertCreation(_T2);
+        assertCreation(_T3);
+
+        assertCreation(_T1_R1);
+        assertCreation(_T1_R2);
+
+        assertCreation(_T2_R1);
+        assertCreation(_phantom_T2_R2);
+
+        assertCreation(_phantom_T3_R1);
+        assertCreation(_T3_R2);
+    }
+    
+    public void testGetAllSuperclasses_T1R1() throws JavaModelException
+    {
+        _focusType = _T1_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                						 _classA };
+        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T2R2() throws JavaModelException
+    {
+        _focusType = _T1_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType };
+        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T2R1() throws JavaModelException
+    {
+        _focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T1_R1,
+                                         _classA };
+        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetAllSuperclasses_T3R2() throws JavaModelException
+    {
+        _focusType = _T3_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         _T1_R2,
+                                         _classA };
+        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllSuperclasses_T3R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T3_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+        
+        IType[] expected = new IType[] { _objectType,
+                                         _T2_R1,
+                                         _T1_R1,
+                                         _T1_R2,
+                                         _phantom_T2_R2,
+                                         _phantom_T3_R1,
+                                         _classA };
+        
+        IType [] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+	public void testGetExplicitSuperclass_T3R2() throws JavaModelException
+    {
+        _focusType = _T3_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+              
+        IType expected = _T2_R1;        
+        IType actual = _testObj.getExplicitSuperclass(_focusType);
+
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetExplicitSuperclass_T3R2_phantomMode() throws JavaModelException
+    {
+        _focusType = _T3_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        _testObj.setPhantomMode(true);
+              
+        IType expected = _phantom_T3_R1;
+        IType actual = _testObj.getExplicitSuperclass(_focusType);
+
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+	public void testGetAllTSuperTypes_T3R2() throws JavaModelException
+    {
+        _focusType = _T3_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _T1_R2 };
+        
+        IType [] actual = _testObj.getAllTSuperTypes(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+	public void testGetAllTSuperTypes_T2R1() throws JavaModelException
+    {
+        _focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _T1_R1 };
+        IType [] actual = _testObj.getAllTSuperTypes(_focusType);
+
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+	
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest007.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest007.java
new file mode 100644
index 0000000..f08f843
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest007.java
@@ -0,0 +1,267 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest007.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author Michael Krueger (michael)
+ * @version $Id: OTSuperTypeHierarchyTest007.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSuperTypeHierarchyTest007 extends FileBasedHierarchyTest
+{
+	private IType _T1;
+    private IType _T2;
+    
+	private IType _T1_R1;
+	private IType _T1_R2;
+	
+	private IType _T2_R1;
+	private IType _T2_R2;
+	
+    private IType _classA;
+    private IType _classB;
+    
+    private IType _interfaceA;
+    private IType _interfaceB;
+    private IType _interfaceC;
+    
+    private IType _objectType;
+	
+	public OTSuperTypeHierarchyTest007(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest007.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest007.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test007";
+		
+		_T1 = getType(getTestProjectDir(), srcFolder, pkg, "T1");
+		_T2 = getType(getTestProjectDir(), srcFolder, pkg, "T2");
+		
+		_T1_R1 = getRole(_T1, "T1.R1");
+		_T1_R2 = getRole(_T1, "T1.R2");
+		
+		_T2_R1 = getRole(_T2, "T2.R1");
+        _T2_R2 = getRole(_T2, "T2.R2");
+		        
+        _classA =
+            getType(getTestProjectDir(), srcFolder, pkg, "ClassA");
+        _classB =
+            getType(getTestProjectDir(), srcFolder, pkg, "ClassB");
+        _interfaceA =
+            getType(getTestProjectDir(), srcFolder, pkg, "InterfaceA");
+        _interfaceB =
+            getType(getTestProjectDir(), srcFolder, pkg, "InterfaceB");
+        _interfaceC =
+            getType(getTestProjectDir(), srcFolder, pkg, "InterfaceC");
+        _objectType =
+            getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+	}
+	
+    
+    public void testCreation()
+    {
+        assertCreation(_T1);
+        assertCreation(_T2);
+
+        assertCreation(_T1_R1);
+        assertCreation(_T1_R2);
+
+        assertCreation(_T2_R1);
+        assertCreation(_T2_R2);
+    }
+    
+	public void testGetAllSuperclassesFor_T2R1() throws JavaModelException
+	{
+		_focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] { _objectType,
+                                         _classB,
+                                         _classA,
+                                         _T1_R1 };
+		IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+	public void testGetAllSuperclassesFor_T2R2() throws JavaModelException
+	{
+		_focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] { _objectType, _T1_R2 };		
+		IType [] actual = _testObj.getAllSuperclasses(_focusType);
+
+        assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	
+	public void testGetAllSuperInterfacesFor_T2R2() throws JavaModelException
+	{
+		_focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] {
+                                         _interfaceA,
+                                         _interfaceB,
+                                         _interfaceC };		
+		IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetSuperInterfaces_T1R2() throws JavaModelException
+	{
+		_focusType = _T1_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] { _interfaceA };
+		IType [] actual = _testObj.getSuperInterfaces(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetAllSuperclassesFor_interfaceB() throws JavaModelException
+	{
+		_focusType = _interfaceB;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[0];		
+		IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetAllSuperInterfacesFor_interfaceB() throws JavaModelException
+	{
+		_focusType = _interfaceB;
+        _testObj = createOTSuperTypeHierarchy(_focusType);		
+
+        IType[] expected = new IType[] { _interfaceA };		
+		IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+	public void testGetAllSuperInterfacesFor_ClassA() throws JavaModelException
+	{
+		_focusType = _classA;
+		_testObj = createOTSuperTypeHierarchy(_focusType);
+		
+		IType[] expected = new IType[0];
+		IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+		
+		assertEquals(expected.length, actual.length);      
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+    public void testGetSuperInterfaces_interfaceB_In_T2R2() throws JavaModelException
+    {
+        _focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _interfaceA };        
+        IType [] actual = _testObj.getSuperInterfaces(_interfaceB);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+	public void testGetAllSuperclassesFor_classB() throws JavaModelException
+	{
+		_focusType = _classB;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+		IType[] expected = new IType[] { _objectType,
+                                         _classA };		
+		IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetExplicitSuperclassFor_classB() throws JavaModelException
+	{
+		_focusType = _classB;
+        _testObj = createOTSuperTypeHierarchy(_focusType);		
+
+        IType expected = _classA;		
+		IType actual = _testObj.getExplicitSuperclass(_focusType);
+
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetAllInterfaces_T2R2() throws JavaModelException
+	{
+		_focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] expected = new IType[] {
+                                         _interfaceA,
+                                         _interfaceB,
+                                         _interfaceC };
+		IType [] actual = _testObj.getAllInterfaces();
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+    public void testGetImplementingClasses_interfaceA_in_T2R2() throws JavaModelException
+    {
+        _focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);      
+
+        IType[] expected = new IType[] { _T1_R2, _T2_R2 };     
+        IType [] actual = _testObj.getImplementingClasses(_interfaceA);
+        
+        assertEquals(expected.length, actual.length);       
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest007_Stress.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest007_Stress.java
new file mode 100644
index 0000000..a86309f
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest007_Stress.java
@@ -0,0 +1,175 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest007_Stress.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author Michael Krueger (michael)
+ * @version $Id: OTSuperTypeHierarchyTest007_Stress.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+@SuppressWarnings("unused")
+public class OTSuperTypeHierarchyTest007_Stress extends FileBasedHierarchyTest
+{
+    private IType _T1;
+    private IType _T2;
+    
+	private IType _T1_R1;
+	private IType _T1_R2;
+	
+	private IType _T2_R1;
+	private IType _T2_R2;
+	
+	private IType _classA;
+    private IType _classB;
+    
+    private IType _interfaceA;
+    private IType _interfaceB;
+    private IType _interfaceC;
+    
+    private IType _objectType;
+	
+	public OTSuperTypeHierarchyTest007_Stress(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest007_Stress.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest007_Stress.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test007";
+		
+        _T1 = getType(getTestProjectDir(), srcFolder, pkg, "T1");
+        _T2 = getType(getTestProjectDir(), srcFolder, pkg, "T2");
+        
+        _T1_R1 = getRole(_T1, "T1.R1");
+        _T1_R2 = getRole(_T1, "T1.R2");
+        
+        _T2_R1 = getRole(_T2, "T2.R1");
+        _T2_R2 = getRole(_T2, "T2.R2");
+                
+        _classA =
+            getType(getTestProjectDir(), srcFolder, pkg, "ClassA");
+        _classB =
+            getType(getTestProjectDir(), srcFolder, pkg, "ClassB");
+        _interfaceA =
+            getType(getTestProjectDir(), srcFolder, pkg, "InterfaceA");
+        _interfaceB =
+            getType(getTestProjectDir(), srcFolder, pkg, "InterfaceB");
+        _interfaceC =
+            getType(getTestProjectDir(), srcFolder, pkg, "InterfaceC");
+        _objectType =
+            getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+        
+	}
+	
+	public void testGetAllSuperInterfacesFor_T2R2_Run001()
+        throws JavaModelException
+	{
+        runActualTestCase();
+	}
+
+    public void testGetAllSuperInterfacesFor_T2R2_Run002()
+        throws JavaModelException
+    {
+        runActualTestCase();
+    }
+    
+    public void testGetAllSuperInterfacesFor_T2R2_Run003()
+        throws JavaModelException
+    {
+        runActualTestCase();
+    }
+    
+    public void testGetAllSuperInterfacesFor_T2R2_Run004()
+        throws JavaModelException
+    {
+        runActualTestCase();
+    }
+    
+    public void testGetAllSuperInterfacesFor_T2R2_Run005()
+        throws JavaModelException
+    {
+        runActualTestCase();
+    }
+    
+    public void testGetAllSuperInterfacesFor_T2R2_Run006()
+        throws JavaModelException
+    {
+        runActualTestCase();
+    }
+    
+    public void testGetAllSuperInterfacesFor_T2R2_Run007()
+        throws JavaModelException
+    {
+        runActualTestCase();
+    }
+    
+    public void testGetAllSuperInterfacesFor_T2R2_Run008()
+        throws JavaModelException
+    {
+        runActualTestCase();
+    }
+    
+    public void testGetAllSuperInterfacesFor_T2R2_Run009()
+        throws JavaModelException
+    {
+        runActualTestCase();
+    }
+    
+    public void testGetAllSuperInterfacesFor_T2R2_Run010()
+        throws JavaModelException
+    {
+        runActualTestCase();
+    } 
+
+    private void runActualTestCase() throws JavaModelException
+    {
+        _focusType = _T2_R2;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _interfaceA,
+                                         _interfaceB,
+                                         _interfaceC };        
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest008.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest008.java
new file mode 100644
index 0000000..bd524e4
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest008.java
@@ -0,0 +1,247 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest008.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * 
+ * @author Michael Krueger (michael)
+ * @version $Id: OTSuperTypeHierarchyTest008.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSuperTypeHierarchyTest008 extends FileBasedHierarchyTest
+{
+	
+    private IType _T21;
+    private IType _T22;    
+	private IType _objectType;
+    private IType _T21T12R1;
+    private IType _T21T12R2;
+    private IType _T21T12R3;
+    private IType _T21T11R1;
+    private IType _T21T11R2;
+    private IType _T21T11R3;
+    private IType _T22T12R1;
+    private IType _T22T12R2;
+    private IType _T22T12R3;
+    private IType _T22T11R1;
+    private IType _T22T11R2;
+    private IType _T22T11R3;
+    
+	public OTSuperTypeHierarchyTest008(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest008.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest008.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test008";
+		
+		_T22 = getType(getTestProjectDir(), srcFolder, pkg, "T22");
+        _T21 = getType(getTestProjectDir(), srcFolder, pkg, "T21");        
+        _objectType =
+            getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+
+        _T21T12R1 = getRole(_T21, "T21.T12.R1");
+        _T21T12R2 = getRole(_T21, "T21.T12.R2");
+        _T21T12R3 = getRole(_T21, "T21.T12.R3");
+        _T21T11R1 = getRole(_T21, "T21.T11.R1");
+        _T21T11R2 = getRole(_T21, "T21.T11.R2");
+        _T21T11R3 = getRole(_T21, "T21.T11.R3");
+        _T22T12R1 = getRole(_T22, "T22.T12.R1");
+        _T22T12R2 = getRole(_T22, "T22.T12.R2");
+        _T22T12R3 = getRole(_T22, "T22.T12.R3");
+        _T22T11R1 = getRole(_T22, "T22.T11.R1");
+        _T22T11R2 = getRole(_T22, "T22.T11.R2");
+        _T22T11R3 = getRole(_T22, "T22.T11.R3");
+    }
+	
+	public void testCreation()
+	{
+		assertCreation(_T21);
+        assertCreation(_T22);
+        assertCreation(_T21T12R1);
+        assertCreation(_T21T12R2);
+        assertCreation(_T21T12R3);
+        assertCreation(_T21T11R1);
+        assertCreation(_T21T11R2);
+        assertCreation(_T21T11R3);
+
+        assertCreation(_T22T12R1);
+        assertCreation(_T22T12R2);
+        assertCreation(_T22T12R3);
+        assertCreation(_T22T11R1);
+        assertCreation(_T22T11R2);
+        assertCreation(_T22T11R3);
+    }
+
+	public void testGetAllSuperclasses_T22T11R2() throws JavaModelException
+    {
+        _focusType = _T22T11R2;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSuperclasses(_focusType);
+        IType[] expected = new IType[] { _objectType,
+                                            _T22T11R1,
+                                            _T21T11R1,
+                                            _T21T11R2,
+                                        };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetAllSuperclasses_T22T12R3() throws JavaModelException
+    {
+        _focusType = _T22T12R3;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSuperclasses(_focusType);
+        IType[] expected = new IType[] { _objectType,
+                                         _T21T11R1,
+                                         _T21T11R2,
+                                         _T21T11R3,
+                                         _T21T12R1,
+                                         _T21T12R2,
+                                         _T21T12R3,
+                                         _T22T11R1,
+                                         _T22T11R2,
+                                         _T22T11R3,
+                                         _T22T12R1,
+                                         _T22T12R2,
+                                        };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetTSuperTypes_T22T12R3() throws JavaModelException
+    {
+        _focusType = _T22T12R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] actual = _testObj.getTSuperTypes(_focusType);
+        IType[] expected = new IType[] { _T21T12R3,
+                                         _T22T11R3 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetAllTSuperTypes_T22T12R3() throws JavaModelException
+    {
+        _focusType = _T22T12R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] actual = _testObj.getAllTSuperTypes(_focusType);
+        IType[] expected = new IType[] { _T21T12R3,
+                                         _T22T11R3,
+                                         _T21T11R3 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSuperclass_UnsupportedOperationException() throws JavaModelException
+    {
+        _focusType = _T22T12R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        boolean result = false;
+        try
+		{
+        	_testObj.getSuperclass(_focusType);
+		}
+        catch(Exception exc)
+		{
+        	result = exc instanceof UnsupportedOperationException;
+		}
+        assertTrue(result);
+    }
+    
+    public void testGetExplicitSuperclass_T22T12R3() throws JavaModelException
+    {
+        _focusType = _T22T12R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType actual = _testObj.getExplicitSuperclass(_focusType);
+        IType expected = _T22T12R2;
+           
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSuperclasses_T22T12R3() throws JavaModelException
+    {
+        _focusType = _T22T12R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+        IType[] expected = new IType[] { _T22T12R2,
+                                         _T21T12R3,
+                                         _T22T11R3 };
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetSuperclasses_T22T12R2inT22T12R3() throws JavaModelException
+    {
+        _focusType = _T22T12R3;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+        IType[] actual = _testObj.getSuperclasses(_T22T12R2);
+        IType[] expected = new IType[] { _T22T12R1,
+                                         _T21T12R2,
+                                         _T22T11R2 };
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest009.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest009.java
new file mode 100644
index 0000000..4999366
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest009.java
@@ -0,0 +1,195 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest009.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+import org.eclipse.objectteams.otdt.core.TypeHelper;
+
+/**
+ * 
+ * @author michael
+ * @version $Id: OTSuperTypeHierarchyTest009.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSuperTypeHierarchyTest009 extends FileBasedModelTest {
+	
+	@SuppressWarnings("unused")
+	private ITypeHierarchy _testObj;
+	private IType _focusType;
+    private IType _T10;
+    private IType _T11;    
+	private IType _objectType;
+    private IType _T10T00;
+    private IType _T11T00;
+    private IType _T10T00R0;
+    private IType _T11T00R0;
+    
+    
+    
+	public OTSuperTypeHierarchyTest009(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest009.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest009.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test009";
+		
+		_T10 = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T10");
+
+        _T11 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "T11");
+        
+        
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _T10T00R0 = TypeHelper.findNestedRoleType(_T10, "T10.T00.R0");
+        _T11T00R0 = TypeHelper.findNestedRoleType(_T11, "T11.T00.R0");
+        _T10T00 = TypeHelper.findNestedRoleType(_T10, "T10.T00");
+        _T11T00 = TypeHelper.findNestedRoleType(_T11, "T11.T00");
+
+    }
+
+    
+	public void testCreation()
+	{
+		assertCreation(_T10);
+        assertCreation(_T11);
+        assertCreation(_T10T00);
+        assertCreation(_T11T00);
+        assertCreation(_T10T00R0);
+        assertCreation(_T11T00R0);
+
+        
+    }
+
+    
+    public void testGetTSuperTypes_T11T00R0() throws JavaModelException
+    {
+        _focusType = _T11T00R0;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getTSuperTypes(_focusType);
+        IType[] expected = new IType[] { _T10T00R0 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    
+    public void testGetSuperclass_T11T00R0() throws JavaModelException
+    {
+        _focusType = _T11T00R0;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        boolean result = false;
+        try
+		{
+		        hierarchy.getSuperclass(_focusType);
+		}
+        catch(Exception exc)
+		{
+        	result = exc instanceof UnsupportedOperationException;
+		}
+        assertTrue(result);
+    }
+
+    
+	public void testGetAllSuperclasses_T11T00R0() throws JavaModelException
+    {
+        _focusType = _T11T00R0;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSuperclasses(_focusType);
+        IType[] expected = new IType[] { _objectType,
+                                         _T10T00R0,
+                                       };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    
+    public void testGetSuperInterfaces_T11T00R0() throws JavaModelException
+    {
+        _focusType = _T11T00R0;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSuperInterfaces(_focusType);
+        IType[] expected = new IType[0];
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    
+    
+    
+    
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest010.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest010.java
new file mode 100644
index 0000000..89761e9
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest010.java
@@ -0,0 +1,194 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest010.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSuperTypeHierarchyTest010.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OTSuperTypeHierarchyTest010 extends FileBasedHierarchyTest
+{
+    private IType _T1;
+    private IType _T2;
+    private IType _T3;
+    
+	private IType _T1_R1;
+	private IType _T2_R1;
+	private IType _T3_R1;
+
+    private IType _interfaceA;    
+	private IType _objectType;
+	
+	public OTSuperTypeHierarchyTest010(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest010.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest010.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test010";
+		
+        _T1 = getType(getTestProjectDir(), srcFolder, pkg, "T1");
+        _T2 = getType(getTestProjectDir(), srcFolder, pkg, "T2");
+        _T3 = getType(getTestProjectDir(), srcFolder, pkg, "T3");
+
+        _T1_R1 = getRole(_T1, "T1.R1");
+        _T2_R1 = getRole(_T2, "T2.R1");
+        _T3_R1 = getRole(_T3, "T3.R1");
+
+        _interfaceA = getType(getTestProjectDir(), srcFolder, pkg, "InterfaceA");
+        _objectType = getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+	}
+	
+    public void testCreation()
+    {
+        assertCreation(_T1);
+        assertCreation(_T2);
+        assertCreation(_T3);
+        assertCreation(_T1_R1);
+        assertCreation(_T2_R1);
+        assertCreation(_T3_R1);
+    }
+
+	public void testGetAllSuperclasses_T3R1() throws JavaModelException
+	{
+		_focusType = _T3_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+		IType[] expected = new IType[] { _objectType,
+								         _T2_R1,
+								         _T1_R1 };
+		IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+	public void testGetAllSuperclasses_T2R1() throws JavaModelException
+	{
+		_focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+
+		IType[] expected = new IType[] { _objectType,
+								         _T1_R1 };		
+		IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+	public void testGetAllSuperclasses_T1R1() throws JavaModelException
+	{
+		_focusType = _T1_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+		
+		IType[] expected = new IType[] { _objectType };		
+		IType [] actual = _testObj.getAllSuperclasses(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+
+	public void testGetAllTSuperTypesFor_T3_R1() throws JavaModelException
+	{
+		_focusType = _T3_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+		
+		IType[] expected = new IType[] { _T2_R1,
+		         						 _T1_R1 };		
+		IType [] actual = _testObj.getAllTSuperTypes(_focusType);
+        
+		assertEquals(expected.length, actual.length);		
+		assertTrue(compareTypes(expected, actual));
+	}
+	
+    public void testGetAllSuperinterfacesFor_T2_R1() throws JavaModelException
+    {
+        _focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _interfaceA };        
+        IType [] actual = _testObj.getAllSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSuperInterfacesFor_T2_R1() throws JavaModelException
+    {
+        _focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _interfaceA };        
+        IType [] actual = _testObj.getSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetAllSupertypesFor_T2_R1() throws JavaModelException
+    {
+        _focusType = _T2_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _objectType,
+        								 _T1_R1,
+										 _interfaceA };        
+        IType [] actual = _testObj.getAllSupertypes(_focusType);
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+    public void testGetSuperinterfacesFor_T3_R1() throws JavaModelException
+    {
+        _focusType = _T3_R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] expected = new IType[] { _interfaceA };        
+        IType [] actual = _testObj.getSuperInterfaces(_focusType);
+        
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest011.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest011.java
new file mode 100644
index 0000000..9f92028
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest011.java
@@ -0,0 +1,151 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest011.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.PhantomType;
+import org.eclipse.objectteams.otdt.tests.hierarchy.FileBasedHierarchyTest;
+
+/**
+ * 
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSuperTypeHierarchyTest011.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSuperTypeHierarchyTest011 extends FileBasedHierarchyTest
+{
+    
+    private IType _T10;
+    private IType _T21;    
+
+    private IType _T21T11T0R1;
+    private IType _phantom_T21T11T0R2;
+
+    private IType _T10T0R1;
+    private IType _T10T0R2;
+    
+	private IType _objectType;
+
+    public OTSuperTypeHierarchyTest011(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest011.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest011.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test011";
+		
+		_T10 = getType(getTestProjectDir(), srcFolder, pkg, "T10");
+
+        _T21 =  getType(getTestProjectDir(), srcFolder, pkg, "T21");
+                
+        _objectType =
+            getType(getTestProjectDir(), "rt.jar", "java.lang", "Object");
+
+        _T21T11T0R1 = getRole(_T21, "T21.T11.T0.R1");
+        _T10T0R1 = getRole(_T10, "T10.T0.R1");
+        _T10T0R2 = getRole(_T10, "T10.T0.R2");
+        _phantom_T21T11T0R2 = new PhantomType(_T21, _T10T0R2);
+    }
+    
+	public void testCreation()
+	{
+		assertCreation(_T10);
+        assertCreation(_T21);
+        assertCreation(_T21T11T0R1);
+        assertCreation(_phantom_T21T11T0R2);        
+        assertCreation(_T10T0R1);
+        assertCreation(_T10T0R2);
+    }
+
+    public void testGetTSuperTypes_T21T11T0R1() throws JavaModelException
+    {
+        _focusType = _T21T11T0R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+    
+        IType[] actual = _testObj.getTSuperTypes(_focusType);
+        IType[] expected = new IType[] { _T10T0R1 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetSuperclasses_T21T11T0R1() throws JavaModelException
+    {
+        _focusType = _T21T11T0R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+   
+        IType[] actual = _testObj.getSuperclasses(_focusType);
+        IType[] expected = new IType[] { _T10T0R1,
+                                         _T10T0R2 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+    public void testGetAllClasses_T21T11T0R1() throws JavaModelException
+    {
+        _focusType = _T21T11T0R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] actual = _testObj.getAllClasses();
+        IType[] expected = new IType[] { _T21T11T0R1,
+        								 _T10T0R1,
+										 _T10T0R2,
+										 _objectType };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+    public void testGetAllClasses_T10T0R1() throws JavaModelException
+    {
+        _focusType = _T10T0R1;
+        _testObj = createOTSuperTypeHierarchy(_focusType);
+        
+        IType[] actual = _testObj.getAllClasses();
+        IType[] expected = new IType[] { _T10T0R1,
+										 _T10T0R2,
+										 _objectType };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest013.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest013.java
new file mode 100644
index 0000000..9938385
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest013.java
@@ -0,0 +1,269 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest013.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+import org.eclipse.objectteams.otdt.core.TypeHelper;
+
+/**
+ * 
+ * @author Michael Krueger (mkr)
+ * @version $Id: OTSuperTypeHierarchyTest013.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSuperTypeHierarchyTest013 extends FileBasedModelTest
+{
+	
+	private IType _focusType;
+	private IType _objectType;
+    private IType _TA1;
+    private IType _TA2;    
+    private IType _TA1TB2TC2R1;
+	private IType _TA1TB2TC1R1;
+	private IType _TA1TB1TC2R1;
+	private IType _TA1TB1TC1R1;
+    private IType _TA2TB2TC2R1;
+    private IType _TA2TB2TC1R1;
+	private IType _TA2TB1TC2R1;
+	private IType _TA2TB1TC1R1;
+    private IType _C0;
+	private IType _C1;
+    private IType _C2;
+    private IType _C3;
+    
+	public OTSuperTypeHierarchyTest013(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest013.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest013.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test013";
+		
+		_TA1 = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"TA1");
+
+        _TA2 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "TA2");
+
+        _C0 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "C0");
+        
+        _C1 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "C1");
+
+        _C2 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "C2");
+        
+        _C3 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "C3");
+
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _TA1TB2TC2R1 = TypeHelper.findNestedRoleType(_TA1, "TA1.TB2.TC2.R1");
+        _TA1TB2TC1R1 = TypeHelper.findNestedRoleType(_TA1, "TA1.TB2.TC1.R1");
+        _TA1TB1TC2R1 = TypeHelper.findNestedRoleType(_TA1, "TA1.TB1.TC2.R1");
+        _TA1TB1TC1R1 = TypeHelper.findNestedRoleType(_TA1, "TA1.TB1.TC1.R1");
+
+        _TA2TB2TC2R1 = TypeHelper.findNestedRoleType(_TA2, "TA2.TB2.TC2.R1");
+        _TA2TB2TC1R1 = TypeHelper.findNestedRoleType(_TA2, "TA2.TB2.TC1.R1");
+        _TA2TB1TC2R1 = TypeHelper.findNestedRoleType(_TA2, "TA2.TB1.TC2.R1");
+        _TA2TB1TC1R1 = TypeHelper.findNestedRoleType(_TA2, "TA2.TB1.TC1.R1");
+
+    }
+
+    
+	public void testCreation()
+	{
+		assertCreation(_TA1);
+        assertCreation(_TA2);
+        assertCreation(_C0);
+        assertCreation(_C1);
+        assertCreation(_C2);
+        assertCreation(_C3);
+        
+        assertCreation(_TA2TB2TC2R1);
+        assertCreation(_TA2TB2TC1R1);
+        assertCreation(_TA2TB1TC2R1);
+        assertCreation(_TA2TB1TC1R1);
+        assertCreation(_TA1TB2TC2R1);
+        assertCreation(_TA1TB2TC1R1);
+        assertCreation(_TA1TB1TC2R1);
+        assertCreation(_TA1TB1TC1R1);
+	}
+    
+    
+    public void testGetTSuperTypes_TA2TB2TC2R1() throws JavaModelException
+    {
+        _focusType = _TA2TB2TC2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getTSuperTypes(_focusType);
+        IType[] expected = new IType[] {
+        								_TA2TB2TC1R1,
+										_TA2TB1TC2R1,
+										_TA1TB2TC2R1
+        								};
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+
+    public void testGetSuperclasses_TA2TB2TC2R1() throws JavaModelException
+    {
+        _focusType = _TA2TB2TC2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getSuperclasses(_focusType);
+        IType[] expected = new IType[] {
+        								_TA2TB2TC1R1,
+										_TA2TB1TC2R1,
+										_TA1TB2TC2R1,
+										_C1
+                                       };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetAllSuperclasses_TA2TB2TC2R1() throws JavaModelException
+    {
+        _focusType = _TA2TB2TC2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSuperclasses(_focusType);
+        IType[] expected = new IType[] {
+        								_TA1TB2TC2R1,
+										_TA1TB2TC1R1,
+										_TA1TB1TC2R1,
+										_TA1TB1TC1R1,										
+        								_TA2TB2TC1R1,
+										_TA2TB1TC2R1,
+										_TA2TB1TC1R1,
+										_C0,
+										_C1,
+										_C2,
+										_C3,
+										_objectType
+        								};
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetExplicitSuperclass_TA2TB2TC2R1() throws JavaModelException
+    {
+        _focusType = _TA2TB2TC2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_focusType);
+        IType expected = _C1;
+   
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    public void testGetAllClasses_TA2TB2TC2R1() throws JavaModelException
+    {
+        _focusType = _TA2TB2TC2R1;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllClasses();
+        IType[] expected = new IType[] {
+        								_TA1TB2TC2R1,
+										_TA1TB2TC1R1,
+										_TA1TB1TC2R1,
+										_TA1TB1TC1R1,
+        								_TA2TB2TC2R1,
+        								_TA2TB2TC1R1,
+										_TA2TB1TC2R1,
+										_TA2TB1TC1R1,
+										_C0,
+										_C1,
+										_C2,
+										_C3,
+										_objectType
+        								};
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest014.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest014.java
new file mode 100644
index 0000000..aa385e8
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest014.java
@@ -0,0 +1,162 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest014.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * 
+ * @author michael
+ * @version $Id: OTSuperTypeHierarchyTest014.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSuperTypeHierarchyTest014 extends FileBasedModelTest {
+	
+	private ITypeHierarchy _testObj;
+	private IType _focusType;
+    private IType _T1;
+    private IType _T1R1;
+    private IType _C1;    
+	@SuppressWarnings("unused")
+	private IType _javaLangObject;
+    private IType _I1;
+    private IType _I2;
+        
+    
+	public OTSuperTypeHierarchyTest014(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest014.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest014.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test014";
+		
+		_T1 = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"T1");
+
+        _C1 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "C1");
+        
+        _I1 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "I1");
+
+        _I2 = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "I2");
+
+        
+        _javaLangObject = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+        _T1R1 = getRole(_T1, "T1.R1");
+    }
+	
+	public void testCreation()
+	{
+		assertCreation(_T1);
+        assertCreation(_C1);
+        assertCreation(_T1R1);
+        assertCreation(_I1);
+        assertCreation(_I2);
+    }
+
+	
+	public void testGetAllSuperInterfaces_C1() throws JavaModelException
+    {
+        _focusType = _C1;
+        
+        _testObj = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);        
+        _testObj.refresh(new NullProgressMonitor());
+
+        IType[] actual = _testObj.getAllSuperInterfaces(_focusType);
+        IType[] expected = new IType[] { _I1, _I2 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+	public void testGetAllSuperInterfaces_T1R1() throws JavaModelException
+    {
+        _focusType = _T1R1;
+        
+        _testObj = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        _testObj.refresh(new NullProgressMonitor());
+
+        IType[] actual = _testObj.getAllSuperInterfaces(_focusType);
+        IType[] expected = new IType[] { _I1, _I2 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+	
+	public void testGetAllSuperInterfaces_I1() throws JavaModelException
+    {
+        _focusType = _I1;
+        
+        _testObj = new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        _testObj.refresh(new NullProgressMonitor());
+
+        IType[] actual = _testObj.getAllSuperInterfaces(_focusType);
+        IType[] expected = new IType[] { _I2 };
+   
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));
+    }
+
+	
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest015.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest015.java
new file mode 100644
index 0000000..5aa4063
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OTSuperTypeHierarchyTest015.java
@@ -0,0 +1,163 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTSuperTypeHierarchyTest015.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * 
+ * @author michael
+ * @version $Id: OTSuperTypeHierarchyTest015.java 23494 2010-02-05 23:06:44Z stephan $ 
+ * 
+ */
+public class OTSuperTypeHierarchyTest015 extends FileBasedModelTest {
+	
+	@SuppressWarnings("unused")
+	private ITypeHierarchy _testObj;
+	private IType _focusType;
+	private IType _objectType;
+
+    private IType _A;
+    private IType _B;
+    private IType _C;
+    
+    
+    
+	public OTSuperTypeHierarchyTest015(String name)
+	{
+		super(name);
+	}
+	
+	public static Test suite()
+	{
+		if (true)
+		{
+			return new Suite(OTSuperTypeHierarchyTest015.class);
+		}
+		junit.framework.TestSuite suite = 
+			new Suite(OTSuperTypeHierarchyTest015.class.getName());
+		return suite;
+	}
+	
+	public void setUpSuite() throws Exception
+	{
+		setTestProjectDir("Hierarchy");
+		super.setUpSuite();
+		
+		String srcFolder = "src";
+		String pkg = "test015";
+		
+		_A = 
+			getType(getTestProjectDir(),
+					srcFolder,
+					pkg,
+					"A");
+
+        _B = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "B");
+
+        
+        _C = 
+            getType(getTestProjectDir(),
+                    srcFolder,
+                    pkg,
+                    "C");
+
+        
+        _objectType = 
+            getType(getTestProjectDir(),
+                    "rt.jar",
+                    "java.lang",
+                    "Object");
+
+    }
+
+    
+	public void testCreation()
+	{
+		assertCreation(_A);
+        assertCreation(_B);
+        assertCreation(_C);
+    }
+
+    
+    public void testGetExplicitSuperclass_B() throws JavaModelException
+    {
+        _focusType = _B;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_focusType);
+        IType expected = _A;
+           
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    public void testGetExplicitSuperclass_C() throws JavaModelException
+    {
+        _focusType = _C;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType actual = hierarchy.getExplicitSuperclass(_focusType);
+        IType expected = _B;
+           
+        assertTrue(compareTypes(expected, actual));        
+    }
+    
+    public void testGetAllSuperclasses_C() throws JavaModelException
+    {
+        _focusType = _C;
+        
+        OTTypeHierarchy hierarchy =
+            new OTTypeHierarchy(_focusType, _focusType.getJavaProject(), false);
+        hierarchy.refresh(new NullProgressMonitor());
+
+        IType[] actual = hierarchy.getAllSuperclasses(_focusType);
+        IType[] expected = new IType[] { _A, _B, _objectType };
+
+        assertEquals(expected.length, actual.length);        
+        assertTrue(compareTypes(expected, actual));        
+    }
+
+    
+    
+    
+    
+    
+    
+    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OrdinaryClassesHierarchyWithSubRolesTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OrdinaryClassesHierarchyWithSubRolesTest.java
new file mode 100644
index 0000000..7877900
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OrdinaryClassesHierarchyWithSubRolesTest.java
@@ -0,0 +1,220 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OrdinaryClassesHierarchyWithSubRolesTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import java.util.ArrayList;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.IRoleType;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * @author kaschja
+ * @version $Id: OrdinaryClassesHierarchyWithSubRolesTest.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+/*
+ * The testdata setting looks like this:
+ *                                                                              
+ * SuperSuperTeam
+ *             R1                                             SuperClass
+ *      /\                                                       /\
+ *       |                                                        |
+ *   SuperTeam                                                    |
+ *          R1------------------------------------------------> AClass
+ *      /\                      explicit inheritance             /\
+ *       |                      ~~~~~~~~~~~~~~~~~~~~              |'''''''''''''''''|
+ *     ATeam                                                      |                 |
+ *        R1                                                  SubClass1         SubClass2
+ *      /\                                                       /\                /\
+ *       |'''''''''''''''''''|                |''''''''''''|'''''''''''''|          |
+ *    SubTeam1            SubTeam2            |            |             |          |
+ *          R1                  R1------------------>SubSubClass11 SubSubClass12    |
+ *      /\                                    |                                     | 
+ *       |'''''''''''|                        |                                     |
+ * SubSubTeam11  SubSubTeam12                 |                                     |
+ *           R1            R1-----------------|                                     |
+ *            |                                                                     |
+ *            |---------------------------------------------------------------------|
+ * 
+ * The focus type is SuperClass .
+ */
+public class OrdinaryClassesHierarchyWithSubRolesTest extends FileBasedModelTest
+{
+    private ITypeHierarchy _testObj;
+    
+    private IRoleType _aRole;
+    private IRoleType _implSuperRole;
+    @SuppressWarnings("unused")
+	private IRoleType _implSuperSuperRole;
+    private IRoleType _implSubRole1;
+    private IRoleType _implSubRole2;
+    private IRoleType _implSubSubRole11;
+    private IRoleType _implSubSubRole12;
+    private IType     _aClass;
+    private IType     _superClass;
+    private IType     _subClass1;
+    private IType     _subClass2;
+    private IType     _subSubClass11;
+    private IType     _subSubClass12;
+    
+    
+    public OrdinaryClassesHierarchyWithSubRolesTest(String name)
+    {
+        super(name);
+    }
+    
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(OrdinaryClassesHierarchyWithSubRolesTest.class);
+        }
+        junit.framework.TestSuite suite = 
+            new Suite(OrdinaryClassesHierarchyWithSubRolesTest.class.getName());
+        return suite;
+    }
+    
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("Hierarchy");
+        super.setUpSuite();
+        
+        _aRole = 
+            getRole(getTestProjectDir(),
+                "complete_rolehierarchy_with_classes",
+                "test002.inlined",
+                "ATeam",
+                "R1");
+        
+        _implSuperRole = 
+            getRole(getTestProjectDir(),
+                "complete_rolehierarchy_with_classes",
+                "test002.inlined",
+                "SuperTeam",
+                "R1");
+        
+        _implSuperSuperRole = 
+            getRole(getTestProjectDir(),
+                "complete_rolehierarchy_with_classes",
+                "test002.inlined",
+                "SuperTeam",
+                "R1");
+        
+        _implSubRole1 = 
+            getRole(getTestProjectDir(),
+                    "complete_rolehierarchy_with_classes",
+                    "test002.inlined",
+                    "SubTeam1",
+                    "R1");
+        
+        _implSubRole2 = 
+            getRole(getTestProjectDir(),
+                    "complete_rolehierarchy_with_classes",
+                    "test002.inlined",
+                    "SubTeam2",
+                    "R1");
+        
+        _implSubSubRole11 =
+            getRole(getTestProjectDir(),
+                    "complete_rolehierarchy_with_classes",
+                    "test002.inlined",
+                    "SubSubTeam11",
+                    "R1");
+        
+        _implSubSubRole12 =
+            getRole(getTestProjectDir(),
+                    "complete_rolehierarchy_with_classes",
+                    "test002.inlined",
+                    "SubSubTeam12",
+                    "R1");
+        
+        _aClass =
+            getType(getTestProjectDir(), 
+                "complete_rolehierarchy_with_classes", 
+                "test002.standard", 
+                "AClass");
+        
+        _superClass =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SuperClass");
+        
+        _subClass1 =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SubClass1");
+        
+        _subClass2 =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SubClass2");
+        
+        _subSubClass11 =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SubSubClass11");
+        
+        _subSubClass12 =
+            getType(getTestProjectDir(), 
+                    "complete_rolehierarchy_with_classes", 
+                    "test002.standard", 
+                    "SubSubClass12");
+        
+    }
+    
+    public void testGetAllSubtypes_ofSuperClass() throws JavaModelException
+    {
+        assertNotNull(_superClass);
+        assertTrue(_superClass.exists());
+        _testObj = new OTTypeHierarchy(_superClass, _superClass.getJavaProject(), true);
+        _testObj.refresh(new NullProgressMonitor());
+        
+        ArrayList<IType> expectedList = new ArrayList<IType>();
+        expectedList.add(_aClass);
+        expectedList.add(_subClass1);
+        expectedList.add(_subClass2);
+        expectedList.add(_subSubClass11);
+        expectedList.add(_subSubClass12);
+        
+        expectedList.add(_implSuperRole);
+        expectedList.add(_aRole);
+        expectedList.add(_implSubRole1);        
+        expectedList.add(_implSubRole2);
+        expectedList.add(_implSubSubRole11);
+        expectedList.add(_implSubSubRole12);
+        IType[] expected = expectedList.toArray(new IType[expectedList.size()]);
+        IType[] actual = _testObj.getAllSubtypes(_superClass);
+        
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OrdinaryInterfaceHierarchyTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OrdinaryInterfaceHierarchyTests.java
new file mode 100644
index 0000000..5f0ffbd
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/hierarchy/org/eclipse/objectteams/otdt/tests/superhierarchy/OrdinaryInterfaceHierarchyTests.java
@@ -0,0 +1,268 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OrdinaryInterfaceHierarchyTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.superhierarchy;
+
+import junit.framework.Test;
+
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeHierarchy;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.internal.core.OTTypeHierarchy;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * @author kaschja
+ * @version $Id: OrdinaryInterfaceHierarchyTests.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class OrdinaryInterfaceHierarchyTests extends FileBasedModelTest
+{
+    private ITypeHierarchy _testObject;
+    
+    private IType _superSuperInterface;
+    private IType _superInterface1;
+    private IType _superInterface2;
+    private IType _focusInterface;
+    private IType _subInterface;
+    private IType _subSubInterface1;
+    private IType _subSubInterface2;
+
+    private IType _javaLangObject;
+    
+    
+    public OrdinaryInterfaceHierarchyTests(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(OrdinaryInterfaceHierarchyTests.class);
+        }
+        junit.framework.TestSuite suite = new Suite(OrdinaryInterfaceHierarchyTests.class.getName());
+        return suite;
+    }
+    
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("Hierarchy");
+        super.setUpSuite();
+        _focusInterface = 
+            getType(getTestProjectDir(),
+                "src",
+                "standard.interface_hierarchy",
+                "AnInterface");
+        
+        _testObject = new OTTypeHierarchy(_focusInterface, _focusInterface.getJavaProject(), true);
+        _testObject.refresh(new NullProgressMonitor());
+        
+        _javaLangObject = getJavaLangObject(_focusInterface.getJavaProject());
+        
+        _superSuperInterface =
+            getType(getTestProjectDir(),
+                    "src",
+                    "standard.interface_hierarchy",
+                    "SuperSuperInterface");
+        _superInterface1 =
+            getType(getTestProjectDir(),
+                    "src",
+                    "standard.interface_hierarchy",
+                    "SuperInterface1");
+        _superInterface2 =
+            getType(getTestProjectDir(),
+                    "src",
+                    "standard.interface_hierarchy",
+                    "SuperInterface2");
+        _subInterface =
+            getType(getTestProjectDir(),
+                    "src",
+                    "standard.interface_hierarchy",
+                    "SubInterface");
+        _subSubInterface1 =
+            getType(getTestProjectDir(),
+                    "src",
+                    "standard.interface_hierarchy",
+                    "SubSubInterface1");
+        _subSubInterface2 =
+            getType(getTestProjectDir(),
+                    "src",
+                    "standard.interface_hierarchy",
+                    "SubSubInterface2");
+        
+    }
+ 
+    public void testExistence_SuperSuperInterface()
+    	throws JavaModelException
+	{
+	    assertNotNull(_superSuperInterface);
+	    assertTrue(_superSuperInterface.exists());
+	}
+
+    public void testExistence_SuperInterface1()
+    	throws JavaModelException
+	{
+	    assertNotNull(_superInterface1);
+	    assertTrue(_superInterface1.exists());
+	}
+
+    public void testExistence_SuperInterface2()
+    	throws JavaModelException
+	{
+	    assertNotNull(_superInterface2);
+	    assertTrue(_superInterface2.exists());
+	}
+
+    public void testExistence_FocusInterface()
+    	throws JavaModelException
+	{
+	    assertNotNull(_focusInterface);
+	    assertTrue(_focusInterface.exists());
+	}
+
+    public void testExistence_SubInterface()
+    	throws JavaModelException
+	{
+	    assertNotNull(_subInterface);
+	    assertTrue(_subInterface.exists());
+	}
+
+    public void testExistence_SubSubInterface1()
+    	throws JavaModelException
+	{
+	    assertNotNull(_subSubInterface1);
+	    assertTrue(_subSubInterface1.exists());
+	}
+
+    public void testExistence_SubSubInterface2()
+    	throws JavaModelException
+	{
+	    assertNotNull(_subSubInterface2);
+	    assertTrue(_subSubInterface2.exists());
+	}
+    
+    
+    public void testGetAllTypes()
+    		throws JavaModelException
+	{
+	    IType[] expected = new IType[]{
+	            _javaLangObject,
+	            _superSuperInterface,
+	            _superInterface1,
+	            _superInterface2,
+	            _focusInterface,
+	            _subInterface,
+	            _subSubInterface1,
+	            _subSubInterface2};
+	    IType[] actual = _testObject.getAllTypes();
+	    
+	    assertEquals(expected.length, actual.length);
+	    assertTrue(compareTypes(expected, actual));
+	}
+    
+    public void testGetAllClasses()
+		throws JavaModelException
+	{
+	    IType[] expected = new IType[] { _javaLangObject };
+	    IType[] actual = _testObject.getAllClasses();
+	    
+	    assertEquals(expected.length, actual.length);
+	    assertTrue(compareTypes(expected, actual));
+	}
+    
+    public void testGetSuperclass_ofFocusInterface()
+    {
+        assertNull("Interfaces have no superclass", _testObject.getSuperclass(_focusInterface));
+    }
+    
+    public void testGetSubclass_ofFocusInterface()
+    {
+        IType[] actual = _testObject.getSubclasses(_focusInterface);
+        IType[] expected = new IType[] {};
+
+        assertTrue(compareTypes(expected, actual));       
+    }
+    
+    public void testGetSubtypes_ofFocusInterface()
+    {
+        IType[] expected = new IType[]{_subInterface};
+        IType[] actual = _testObject.getSubtypes(_focusInterface);
+        
+        assertEquals(expected.length, actual.length);
+        assertTrue(compareTypes(expected, actual));
+    }
+    
+    public void testGetRootInterfaces()
+    {
+        IType[] actual = _testObject.getRootInterfaces();
+        IType[] expected = new IType[] { _superInterface2, _superSuperInterface } ;
+        
+        assertTrue(compareTypes(expected, actual));       
+    }
+    
+    public void testGetAllInterfaces_SevenInterfaces()
+		throws JavaModelException
+	{
+		IType[] expected = new IType[]{
+		        _superSuperInterface,
+		        _superInterface1,
+		        _superInterface2,
+		        _focusInterface,
+		        _subInterface,
+		        _subSubInterface1,
+		        _subSubInterface2};
+		IType[] actual = _testObject.getAllInterfaces();
+		
+		assertEquals(expected.length, actual.length);
+		assertTrue(compareTypes(expected, actual));
+	}
+    
+    public void testGetAllSuperInterfaces_FiveParents()
+		throws JavaModelException
+	{
+		IType[] expected = new IType[]{
+		        _superSuperInterface,
+		        _superInterface1,
+		        _superInterface2,
+		        _focusInterface,
+		        _subInterface };
+		IType[] actual = _testObject.getAllSuperInterfaces(_subSubInterface1);
+		
+		assertEquals(expected.length, actual.length);
+		assertTrue(compareTypes(expected, actual));
+	}
+    
+    public void testGetExtendingInterfaces_OneChild()
+		throws JavaModelException
+	{
+		IType[] expected = new IType[]{ _superInterface1 };
+		IType[] actual = _testObject.getExtendingInterfaces(_superSuperInterface);
+		
+		assertEquals(expected.length, actual.length);
+		assertTrue(compareTypes(expected, actual));
+	}    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/AbstractJavaModelCompletionTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/AbstractJavaModelCompletionTests.java
new file mode 100644
index 0000000..330a79c
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/AbstractJavaModelCompletionTests.java
@@ -0,0 +1,203 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * 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
+ * $Id: AbstractJavaModelCompletionTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Fraunhofer FIRST - extended API and implementation
+ *     Technical University Berlin - extended API and implementation
+ *******************************************************************************/
+package org.eclipse.objectteams.otdt.tests.model;
+
+import java.io.IOException;
+import java.util.Hashtable;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.*;
+import org.eclipse.jdt.internal.codeassist.RelevanceConstants;
+import org.eclipse.objectteams.otdt.tests.AbstractJavaModelTests;
+
+import junit.framework.*;
+
+//{ObjectTeams: OT_COPY_PASTE verbatim (from org.eclipse.jdt.core.tests.model)
+                // need to find the correct enclosing project!
+public abstract class AbstractJavaModelCompletionTests extends AbstractJavaModelTests implements RelevanceConstants {
+	public static List COMPLETION_SUITES = null;
+	protected static IJavaProject COMPLETION_PROJECT;
+	protected class CompletionResult {
+		public String proposals;
+		public String context;
+		public int cursorLocation;
+		public int tokenStart;
+		public int tokenEnd;
+	}
+	Hashtable oldOptions;
+	ICompilationUnit wc = null;
+public AbstractJavaModelCompletionTests(String name) {
+	super(name);
+}
+protected void addLibrary(String projectName, String jarName, String sourceZipName, String docZipName, boolean exported) throws JavaModelException {
+	IJavaProject javaProject = getJavaProject(projectName);
+	IProject project = javaProject.getProject();
+	String projectPath = '/' + project.getName() + '/';
+	
+	IClasspathAttribute[] extraAttributes;
+	if(docZipName == null) {
+		extraAttributes = new IClasspathAttribute[0];
+	} else {
+		extraAttributes =
+			new IClasspathAttribute[]{
+				JavaCore.newClasspathAttribute(
+						IClasspathAttribute.JAVADOC_LOCATION_ATTRIBUTE_NAME,
+						"jar:platform:/resource"+projectPath+docZipName+"!/")};
+	}
+	
+	addLibraryEntry(
+			javaProject,
+			new Path(projectPath + jarName),
+			sourceZipName == null ? null : new Path(projectPath + sourceZipName),
+			sourceZipName == null ? null : new Path(""),
+			null,
+			null,
+			extraAttributes,
+			exported);
+} 
+protected void removeLibrary(String projectName, String jarName) throws CoreException, IOException {
+	IJavaProject javaProject = getJavaProject(projectName);		
+	IProject project = javaProject.getProject();
+	String projectPath = '/' + project.getName() + '/';
+	removeClasspathEntry(javaProject, new Path(projectPath + jarName));
+}
+public ICompilationUnit getWorkingCopy(String path, String source) throws JavaModelException {
+	return super.getWorkingCopy(path, source, this.wcOwner);
+}
+protected CompletionResult complete(String path, String source, String completeBehind) throws JavaModelException {
+	return this.complete(path, source, false, completeBehind);
+}
+protected CompletionResult complete(String path, String source, boolean showPositions, String completeBehind) throws JavaModelException {
+	return this.complete(path,source,showPositions, completeBehind, null, null);
+}
+protected CompletionResult complete(String path, String source, boolean showPositions, String completeBehind, String tokenStartBehind, String token) throws JavaModelException {
+	this.wc = getWorkingCopy(path, source);
+
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, showPositions);
+	String str = this.wc.getSource();
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	int tokenStart = -1;
+	int tokenEnd = -1;
+	if(tokenStartBehind != null && token != null) {
+		tokenStart = str.lastIndexOf(tokenStartBehind) + tokenStartBehind.length();
+		tokenEnd = tokenStart + token.length() - 1;
+	}
+	this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+	
+	CompletionResult result =  new CompletionResult();
+	result.proposals = requestor.getResults();
+	result.context = requestor.getContext();
+	result.cursorLocation = cursorLocation;
+	result.tokenStart = tokenStart;
+	result.tokenEnd = tokenEnd;
+	return result;
+}
+protected CompletionResult contextComplete(ICompilationUnit cu, int cursorLocation) throws JavaModelException {
+	return contextComplete0(cu, cursorLocation, false, false, false, null);
+}
+protected CompletionResult contextComplete(
+		ICompilationUnit cu,
+		int cursorLocation,
+		boolean computeEnclosingElement,
+		boolean computeVisibleElements) throws JavaModelException {
+	return contextComplete0(cu, cursorLocation, true, computeEnclosingElement, computeVisibleElements, null);
+}
+protected CompletionResult contextComplete(
+		ICompilationUnit cu,
+		int cursorLocation,
+		boolean computeEnclosingElement,
+		boolean computeVisibleElements,
+		String typeSignature) throws JavaModelException {
+	return contextComplete0(cu, cursorLocation, true, computeEnclosingElement, computeVisibleElements, typeSignature);
+}
+protected CompletionResult contextComplete0(
+		ICompilationUnit cu,
+		int cursorLocation,
+		boolean useExtendedContext,
+		boolean computeEnclosingElement,
+		boolean computeVisibleElements,
+		String typeSignature) throws JavaModelException {
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, false, false);
+	requestor.setRequireExtendedContext(useExtendedContext);
+	requestor.setComputeEnclosingElement(computeEnclosingElement);
+	requestor.setComputeVisibleElements(computeVisibleElements);
+	requestor.setAssignableType(typeSignature);
+	
+	cu.codeComplete(cursorLocation, requestor, this.wcOwner);
+	
+	CompletionResult result =  new CompletionResult();
+	result.proposals = requestor.getResults();
+	result.context = requestor.getContext();
+	result.cursorLocation = cursorLocation;
+	return result;
+}
+protected CompletionResult snippetContextComplete(
+		IType type,
+		String snippet,
+		int insertion,
+		int cursorLocation,
+		boolean isStatic) throws JavaModelException {
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true, false, false, false);
+	type.codeComplete(snippet.toCharArray(), insertion, cursorLocation, null, null, null, isStatic, requestor, this.wcOwner);
+	
+	CompletionResult result =  new CompletionResult();
+	result.proposals = requestor.getResults();
+	result.context = requestor.getContext();
+	result.cursorLocation = cursorLocation;
+	return result;
+}
+public void setUpSuite() throws Exception {
+	super.setUpSuite();
+	this.oldOptions = JavaCore.getOptions();
+	waitUntilIndexesReady();
+}
+protected void setUp() throws Exception {
+	super.setUp();
+	this.wcOwner = new WorkingCopyOwner(){};
+}
+public void tearDownSuite() throws Exception {
+	JavaCore.setOptions(this.oldOptions);
+	this.oldOptions = null;
+	if (COMPLETION_SUITES == null) {
+		deleteProject("Completion");
+	} else {
+		COMPLETION_SUITES.remove(getClass());
+		if (COMPLETION_SUITES.size() == 0) {
+			deleteProject("Completion");
+			COMPLETION_SUITES = null;
+		}
+	}
+	super.tearDownSuite();
+}
+protected void tearDown() throws Exception {
+	if(this.wc != null) {
+		this.wc.discardWorkingCopy();
+		this.wc = null;
+	}
+	super.tearDown();
+}
+protected void assertResults(String expected, String actual) {
+	try {
+		assertEquals(expected, actual);
+	} catch(ComparisonFailure c) {
+		System.out.println(actual);
+		System.out.println();
+		throw c;
+	}
+}
+}
+//SH}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/AllTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/AllTests.java
new file mode 100644
index 0000000..cff02b3
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/AllTests.java
@@ -0,0 +1,86 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.model;
+
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+
+/**
+ * Test-suite for OT-adaptations/extensions of org.eclipse.jdt.core.tests.model
+ * 
+ * @author stephan
+ * @version $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class AllTests extends TestCase
+{
+    public AllTests(String name) 
+    {
+        super(name);
+    }
+
+    public static Class[] getAllTestClasses()
+    {
+        return new Class[]
+        {
+            org.eclipse.objectteams.otdt.tests.model.OTCompletionTests.class,
+        };
+    }
+
+    public static Test suite()
+    {
+        TestSuite ts = new TestSuite("All OT Tests for model");
+
+        Class<?>[] testClasses = getAllTestClasses();
+
+        for (int idx = 0; idx < testClasses.length; idx++)
+        {
+            Class<?> testClass = testClasses[idx];
+
+            // call the suite() method and add the resulting suite to the suite
+            try
+            {
+                Method suiteMethod = testClass.getDeclaredMethod(
+                    "suite", new Class<?>[0]); //$NON-NLS-1$
+                Test suite = (Test) suiteMethod.invoke(null, new Object[0]);
+                ts.addTest(suite);
+            }
+            catch (IllegalAccessException ex)
+            {
+                ex.printStackTrace();
+            }
+            catch (InvocationTargetException ex)
+            {
+                ex.getTargetException().printStackTrace();
+            }
+            catch (NoSuchMethodException ex)
+            {
+                ex.printStackTrace();
+            }
+        }
+        return ts;
+    }
+}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/CompletionTestsRequestor2.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/CompletionTestsRequestor2.java
new file mode 100644
index 0000000..3648e0c
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/CompletionTestsRequestor2.java
@@ -0,0 +1,613 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2010 IBM Corporation and others.
+ * 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
+ * $Id: CompletionTestsRequestor2.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *     Fraunhofer FIRST - extended API and implementation
+ *     Technical University Berlin - extended API and implementation
+ *******************************************************************************/
+package org.eclipse.objectteams.otdt.tests.model;
+
+import java.util.Arrays;
+import java.util.Comparator;
+
+import org.eclipse.jdt.core.CompletionContext;
+import org.eclipse.jdt.core.CompletionProposal;
+import org.eclipse.jdt.core.CompletionRequestor;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.core.JavaElement;
+
+// OT_COPY_PASTE with modifications (SH)
+public class CompletionTestsRequestor2 extends CompletionRequestor {
+	private final char[] NULL_LITERAL = "null".toCharArray();//$NON-NLS-1$
+	
+	private CompletionContext context;
+	public int proposalsPtr = -1;
+	private final static int PROPOSALS_INCREMENT = 10;
+	private CompletionProposal[] proposals = new CompletionProposal[PROPOSALS_INCREMENT];
+	private IProblem problem;
+	
+	private boolean showParameterNames;
+	private boolean showUniqueKeys;
+	private boolean showPositions;
+	private boolean showTokenPositions;
+	private boolean shortContext;
+	private boolean showMissingTypes;
+	
+	private boolean computeVisibleElements;
+	private boolean computeEnclosingElement;
+	private String assignableType;
+	
+	public boolean fDebug = false;
+
+	public CompletionTestsRequestor2() {
+		this(false, false);
+	}
+	public CompletionTestsRequestor2(boolean showParamNames) {
+		this(showParamNames, false, false);
+	}
+	public CompletionTestsRequestor2(boolean showParamNames, boolean showUniqueKeys) {
+		this(showParamNames, showUniqueKeys, false);
+	}
+	public CompletionTestsRequestor2(boolean showParamNames, boolean showUniqueKeys, boolean showPositions) {
+		this(showParamNames, showUniqueKeys, showPositions, true, false);
+	}
+	
+	public CompletionTestsRequestor2(boolean showParamNames, boolean showUniqueKeys, boolean showPositions, boolean shortContext) {
+		this(showParamNames, showUniqueKeys, showPositions, shortContext, false);
+	}
+	public CompletionTestsRequestor2(boolean showParamNames, boolean showUniqueKeys, boolean showPositions, boolean shortContext, boolean showMissingTypes) {
+		this(showParamNames, showUniqueKeys, showPositions, shortContext, showMissingTypes, false);
+	}
+	public CompletionTestsRequestor2(boolean showParamNames, boolean showUniqueKeys, boolean showPositions, boolean shortContext, boolean showMissingTypes, boolean showTokenPositions) {
+		this(false, showParamNames, showUniqueKeys, showPositions, shortContext, showMissingTypes, showTokenPositions);
+	}
+	public CompletionTestsRequestor2(boolean ignoreAll, boolean showParamNames, boolean showUniqueKeys, boolean showPositions, boolean shortContext, boolean showMissingTypes, boolean showTokenPositions) {
+		super(ignoreAll);
+		this.showParameterNames = showParamNames;
+		this.showUniqueKeys = showUniqueKeys;
+		this.showPositions = showPositions;
+		this.showTokenPositions =  showTokenPositions;
+		this.shortContext = shortContext;
+		this.showMissingTypes = showMissingTypes;
+		
+	}
+	public void acceptContext(CompletionContext cc) {
+		this.context = cc;
+	}
+	public void accept(CompletionProposal proposal) {
+		int length = this.proposals.length;
+		if (++this.proposalsPtr== length) {
+			System.arraycopy(this.proposals, 0, this.proposals = new CompletionProposal[length+PROPOSALS_INCREMENT], 0, length);
+		}
+		this.proposals[this.proposalsPtr] = proposal;
+	}
+	
+	public void allowAllRequiredProposals() {
+		for (int i = CompletionProposal.ANONYMOUS_CLASS_DECLARATION; i <= CompletionProposal.TYPE_IMPORT; i++) {
+			for (int j = CompletionProposal.ANONYMOUS_CLASS_DECLARATION; j <= CompletionProposal.FIELD_REF_WITH_CASTED_RECEIVER; j++) {
+				this.setAllowsRequiredProposals(i, j, true);
+			}
+		}
+	}
+
+	public void completionFailure(IProblem p) {
+		this.problem = p;
+	}
+	
+	public String getContext() {
+		if(this.context == null) return "";
+		
+		StringBuffer buffer = new StringBuffer();
+		
+		if(!this.shortContext) {
+			buffer.append("completion offset=");
+			buffer.append(context.getOffset());
+			buffer.append('\n');
+			
+			buffer.append("completion range=[");
+			buffer.append(context.getTokenStart());
+			buffer.append(", ");
+			buffer.append(context.getTokenEnd());
+			buffer.append("]\n");
+			
+			char[] token = context.getToken();
+			buffer.append("completion token=");
+			if(token == null) {
+				buffer.append("null");
+			} else {
+				buffer.append('\"');
+				buffer.append(token);
+				buffer.append('\"');
+			}
+			buffer.append('\n');
+			
+			buffer.append("completion token kind=");
+			int tokenKind = context.getTokenKind();
+			if(tokenKind == CompletionContext.TOKEN_KIND_STRING_LITERAL) {
+				buffer.append("TOKEN_KIND_STRING_LITERAL");
+			} else if(tokenKind == CompletionContext.TOKEN_KIND_NAME) {
+				buffer.append("TOKEN_KIND_NAME");
+			} else {
+				buffer.append("TOKEN_KIND_UNKNOWN");
+			}
+			buffer.append('\n');
+		}
+		char[][] expectedTypesSignatures = this.context.getExpectedTypesSignatures();
+		buffer.append("expectedTypesSignatures=");
+		if(expectedTypesSignatures == null) {
+			buffer.append(NULL_LITERAL);
+		} else {
+			buffer.append('{');
+			for (int i = 0; i < expectedTypesSignatures.length; i++) {
+				if(i > 0) buffer.append(',');
+				buffer.append(expectedTypesSignatures[i]);
+				
+			}
+			buffer.append('}');
+		}
+		buffer.append('\n');
+		
+		char[][] expectedTypesKeys = this.context.getExpectedTypesKeys();
+		buffer.append("expectedTypesKeys=");
+		if(expectedTypesSignatures == null) {
+			buffer.append(NULL_LITERAL);
+		} else {
+			buffer.append('{');
+			for (int i = 0; i < expectedTypesKeys.length; i++) {
+				if(i > 0) buffer.append(',');
+				buffer.append(expectedTypesKeys[i]);
+				
+			}
+			buffer.append('}');
+		}
+		
+		if(!this.shortContext) {
+			buffer.append('\n');
+			
+			int locationType = this.context.getTokenLocation();
+			if (locationType == 0) {
+				buffer.append("completion token location=UNKNOWN"); //$NON-NLS-1$
+			} else {
+				buffer.append("completion token location={"); //$NON-NLS-1$
+				boolean first = true;
+				if ((locationType & CompletionContext.TL_MEMBER_START) != 0) {
+					if (!first) buffer.append(',');
+					buffer.append("MEMBER_START"); //$NON-NLS-1$
+					first = false;
+				}
+				if ((locationType & CompletionContext.TL_STATEMENT_START) != 0) {
+					if (!first) buffer.append(',');
+					buffer.append("STATEMENT_START"); //$NON-NLS-1$
+					first = false;
+				}
+				buffer.append('}');
+			}
+		}
+		
+		if (this.computeEnclosingElement) {
+			buffer.append('\n');
+			buffer.append("enclosingElement="); //$NON-NLS-1$
+			JavaElement enclosingElement = (JavaElement)this.context.getEnclosingElement();
+			if (enclosingElement == null) {
+				buffer.append("null"); //$NON-NLS-1$
+			} else {
+				buffer.append(enclosingElement.toStringWithAncestors(true /*show resolved info*/));
+			}
+		}
+		
+		if (this.computeVisibleElements) {
+			buffer.append('\n');
+			
+			IJavaElement[] visibleElements = this.context.getVisibleElements(this.assignableType);
+			buffer.append("visibleElements="); //$NON-NLS-1$
+			if (visibleElements == null) {
+				buffer.append("null"); //$NON-NLS-1$
+			} else if (visibleElements.length == 0) {
+				buffer.append("{}"); //$NON-NLS-1$
+			} else {
+				buffer.append('{');
+				buffer.append('\n');
+				for (int i = 0; i < visibleElements.length; i++) {
+					JavaElement element = (JavaElement) visibleElements[i];
+					buffer.append('\t');
+					buffer.append(element.toStringWithAncestors(true /*show resolved info*/));
+					buffer.append(",\n"); //$NON-NLS-1$
+				}
+				buffer.append('}');
+			}
+		}
+		
+		//buffer.append('\n');
+		
+		
+		return buffer.toString();
+	}
+	public String getProblem() {
+		return this.problem == null ? "" : this.problem.getMessage();
+	}
+
+	/*
+	 * Get sorted results in ascending order
+	 */
+	public String getResults() {
+		if(this.proposalsPtr < 0) return "";
+		quickSort(this.proposals, 0, this.proposalsPtr);
+		return getResultsWithoutSorting();
+	}
+
+	/*
+	 * Get sorted results in ascending order
+	 */
+	@SuppressWarnings("unchecked")
+	public String getReversedResults() {
+		if(this.proposalsPtr < 0) return "";
+		Arrays.sort(this.proposals, new Comparator() {
+			public int compare(Object o1, Object o2) {
+				if (o1 == o2) 
+					return 0;
+				if (o1 == null)
+					return 1;
+				if (o2 == null)
+					return -1;
+				CompletionProposal p1 = (CompletionProposal) o1;
+				CompletionProposal p2 = (CompletionProposal) o2;
+				int relDif = p2.getRelevance() - p1.getRelevance();
+				if(relDif != 0) return relDif;
+				String name1 = getElementName(p1);
+				String name2 = getElementName(p2);
+				return name1.compareTo(name2);
+			}
+		});
+		return getResultsWithoutSorting();
+	}
+	
+	/*
+	 * Get unsorted results (ie. same order as they were accepted by requestor)
+	 */
+	public String getResultsWithoutSorting() {
+		if(this.proposalsPtr < 0) return "";
+		StringBuffer buffer = printProposal(this.proposals[0]);
+		for(int i = 1; i <=this.proposalsPtr; i++) {
+			if(i > 0) buffer.append('\n');
+			buffer.append(printProposal(this.proposals[i]));
+		}
+		return buffer.toString();
+	}
+	public String[] getStringsResult() {
+		if(this.proposalsPtr < 0) {
+			return new String[0];
+		}
+		String[] strings = new String[this.proposalsPtr+1];
+		for (int i=0; i<=this.proposalsPtr; i++) {
+			strings[i] =  printProposal(this.proposals[i]).toString();
+		}
+		return strings;
+	}
+
+	protected StringBuffer printProposal(CompletionProposal proposal) {
+		StringBuffer buffer = new StringBuffer();
+		return printProposal(proposal, 0, buffer);
+	}
+	
+	protected StringBuffer printProposal(CompletionProposal proposal, int tab, StringBuffer buffer) {
+		for (int i = 0; i < tab; i++) {
+			buffer.append("   "); //$NON-NLS-1$
+		}
+		buffer.append(getElementName(proposal));
+		buffer.append('[');
+		switch(proposal.getKind()) {
+			case CompletionProposal.ANONYMOUS_CLASS_DECLARATION :
+				buffer.append("ANONYMOUS_CLASS_DECLARATION"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.FIELD_REF :
+				buffer.append("FIELD_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.FIELD_REF_WITH_CASTED_RECEIVER :
+				buffer.append("FIELD_REF_WITH_CASTED_RECEIVER"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.KEYWORD :
+				buffer.append("KEYWORD"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.LABEL_REF :
+				buffer.append("LABEL_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.LOCAL_VARIABLE_REF :
+				buffer.append("LOCAL_VARIABLE_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.METHOD_DECLARATION :
+				buffer.append("METHOD_DECLARATION"); //$NON-NLS-1$
+				if(proposal.isConstructor()) {
+					buffer.append("<CONSTRUCTOR>"); //$NON-NLS-1$
+				}
+				break;
+			case CompletionProposal.METHOD_REF :
+				buffer.append("METHOD_REF"); //$NON-NLS-1$
+				if(proposal.isConstructor()) {
+					buffer.append("<CONSTRUCTOR>"); //$NON-NLS-1$
+				}
+				break;
+			case CompletionProposal.METHOD_REF_WITH_CASTED_RECEIVER :
+				buffer.append("METHOD_REF_WITH_CASTED_RECEIVER"); //$NON-NLS-1$
+				if(proposal.isConstructor()) {
+					buffer.append("<CONSTRUCTOR>"); //$NON-NLS-1$
+				}
+				break;
+			case CompletionProposal.PACKAGE_REF :
+				buffer.append("PACKAGE_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.TYPE_REF :
+				buffer.append("TYPE_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.VARIABLE_DECLARATION :
+				buffer.append("VARIABLE_DECLARATION"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.POTENTIAL_METHOD_DECLARATION :
+				buffer.append("POTENTIAL_METHOD_DECLARATION"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.METHOD_NAME_REFERENCE :
+//{ObjectTeams: original "METHOD_IMPORT" is now misleading (used for rhs short method spec, too)				
+				buffer.append("METHOD_NAME_REF"); //$NON-NLS-1$
+// SH}				
+				break;
+//{ObjectTeams: new kinds:				
+			case CompletionProposal.OT_METHOD_SPEC :
+				buffer.append("METHOD_SPEC"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.OT_FIELD_SPEC:
+				buffer.append("FIELD_SPEC"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.OT_CALLOUT_GET:
+				buffer.append("CALLOUT_GET"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.OT_CALLOUT_SET:
+				buffer.append("CALLOUT_SET"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.OT_CALLOUT_DECLARATION:
+				buffer.append("CALLOUT_DECLARATION"); //$NON-NLS-1$
+				break;				
+			case CompletionProposal.OT_CALLOUT_OVERRIDE_DECLARATION:
+				buffer.append("CALLOUT_OVERRIDE_DECLARATION"); //$NON-NLS-1$
+				break;				
+			case CompletionProposal.OT_CALLIN_DECLARATION:
+				buffer.append("CALLIN_DECLARATION"); //$NON-NLS-1$
+				break;				
+// SH}
+			case CompletionProposal.ANNOTATION_ATTRIBUTE_REF :
+				buffer.append("ANNOTATION_ATTRIBUTE_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.JAVADOC_BLOCK_TAG :
+				buffer.append("JAVADOC_BLOCK_TAG"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.JAVADOC_INLINE_TAG :
+				buffer.append("JAVADOC_INLINE_TAG"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.JAVADOC_FIELD_REF:
+				buffer.append("JAVADOC_FIELD_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.JAVADOC_METHOD_REF :
+				buffer.append("JAVADOC_METHOD_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.JAVADOC_TYPE_REF :
+				buffer.append("JAVADOC_TYPE_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.JAVADOC_PARAM_REF :
+				buffer.append("JAVADOC_PARAM_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.JAVADOC_VALUE_REF :
+				buffer.append("JAVADOC_VALUE_REF"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.FIELD_IMPORT :
+				buffer.append("FIELD_IMPORT"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.METHOD_IMPORT :
+				buffer.append("METHOD_IMPORT"); //$NON-NLS-1$
+				break;
+			case CompletionProposal.TYPE_IMPORT :
+				buffer.append("TYPE_IMPORT"); //$NON-NLS-1$
+				break;
+			default :
+				buffer.append("PROPOSAL"); //$NON-NLS-1$
+				break;
+				
+		}
+		buffer.append("]{");
+		buffer.append(proposal.getCompletion() == null ? NULL_LITERAL : proposal.getCompletion());
+		buffer.append(", ");
+		buffer.append(proposal.getDeclarationSignature() == null ? NULL_LITERAL : proposal.getDeclarationSignature());  
+		buffer.append(", ");
+		buffer.append(proposal.getSignature() == null ? NULL_LITERAL : proposal.getSignature());
+		
+		char[] receiverSignature = proposal.getReceiverSignature();
+		if (receiverSignature != null) {
+			buffer.append(", ");
+			buffer.append(receiverSignature);
+		}
+		
+		if(this.showUniqueKeys) {
+			buffer.append(", ");
+			buffer.append(proposal.getDeclarationKey() == null ? NULL_LITERAL : proposal.getDeclarationKey());
+			buffer.append(", ");
+			buffer.append(proposal.getKey() == null ? NULL_LITERAL : proposal.getKey());
+		}
+		buffer.append(", ");
+		buffer.append(proposal.getName() == null ? NULL_LITERAL : proposal.getName());
+		if(this.showParameterNames) {
+			char[][] parameterNames = proposal.findParameterNames(null);
+			buffer.append(", ");
+			if(parameterNames == null || parameterNames.length <= 0) {
+				buffer.append(NULL_LITERAL);
+			} else {
+				buffer.append("(");
+				for (int i = 0; i < parameterNames.length; i++) {
+					if(i > 0) buffer.append(", ");
+					buffer.append(parameterNames[i]);
+				}
+				buffer.append(")");
+			}
+		}
+		
+		if(this.showPositions) {
+			buffer.append(", ");
+			if(this.showTokenPositions || receiverSignature != null) buffer.append("replace");
+			buffer.append("[");
+			buffer.append(proposal.getReplaceStart());
+			buffer.append(", ");
+			buffer.append(proposal.getReplaceEnd());
+			buffer.append("]");
+		}
+		if(this.showTokenPositions) {
+			buffer.append(", token[");
+			buffer.append(proposal.getTokenStart());
+			buffer.append(", ");
+			buffer.append(proposal.getTokenEnd());
+			buffer.append("]");
+		}
+		if(this.showPositions && receiverSignature != null) {
+			buffer.append(", receiver[");
+			buffer.append(proposal.getReceiverStart());
+			buffer.append(", ");
+			buffer.append(proposal.getReceiverEnd());
+			buffer.append("]");
+		}
+		buffer.append(", ");
+		buffer.append(proposal.getRelevance());
+		buffer.append('}');
+		if(this.showMissingTypes) {
+			CompletionProposal[] requiredProposals = proposal.getRequiredProposals();
+			if (requiredProposals != null) {
+				int length = requiredProposals.length;
+				System.arraycopy(requiredProposals, 0, requiredProposals = new CompletionProposal[length], 0, length);
+				quickSort(requiredProposals, 0, length - 1);
+				for (int i = 0; i < length; i++) {
+					buffer.append('\n');
+					printProposal(requiredProposals[i], tab + 1, buffer);
+				}
+			}
+		}
+		return buffer;
+	}
+
+	protected CompletionProposal[] quickSort(CompletionProposal[] collection, int left, int right) {
+		int original_left = left;
+		int original_right = right;
+		CompletionProposal mid = collection[ (left + right) / 2];
+		do {
+			while (compare(mid, collection[left]) > 0)
+				// s[left] >= mid
+				left++;
+			while (compare(mid, collection[right]) < 0)
+				// s[right] <= mid
+				right--;
+			if (left <= right) {
+				CompletionProposal tmp = collection[left];
+				collection[left] = collection[right];
+				collection[right] = tmp;
+				left++;
+				right--;
+			}
+		} while (left <= right);
+		if (original_left < right)
+			collection = quickSort(collection, original_left, right);
+		if (left < original_right)
+			collection = quickSort(collection, left, original_right);
+		return collection;
+	}
+	
+	protected int compare(CompletionProposal proposal1, CompletionProposal proposal2) {
+		int relDif = proposal1.getRelevance() - proposal2.getRelevance();
+		if(relDif != 0) return relDif;
+		String name1 = getElementName(proposal1);
+		String name2 = getElementName(proposal2);
+		int nameDif = name1.compareTo(name2);
+		if(nameDif != 0) return nameDif;
+		int kindDif = proposal1.getKind() - proposal2.getKind();
+		if(kindDif != 0) return kindDif;
+		String completion1 = new String(proposal1.getCompletion());
+		String completion2 = new String(proposal2.getCompletion());
+		int completionDif = completion1.compareTo(completion2);
+		if(completionDif != 0) return completionDif;
+		char[] temp = proposal1.getSignature();
+		String signature1 = temp == null ? null: new String(temp);
+		temp = proposal2.getSignature();
+		String signature2 = temp == null ? null: new String(temp);
+		int signatureDif = 0;
+		if(signature1 != null && signature2 != null) {
+			signatureDif = signature1.compareTo(signature2);
+		}
+		if(signatureDif != 0) return signatureDif;
+		temp = proposal1.getDeclarationSignature();
+		String declarationSignature1 = temp == null ? null: new String(temp);
+		temp = proposal2.getDeclarationSignature();
+		String declarationSignature2 = temp == null ? null: new String(temp);
+		int declarationSignatureDif = 0;
+		if(declarationSignature1 != null && declarationSignature2 != null) {
+			declarationSignatureDif = declarationSignature1.compareTo(declarationSignature2);
+		}
+		if(declarationSignatureDif != 0) return declarationSignatureDif;
+		return 0;
+	}
+	
+	protected String getElementName(CompletionProposal proposal) {
+		switch(proposal.getKind()) {
+			case CompletionProposal.ANONYMOUS_CLASS_DECLARATION :
+				return new String(Signature.getSignatureSimpleName(proposal.getDeclarationSignature()));
+			case CompletionProposal.TYPE_REF :
+			case CompletionProposal.TYPE_IMPORT :
+			case CompletionProposal.JAVADOC_TYPE_REF :
+				return new String(Signature.getSignatureSimpleName(proposal.getSignature()));
+			case CompletionProposal.FIELD_REF :
+			case CompletionProposal.FIELD_REF_WITH_CASTED_RECEIVER :
+			case CompletionProposal.KEYWORD:
+			case CompletionProposal.LABEL_REF:
+			case CompletionProposal.LOCAL_VARIABLE_REF:
+			case CompletionProposal.METHOD_REF:
+			case CompletionProposal.METHOD_REF_WITH_CASTED_RECEIVER:
+			case CompletionProposal.METHOD_DECLARATION:
+			case CompletionProposal.VARIABLE_DECLARATION:
+			case CompletionProposal.POTENTIAL_METHOD_DECLARATION:
+			case CompletionProposal.METHOD_NAME_REFERENCE:
+//{ObjectTeams: new kinds:
+			case CompletionProposal.OT_METHOD_SPEC:
+			case CompletionProposal.OT_FIELD_SPEC:
+			case CompletionProposal.OT_CALLOUT_GET:
+			case CompletionProposal.OT_CALLOUT_SET:
+			case CompletionProposal.OT_CALLOUT_DECLARATION:
+			case CompletionProposal.OT_CALLOUT_OVERRIDE_DECLARATION:
+			case CompletionProposal.OT_CALLIN_DECLARATION:
+// SH}
+			case CompletionProposal.ANNOTATION_ATTRIBUTE_REF:
+			case CompletionProposal.JAVADOC_BLOCK_TAG :
+			case CompletionProposal.JAVADOC_INLINE_TAG :
+			case CompletionProposal.JAVADOC_FIELD_REF:
+			case CompletionProposal.JAVADOC_METHOD_REF :
+			case CompletionProposal.JAVADOC_PARAM_REF :
+			case CompletionProposal.JAVADOC_VALUE_REF :
+			case CompletionProposal.FIELD_IMPORT :
+			case CompletionProposal.METHOD_IMPORT :
+				return new String(proposal.getName());
+			case CompletionProposal.PACKAGE_REF:
+				return new String(proposal.getDeclarationSignature());
+		}
+		return "";
+	}
+	public String toString() {
+		return getResults();
+	}
+	public void setComputeVisibleElements(boolean computeVisibleElements) {
+		this.computeVisibleElements = computeVisibleElements;
+	}
+	public void setAssignableType(String typeSignature) {
+		this.assignableType = typeSignature;
+	}
+	public void setComputeEnclosingElement(boolean computeEnclosingElement) {
+		this.computeEnclosingElement = computeEnclosingElement;
+	}
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/OTCompletionTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/OTCompletionTests.java
new file mode 100644
index 0000000..619f967
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/model/OTCompletionTests.java
@@ -0,0 +1,1183 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTCompletionTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.model;
+
+import java.util.Hashtable;
+
+import org.eclipse.jdt.core.*;
+import org.eclipse.jdt.internal.codeassist.RelevanceConstants;
+
+import junit.framework.*;
+
+public class OTCompletionTests extends AbstractJavaModelCompletionTests implements RelevanceConstants {
+
+public OTCompletionTests(String name) {
+	super(name);
+}
+public void setUpSuite() throws Exception {
+	if (COMPLETION_PROJECT == null)  {
+		COMPLETION_PROJECT = setUpJavaProject("Completion");
+	} else {
+		setUpProjectCompliance(COMPLETION_PROJECT, "1.5");
+	}
+	super.setUpSuite();
+}
+public void tearDownSuite() throws Exception {
+	super.tearDownSuite();
+}
+static {
+//	TESTS_NAMES = new String[] { "testInconsistentHierarchy1"};
+}
+public static Test suite() {
+	if (true) {
+		return buildModelTestSuite(OTCompletionTests.class);
+	}
+	TestSuite suite = new Suite(OTCompletionTests.class.getName());		
+
+	suite.addTest(new OTCompletionTests("testCompletionParamMapping1"));			
+	return suite;
+}
+
+public void testCompletionBaseclass1() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy CompletionB");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "CompletionB";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"CompletionBaseclass[TYPE_REF]{CompletionBaseclass, , LCompletionBaseclass;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+public void testCompletionBaseclass2() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam2.java",
+            "public team class CompletionTeam2 {\n" +
+            "  public class CompletionRoleA playedBy CompletionBaseclass {\n" +
+    		"     String toString() => String toString();\n" +
+    		"}\n" +
+            "public class CompletionRoleB playedBy CompletionB");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "CompletionB";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"CompletionBaseclass[TYPE_REF]{CompletionBaseclass, , LCompletionBaseclass;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+public void testCompletionSuperRole() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam2.java",
+            "public team class CompletionTeam2 {\n" +
+            "  public class ASuperRole playedBy CompletionBaseclass {\n" +
+    		"     String toString() => String toString();\n" +
+    		"  }\n" +
+    		"  public interface ASuperRoleIfc {}\n" + // don't match this 
+            "  public class CompletionRoleB extends ASuperR {}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "ASuperR";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"CompletionTeam2.ASuperRole[TYPE_REF]{ASuperRole, , LCompletionTeam2$ASuperRole;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+public void testCompletionSuperRoleInterface() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam2.java",
+            "public team class CompletionTeam2 {\n" +
+            "  protected interface ISuperRole  {\n" +
+    		"     String foo();\n" +
+    		"  }\n" +
+    		"  public class ISuperRoleClass {}\n" + // don't match this
+            "  public class CompletionRoleB implements ISuperR {}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "ISuperR";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"CompletionTeam2.ISuperRole[TYPE_REF]{ISuperRole, , LCompletionTeam2$ISuperRole;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_INTERFACE+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+public void testCompletionSuperRoles() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam2.java",
+            "public team class CompletionTeam2 {\n" +
+            "  protected class XRole  {\n" +
+    		"     String foo();\n" +
+    		"  }\n" +
+    		"  public class XRoleClass {}\n" +
+            "  public class XSubRole extends {}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "extends ";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	// dont't propose class part (__OT__...) nor current type nor team:
+	assertResults(
+		"CompletionTeam2.XRole[TYPE_REF]{XRole, , LCompletionTeam2$XRole;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}\n" +
+		"CompletionTeam2.XRoleClass[TYPE_REF]{XRoleClass, , LCompletionTeam2$XRoleClass;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+public void testCompletionBaseclass_Trac56() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/Trac56_SubTeam.java",
+            "public team class Trac56_SubTeam extends Trac56_SuperTeam {\n" +
+			"     public class SubRole playedBy SuperR" +
+    		"}\n");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "SuperR";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+    
+    // ensure that no illegal playedBy to role of the same (or super) team is proposed:
+	assertResults("", requestor.getResults());
+}
+
+public void testCompletionBaseGuard1() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/BaseGuardTeam.java",
+            "public team class BaseGuardTeam {\n" +
+			"    public class MyRole playedBy CompletionBaseclass\n" +
+			"        base when (true == base.ch)\n" +
+			"    {\n" +
+			"        void nothing() {}\n" +
+			"    }\n" +
+    		"}\n");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "base.ch";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+    
+	
+	assertResults(
+		"check[METHOD_REF]{check(), LCompletionBaseclass;, ()Z, check, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_EXACT_EXPECTED_TYPE+R_NON_STATIC+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+public void testCompletionBaseGuard2() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/BaseGuardTeam.java",
+            "public team class BaseGuardTeam {\n" +
+            "    protected class NoThisRole playedBy CompletionBaseclass\n" +
+            "        base when (base==null) { }\n" +
+			"    public class MyRole playedBy CompletionBaseclass\n" +
+			"        base when (base.ch)" +
+			"    {\n" +
+			"    }\n" +
+    		"}\n");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "base.ch";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+    
+	
+	assertResults(
+		"check[METHOD_REF]{check(), LCompletionBaseclass;, ()Z, check, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_STATIC+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+
+@SuppressWarnings("unchecked")
+public void testCompletionBaseclassDecapsulation() throws JavaModelException {
+	Hashtable oldCurrentOptions = JavaCore.getOptions();
+	try {
+		Hashtable options = new Hashtable(oldCurrentOptions);
+
+		options.put(JavaCore.CODEASSIST_VISIBILITY_CHECK, JavaCore.ENABLED);
+		JavaCore.setOptions(options);
+	
+		this.wc = getWorkingCopy(
+	            "/Completion/src/CompletionTeam3.java",
+	            "public team class CompletionTeam3 {\n" +
+	            "  public class CompletionRoleA playedBy CompletionBaseclass {\n" +
+	    		"     String toString() => String toString();\n" +
+	    		"}\n" +
+	            "public class CompletionRoleB playedBy CompletionI");
+	    
+	    
+	    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	    String str = this.wc.getSource();
+	    String completeBehind = "CompletionI";
+	    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+	
+		assertResults(
+			"CompletionInvisibleBaseclass[TYPE_REF]{p.CompletionInvisibleBaseclass, p, Lp.CompletionInvisibleBaseclass;, null, null, "+
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED)+"}",
+			requestor.getResults());
+	} finally {
+		JavaCore.setOptions(oldCurrentOptions);
+	}
+}
+
+//complete base class although it is equal to the role name
+@SuppressWarnings("unchecked")
+public void testCompletionBaseclassDecapsulation2() throws JavaModelException {
+	Hashtable oldCurrentOptions = JavaCore.getOptions();
+	try {
+		Hashtable options = new Hashtable(oldCurrentOptions);
+
+		options.put(JavaCore.CODEASSIST_VISIBILITY_CHECK, JavaCore.ENABLED);
+		JavaCore.setOptions(options);
+	
+		this.wc = getWorkingCopy(
+	            "/Completion/src/CompletionTeam3.java",
+	            "public team class CompletionTeam3 {\n" +
+	            "  public class CompletionRoleA playedBy CompletionBaseclass {\n" +
+	    		"     String toString() => String toString();\n" +
+	    		"  }\n" +
+	            "  public class CompletionInvisibleBaseclass playedBy CompletionI");
+	    
+	    
+	    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	    String str = this.wc.getSource();
+	    String completeBehind = "CompletionI";
+	    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+	
+		assertResults(
+			"CompletionInvisibleBaseclass[TYPE_REF]{p.CompletionInvisibleBaseclass, p, Lp.CompletionInvisibleBaseclass;, null, null, "+
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED)+"}",
+			requestor.getResults());
+	} finally {
+		JavaCore.setOptions(oldCurrentOptions);
+	}
+}
+// "playedBy" in a regular role:
+public void testCompletionKeywordPlayedBy1() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeamKW1.java",
+            "public team class CompletionTeamKW1 {\n" +
+            "  public class CompletionRoleA playedBy CompletionBaseclass {\n" +
+    		"     String toString() => String toString();\n" +
+    		"  }\n" +
+            "  public class CompletionRoleB pla");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "pla";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"playedBy[KEYWORD]{playedBy, null, null, playedBy, null, "+
+		(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE+ R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+//"playedBy" in a role file:
+public void testCompletionKeywordPlayedBy2() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionSuperTeam/ExternalRole.java",
+            "team package CompletionSuperTeam;\n"+
+            "public class ExternalRole pla");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "pla";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"playedBy[KEYWORD]{playedBy, null, null, playedBy, null, "+
+		(R_DEFAULT + R_RESOLVED + R_INTERESTING + R_CASE+ R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+// no "playedBy" in a regular class:
+public void testCompletionKeywordPlayedBy3() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionClassKW3.java",
+            "public class CompletionClassKW3 pla");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "pla";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"",
+		requestor.getResults());
+}
+// no "playedBy" in a toplevel team:
+public void testCompletionKeywordPlayedBy4() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeamKW4.java",
+            "public team class CompletionTeamKW4 pla");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "pla";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"",
+		requestor.getResults());
+}
+
+// testing a reverted change in CompletionParser.attachOrphanCompletionNode()
+public void testCompletionTypeReference1() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam2.java",
+            "class CompletionTBase {}\n" +
+            "public team class CompletionTeam2 {\n" +
+            "  public class CompletionTRoleA playedBy CompletionTBaseclass {\n" +
+    		"     String toString() => String toString();\n" +
+    		"     protected CompletionT");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "CompletionT";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"CompletionTBase[TYPE_REF]{CompletionTBase, , LCompletionTBase;, null, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}\n" +
+		"CompletionTeam2[TYPE_REF]{CompletionTeam2, , LCompletionTeam2;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}\n" +
+		"CompletionTeam2.CompletionTRoleA[TYPE_REF]{CompletionTRoleA, , LCompletionTeam2$CompletionTRoleA;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+//testing a reverted change in CompletionParser.attachOrphanCompletionNode()
+public void testCompletionTypeReference2() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam2.java",
+            "public team class CompletionTeam2 {\n" +
+            "  public class CompletionRoleA playedBy CompletionBaseclass {\n" +
+    		"     String toString() => ;\n"+
+    		"     protected Seriali");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "Seriali";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"Serializable[TYPE_REF]{java.io.Serializable, java.io, Ljava.io.Serializable;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+/** A base method spec with return type and beginning of the selector is searched. */
+public void testCompletionMethodSpecLong1() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "  String toString() => String toStr");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "toStr";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"toString[METHOD_SPEC]{String toString();, Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_EXACT_EXPECTED_TYPE+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+/** A base method spec with return type and beginning of the selector is searched - CALLIN. */
+public void testCompletionMethodSpecLong2() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "  void foo() {}\n "+
+            "  void foo() <- after String toStr ");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "toStr";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"toString[METHOD_SPEC]{toString();, Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+/** A base method spec with the beginning of the selector is searched. */
+public void testCompletionMethodSpecLong3() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "  int myHashCode() -> hash\n"+
+            "}}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "hash";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"hashCode[METHOD_SPEC]{int hashCode();, Ljava.lang.Object;, ()I, hashCode, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_EXACT_EXPECTED_TYPE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+/** A base method spec with the beginning of the selector is searched - callin. */
+public void testCompletionMethodSpecLong4() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "  int myHashCode() <- after hash");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "hash";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"hashCode[METHOD_SPEC]{int hashCode();, Ljava.lang.Object;, ()I, hashCode, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_EXACT_EXPECTED_TYPE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+/** A type in a RHS method spec signature is completed. */
+public void testCompletionMethodSpecLong5() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "  public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "    int myHashCode() <- after void foo(CompletionB\n" +
+            "  }\n"+
+            "}\n");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "CompletionB";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"CompletionBaseclass[TYPE_REF]{CompletionBaseclass, , LCompletionBaseclass;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+/** A callin binding guard is completed. */
+public void testCompletionBindingGuard() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "  public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "    int myHashCode() <- after void foo(CompletionBaseclass cb)\n" +
+            "        when (CompletionB"+
+            "  }\n"+
+            "}\n");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "CompletionB";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"CompletionBaseclass[TYPE_REF]{CompletionBaseclass, , LCompletionBaseclass;, null, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+public void testCompletionMethodSpecShort1() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "  toString => toStri");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "toStri";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"toString[METHOD_SPEC]{toString;, Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+/* prefix of base method spec typed. */
+public void testCompletionMethodSpecShort2() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "    void bar() {};\n" +
+            "    bar <- after fub\n"+
+            "}}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fubar[METHOD_SPEC]{fubar;, LCompletionBaseclass;, (ILjava.lang.String;)J, fubar, (fred, zork), "+
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+
+public void testCompletionCalloutDeclaration1() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "fub \n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fub[POTENTIAL_METHOD_DECLARATION]{fub, LCompletionTeam1$CompletionRole;, ()V, fub, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_METHOD_OVERIDE)+"}\n"+
+		"fubar[CALLOUT_DECLARATION]{long fubar(int fred, String zork) -> long fubar(int fred, String zork);, LCompletionBaseclass;, (ILjava.lang.String;)J, fubar, (fred, zork), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+// callout-override
+public void testCompletionCalloutDeclaration2() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "   public class CompletionRoleA { long fubar(int x, String z) { return 0; } }\n"+
+            "   public class CompletionRole extends CompletionRoleA playedBy CompletionBaseclass {\n" +
+            "      fub \n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fub[POTENTIAL_METHOD_DECLARATION]{fub, LCompletionTeam1$CompletionRole;, ()V, fub, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_METHOD_OVERIDE)+"}\n"+
+		"fubar[METHOD_DECLARATION]{long fubar(int x, String z), LCompletionTeam1$CompletionRoleA;, (ILjava.lang.String;)J, fubar, (x, z), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_METHOD_OVERIDE+R_NON_RESTRICTED)+"}\n"+
+		"fubar[CALLOUT_OVERRIDE_DECLARATION]{long fubar(int fred, String zork) => long fubar(int fred, String zork);, LCompletionBaseclass;, (ILjava.lang.String;)J, fubar, (fred, zork), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}" ,
+		requestor.getResults());
+}
+//callout-non-override (implicitly inherited abstract method)
+public void testCompletionCalloutDeclaration3() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 extends CompletionSuperTeam {\n" +
+            "   public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "      fub \n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fub[POTENTIAL_METHOD_DECLARATION]{fub, LCompletionTeam1$CompletionRole;, ()V, fub, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_METHOD_OVERIDE)+"}\n"+
+		"fubar[CALLOUT_DECLARATION]{long fubar(int fred, String zork) -> long fubar(int fred, String zork);, LCompletionBaseclass;, (ILjava.lang.String;)J, fubar, (fred, zork), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}\n" +
+		"fubar[METHOD_DECLARATION]{long fubar(int x, String z), LCompletionSuperTeam$CompletionRole;, (ILjava.lang.String;)J, fubar, (x, z), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_METHOD_OVERIDE+R_ABSTRACT_METHOD+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+// static methods
+public void testCompletionCalloutDeclaration4() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "mySt \n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "mySt";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"mySt[POTENTIAL_METHOD_DECLARATION]{mySt, LCompletionTeam1$CompletionRole;, ()V, mySt, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_METHOD_OVERIDE)+"}\n"+
+		"myStaticBaseMethod[CALLOUT_DECLARATION]{void myStaticBaseMethod(Object a) -> void myStaticBaseMethod(Object a);, LCompletionBaseclass;, (Ljava.lang.Object;)V, myStaticBaseMethod, (a), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+
+public void testCompletionCalloutDeclarationTrac138() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "public class CompletionRole playedBy BaseTrac138 {\n" +
+            "foo \n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "foo";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"foo[POTENTIAL_METHOD_DECLARATION]{foo, LCompletionTeam1$CompletionRole;, ()V, foo, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_METHOD_OVERIDE)+"}",
+		requestor.getResults());
+}
+
+public void testCompletionCalloutToFieldDeclaration() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeamCalloutToField.java",
+            "public team class CompletionTeamCalloutToField {\n" +
+            "  public class CompletionRole playedBy BaseTrac38 {\n" +
+    		"    public void rm() {}\n"+
+    		"    getS \n"+
+    		"  }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(false, false, true);
+    String str = this.wc.getSource();
+    String completeBehind = "getS";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+			"getS[POTENTIAL_METHOD_DECLARATION]{getS, LCompletionTeamCalloutToField$CompletionRole;, ()V, getS, [129, 133], "+
+			+(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_METHOD_OVERIDE)+"}\n"+
+			"getStr[CALLOUT_GET]{String getStr() -> get String str;, LBaseTrac38;, ()Ljava.lang.String;, getStr, [129, 133], " +
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+			requestor.getResults());	
+}
+
+public void testCompletionCalloutToFieldDeclarationTrac138() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeamCalloutToField.java",
+            "public team class CompletionTeamCalloutToField {\n" +
+            "  public class CompletionRole playedBy BaseTrac138 {\n" +
+    		"    public void rm() {}\n"+
+    		"    getBar \n"+
+    		"  }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(false, false, true);
+    String str = this.wc.getSource();
+    String completeBehind = "getBar";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+			"getBar[POTENTIAL_METHOD_DECLARATION]{getBar, LCompletionTeamCalloutToField$CompletionRole;, ()V, getBar, [130, 136], "+
+			+(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_METHOD_OVERIDE)+"}",
+			requestor.getResults());	
+}
+
+public void testCompletionParamMapping1() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeamParamMapping1.java",
+            "public team class CompletionTeamParamMapping1 {\n" +
+            "  public class CompletionRole playedBy BaseTrac38 {\n" +
+    		"    public void rm() {}\n"+
+    		"    int strLen() -> get String str\n"+
+    		"       with { result <- str.le\n"+
+    		"       }\n"+
+    		"  }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(false, false, true);
+    String str = this.wc.getSource();
+    String completeBehind = "str.le";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+			"length[METHOD_REF]{length(), Ljava.lang.String;, ()I, length, [187, 189], "+
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_STATIC+R_NON_RESTRICTED)+"}",
+			requestor.getResults());	
+}
+public void testCompletionTrac38_1() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeamTrac38_1.java",
+            "public team class CompletionTeamTrac38_1 {\n" +
+            "  public class CompletionRole playedBy BaseTrac38 {\n" +
+    		"    public void rm() {}\n"+
+    		"    callin void crm() {}\n"+
+    		"    void _m() -> void _m();\n"+
+    		"    void m() -> void m();\n"+
+    		"    String str() -> get \n"+
+    		"  }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(false, false, true);
+    String str = this.wc.getSource();
+    String completeBehind = "get ";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+			"_str[FIELD_SPEC]{String _str;, LBaseTrac38;, Ljava.lang.String;, _str, [222, 222], " +
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_EXACT_EXPECTED_TYPE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}\n"+
+			"str[FIELD_SPEC]{String str;, LBaseTrac38;, Ljava.lang.String;, str, [222, 222], " +
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_EXACT_EXPECTED_TYPE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+			requestor.getResults());	
+}
+// same as above but without the space after "get" but still expect the same c-t-f proposals
+public void testCompletionTrac38_2() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeamTrac38_2.java",
+            "public team class CompletionTeamTrac38_2 {\n" +
+            "  public class CompletionRole playedBy BaseTrac38 {\n" +
+    		"    public void rm() {}\n"+
+    		"    callin void crm() {}\n"+
+    		"    void _m() -> void _m();\n"+
+    		"    void m() -> void m();\n"+
+    		"    String str() -> get\n"+
+    		"  }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(false, false, true);
+    String str = this.wc.getSource();
+    String completeBehind = "get";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+			"getClass[METHOD_SPEC]{java.lang.Class<?> getClass();, Ljava.lang.Object;, ()Ljava.lang.Class<*>;, getClass, [218, 221], "+
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}\n"+
+			"_str[FIELD_SPEC]{ String _str;, LBaseTrac38;, Ljava.lang.String;, _str, [221, 221], " +  // yes, proposal starts with blank
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_EXACT_EXPECTED_TYPE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}\n"+
+			"str[FIELD_SPEC]{ String str;, LBaseTrac38;, Ljava.lang.String;, str, [221, 221], " +     // yes, proposal starts with blank
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_EXACT_EXPECTED_TYPE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+			requestor.getResults());	
+}
+// indicate field name by role method spec naming convention:
+public void testCompletionTrac38_3() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeamTrac38_2.java",
+            "public team class CompletionTeamTrac38_2 {\n" +
+            "  public class CompletionRole playedBy BaseTrac38 {\n" +
+    		"    public void rm() {}\n"+
+    		"    callin void crm() {}\n"+
+    		"    void _m() -> void _m();\n"+
+    		"    void m() -> void m();\n"+
+    		"    String getStr() -> get \n"+
+    		"  }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(false, false, true);
+    String str = this.wc.getSource();
+    String completeBehind = "get ";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+			"_str[FIELD_SPEC]{String _str;, LBaseTrac38;, Ljava.lang.String;, _str, [225, 225], " +
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_EXACT_EXPECTED_TYPE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}\n"+ // no R_EXACT_NAME !
+			"str[FIELD_SPEC]{String str;, LBaseTrac38;, Ljava.lang.String;, str, [225, 225], " +
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_EXACT_NAME+R_EXACT_EXPECTED_TYPE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+			requestor.getResults());	
+}
+public void testCompletionCallToCallout1() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "   public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "      long fubar(int fred, String zork) -> long fubar(int fred, String zork);\n"+
+            "   }\n"+
+            "   void test(CompletionRole r) {\n"+
+            "       r.fub\n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fubar[METHOD_REF]{fubar(), LCompletionTeam1$CompletionRole;, (ILjava.lang.String;)J, fubar, (fred, zork), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_STATIC+R_NON_RESTRICTED)+"}",
+		requestor.getResults());	
+}
+// witness for https://svn.objectteams.org/trac/ot/ticket/22
+public void testCompletionCallToCallout2() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/Main.java",
+            "public class Main {\n"+
+            "   void main() {\n"+
+            "      CompletionRole<@CompletionCalloutTeam.INSTANCE> r= new CompletionRole<@CompletionCalloutTeam.INSTANCE>();\n"+
+            "      r.fub\n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fubar[METHOD_REF]{fubar(), LCompletionCalloutTeam$CompletionRole;, (ILjava.lang.String;)J, fubar, (fred, zork), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_STATIC+R_NON_RESTRICTED)+"}",
+		requestor.getResults());	
+}
+public void testCompletionCallToCallout3() throws JavaModelException {
+	// call to inferred callout?
+	this.wc = getWorkingCopy(
+			"/Completion/src/CompletionTeam1.java",
+			"public team class CompletionTeam1 {\n" +
+			"   public class CompletionRole playedBy CompletionBaseclass {\n" +
+			"      void test() {\n" +
+			"         fre\n" +
+			"      }\n"+
+			"   }\n"+
+	"}");
+	
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	String str = this.wc.getSource();
+	String completeBehind = "fre";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+	
+	assertResults(
+			"fred[FIELD_REF]{fred, LCompletionBaseclass;, I, fred, null, " +
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+			requestor.getResults());		
+}
+public void testCompletionCallToCallout3this() throws JavaModelException {
+	// call to inferred callout?
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "   public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "      void test() {\n" +
+            "         this.fre\n" +
+            "      }\n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fre";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fred[FIELD_REF]{fred, LCompletionBaseclass;, I, fred, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_STATIC+R_NON_RESTRICTED)+"}",
+		requestor.getResults());		
+}
+public void testCompletionCallToCallout3qualified() throws JavaModelException {
+	// call to inferred callout? Not allowed on other role
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "   public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "      void test(CompletionRole other) {\n" +
+            "         other.fre\n" +
+            "      }\n"+
+            "   }\n"+
+            "}");
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fre";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"",
+		requestor.getResults());		
+}
+public void testCompletionCallToCallout4() throws JavaModelException {
+	// call to inferred callout?
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "   public class CompletionRole playedBy CompletionBaseclass {\n" +
+            "      void test() {\n" +
+            "         fub\n" +
+            "      }\n"+
+            "   }\n"+
+            "}");
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fubar[METHOD_REF]{fubar(), LCompletionBaseclass;, (ILjava.lang.String;)J, fubar, (fred, zork), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());		
+}
+public void testCompletionCallToCallout5() throws JavaModelException {
+	// indirect call via inferred callout
+	this.wc = getWorkingCopy(
+			"/Completion/src/CompletionTeam1.java",
+			"public team class CompletionTeam1 {\n" +
+			"   public class CompletionRole playedBy CompletionBaseclass {\n" +
+			"      void test() {\n" +
+			"         frood.endsW\n" +
+			"      }\n"+
+			"   }\n"+
+	"}");
+	
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	String str = this.wc.getSource();
+	String completeBehind = "endsW";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+	
+	assertResults(
+			"endsWith[METHOD_REF]{endsWith(), Ljava.lang.String;, (Ljava.lang.String;)Z, endsWith, (postfix), " +
+			(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_STATIC+R_NON_RESTRICTED)+"}",
+			requestor.getResults());		
+}
+public void testCompletionOverrideTSuper() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 extends CompletionSuperTeam {\n" +
+            "   public class CompletionRole {\n" +
+            "      noth \n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "noth";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"noth[POTENTIAL_METHOD_DECLARATION]{noth, LCompletionTeam1$CompletionRole;, ()V, noth, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_NON_RESTRICTED)+"}\n"+
+		"nothing[METHOD_DECLARATION]{long nothing(int x, String z), LCompletionSuperTeam$CompletionRole;, (ILjava.lang.String;)J, nothing, (x, z), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_METHOD_OVERIDE+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+public void testCompletionOverrideAbstractTSuper() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 extends CompletionSuperTeam {\n" +
+            "   public class CompletionRole {\n" +
+            "      fub \n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fub[POTENTIAL_METHOD_DECLARATION]{fub, LCompletionTeam1$CompletionRole;, ()V, fub, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_NON_RESTRICTED)+"}\n"+
+		"fubar[METHOD_DECLARATION]{long fubar(int x, String z), LCompletionSuperTeam$CompletionRole;, (ILjava.lang.String;)J, fubar, (x, z), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_METHOD_OVERIDE+R_ABSTRACT_METHOD+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+public void testCompletionDontOverrideLocal() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 extends CompletionSuperTeam {\n" +
+            "   public class CompletionRole {\n" +
+            "      long fubar(int a, String b) {}\n"+
+            "      fub \n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fub[POTENTIAL_METHOD_DECLARATION]{fub, LCompletionTeam1$CompletionRole;, ()V, fub, null, " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+public void testCompletionCallAbstractTSuper() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 extends CompletionSuperTeam {\n" +
+            "   public class CompletionRole {\n" +
+            "      void m() { \n"+
+            "         fub\n" + // unqualified
+            "      }\n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "fub";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"fubar[METHOD_REF]{fubar(), LCompletionTeam1$CompletionRole;, (ILjava.lang.String;)J, fubar, (arg0, arg1), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_UNQUALIFIED+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+public void testCompletionCallTSuper() throws JavaModelException {		
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 extends CompletionSuperTeam {\n" +
+            "   public class CompletionRole {\n" +
+            "      void m(CompletionRole r) { \n"+
+            "         r.noth\n" + // qualified
+            "      }\n"+
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "noth";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"nothing[METHOD_REF]{nothing(), LCompletionTeam1$CompletionRole;, (ILjava.lang.String;)J, nothing, (arg0, arg1), " +
+		(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_STATIC+R_NON_RESTRICTED)+"}",
+		requestor.getResults());
+}
+public void testCompletionOnConfined() throws JavaModelException {
+	this.wc = getWorkingCopy(
+            "/Completion/src/CompletionTeam1.java",
+            "public team class CompletionTeam1 {\n" +
+            "   void m(IConfined r) { \n"+
+            "       r.\n" + 
+            "   }\n"+
+            "}");
+    
+    
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+    String str = this.wc.getSource();
+    String completeBehind = "r.";
+    int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.wc.codeComplete(cursorLocation, requestor, this.wcOwner);
+
+	assertResults(
+		"",
+		requestor.getResults());	
+}
+
+}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/AllTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/AllTests.java
new file mode 100644
index 0000000..9c65a46
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/AllTests.java
@@ -0,0 +1,99 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel;
+
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Description of the class.
+ * 
+ * @author jwloka
+ * @version $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class AllTests extends TestCase
+{
+    public AllTests(String name) 
+    {
+        super(name);
+    }
+
+    public static Class[] getAllTestClasses()
+    {
+        return new Class[]
+        {
+// anonymous type tests disabled, because functionality is disabled in the code, too
+//            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.AllTests.class,
+//            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.teamlevel.AllTests.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.CallinMappingTest.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.DeclaredLiftingTest.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.OTReconcilerTests.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.equals.AllTests.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.externalrole.AllTests.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.internalrole.AllTests.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.teams.AllTests.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.internal.AllTests.class,
+        };
+    }
+
+    public static Test suite()
+    {
+        TestSuite ts = new TestSuite("All OT-Model Tests");
+
+        Class[] testClasses = getAllTestClasses();
+        // Reset forgotten subsets of tests
+//        AbstractJavaModelTests.testsNames = null;
+//        AbstractJavaModelTests.testsNumbers = null;
+//        AbstractJavaModelTests.testsRange = null;
+
+        for (int idx = 0; idx < testClasses.length; idx++)
+        {
+            Class<?> testClass = testClasses[idx];
+
+            // call the suite() method and add the resulting suite to the suite
+            try
+            {
+                Method suiteMethod = testClass.getDeclaredMethod(
+                    "suite", new Class<?>[0]); //$NON-NLS-1$
+                Test suite = (Test) suiteMethod.invoke(null, new Object[0]);
+                ts.addTest(suite);
+            }
+            catch (IllegalAccessException ex)
+            {
+                ex.printStackTrace();
+            }
+            catch (InvocationTargetException ex)
+            {
+                ex.getTargetException().printStackTrace();
+            }
+            catch (NoSuchMethodException ex)
+            {
+                ex.printStackTrace();
+            }
+        }
+        return ts;
+    }
+}
\ No newline at end of file
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/AllTests_.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/AllTests_.java
new file mode 100644
index 0000000..1156aff
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/AllTests_.java
@@ -0,0 +1,55 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AllTests_.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Enter a class description here!
+ * 
+ * @author jwloka
+ * @version $Id: AllTests_.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class AllTests_
+{
+
+    public static void main(String[] args)
+    {
+        junit.textui.TestRunner.run(AllTests_.suite());
+    }
+
+    public static Test suite()
+    {
+        TestSuite suite = new TestSuite(
+                "All OTModel Tests");
+        //$JUnit-BEGIN$
+        suite.addTest(org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.AllTests.suite());
+        suite.addTest(org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.teamlevel.AllTests.suite());
+        suite.addTest(org.eclipse.objectteams.otdt.tests.otmodel.equals.AllTests.suite());
+        suite.addTest(org.eclipse.objectteams.otdt.tests.otmodel.externalrole.AllTests.suite());
+        suite.addTest(org.eclipse.objectteams.otdt.tests.otmodel.internalrole.AllTests.suite());
+        suite.addTest(org.eclipse.objectteams.otdt.tests.otmodel.teams.AllTests.suite());
+        suite.addTest(org.eclipse.objectteams.otdt.tests.otmodel.internal.AllTests.suite());
+        //$JUnit-END$
+        return suite;
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/CallinMappingTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/CallinMappingTest.java
new file mode 100644
index 0000000..f8d0ee2
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/CallinMappingTest.java
@@ -0,0 +1,570 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: CallinMappingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.internal.core.SourceType;
+import org.eclipse.objectteams.otdt.core.ICallinMapping;
+import org.eclipse.objectteams.otdt.core.IMethodMapping;
+import org.eclipse.objectteams.otdt.core.IOTJavaElement;
+import org.eclipse.objectteams.otdt.core.IOTType;
+import org.eclipse.objectteams.otdt.core.IRoleType;
+import org.eclipse.objectteams.otdt.core.OTModelManager;
+
+/**
+ * $Id: CallinMappingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ *
+ * testcase:
+ * a team class with a bound role class and various callin binding declarations
+ * callin bindings:
+ *     - both the base method and the role method exist
+ *     - the role method does not exist
+ *     - the base method does not exist
+ *     - neither role method nor base method exist
+ *     - multiple (three) base methods are mapped to the same role method
+ *       whereas two of those base methods exist and one of those does not exist
+ *     - one base method is mapped to multiple (2) role methods 
+ */
+public class CallinMappingTest extends FileBasedModelTest
+{
+    
+    private IType _teamJavaElem;
+    private IType _roleJavaElem;
+    private IType _baseJavaElem;
+    
+    public CallinMappingTest(String name)
+    {
+        super(name);
+    }
+
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(CallinMappingTest.class);
+        }
+        junit.framework.TestSuite suite = new Suite(CallinMappingTest.class
+            .getName());
+        return suite;
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("CallinMapping");
+        super.setUpSuite();
+    }
+    
+    public void setUp() throws Exception
+    {
+    		super.setUp();
+    	
+        try
+        {
+            ICompilationUnit teamUnit = getCompilationUnit(
+                    "CallinMapping", 
+                    "src",
+                    "teampkg", 
+                    "SampleTeam" + ".java");
+
+            _teamJavaElem = teamUnit.getType("SampleTeam");
+
+            _roleJavaElem = _teamJavaElem.getType("SampleRole");
+            
+            ICompilationUnit baseUnit = getCompilationUnit(
+                    "CallinMapping", 
+                    "src",
+                    "basepkg", 
+                    "SampleBase" + ".java");
+
+            _baseJavaElem = baseUnit.getType("SampleBase");           
+        }
+        catch (JavaModelException ex)
+        {
+            ex.printStackTrace();
+        }
+    }    
+    
+    private IRoleType getRoleOTElem()
+    {
+        if ((_roleJavaElem != null) && (_roleJavaElem.exists()))
+        {
+            IOTType roleOTElem = OTModelManager.getOTElement(_roleJavaElem);
+            
+            if ((roleOTElem != null) && (roleOTElem instanceof IRoleType))
+            {
+                return ((IRoleType) roleOTElem);
+            }
+        }
+        return null;
+    }
+
+    public void testExistenceOfMethods() throws JavaModelException
+    {
+        assertNotNull(_baseJavaElem);
+        assertTrue(_baseJavaElem.exists());
+        
+        IMethod[] baseMethods = _baseJavaElem.getMethods();
+        assertNotNull(baseMethods);
+        assertEquals(6, baseMethods.length);
+        
+        assertTrue((_baseJavaElem.getMethod("baseMethod1", new String[0])).exists());        
+        assertTrue((_baseJavaElem.getMethod("baseMethod2", new String[0])).exists());
+        assertTrue((_baseJavaElem.getMethod("baseMethod3", new String[0])).exists());
+        assertTrue((_baseJavaElem.getMethod("baseMethod4", new String[0])).exists());
+        
+        assertFalse((_baseJavaElem.getMethod("baseMethodA", new String[0])).exists());        
+        assertFalse((_baseJavaElem.getMethod("baseMethodB", new String[0])).exists());
+        assertFalse((_baseJavaElem.getMethod("baseMethodC", new String[0])).exists());
+
+        
+        IMethod[] roleMethods = _roleJavaElem.getMethods();
+        assertNotNull(roleMethods);
+        assertEquals(6, roleMethods.length);
+        
+        assertTrue((_roleJavaElem.getMethod("roleMethod1", new String[0])).exists());
+        assertTrue((_roleJavaElem.getMethod("roleMethod2", new String[0])).exists());
+        assertTrue((_roleJavaElem.getMethod("roleMethod3", new String[0])).exists());
+        assertTrue((_roleJavaElem.getMethod("roleMethod4", new String[0])).exists());
+        
+        assertFalse((_roleJavaElem.getMethod("roleMethodA", new String[0])).exists());
+        assertFalse((_roleJavaElem.getMethod("roleMethodB", new String[0])).exists());        
+    }
+    
+    
+    public void testExistenceOfMappings() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        
+        IMethodMapping[] allMethodMappings = roleOTElem.getMethodMappings();
+        assertEquals(8, allMethodMappings.length);
+        
+        IMethodMapping[] calloutMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLOUTS);
+        assertEquals(0, calloutMethodMappings.length);
+        
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        assertEquals(8, callinMethodMappings.length);
+    }
+    
+    public void testMapping1() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[0];
+        assertNotNull(mapping);
+        
+        assertEquals("roleMethod1 <- baseMethod1", mapping.getElementName());
+        assertEquals(IOTJavaElement.CALLIN_MAPPING, mapping.getMappingKind());
+        
+        IMethod roleMethod = mapping.getRoleMethod();
+        assertNotNull(roleMethod);
+        assertEquals("roleMethod1", roleMethod.getElementName());
+        
+        ICallinMapping callinMapping = (ICallinMapping) mapping;
+        IMethod[] boundBaseMethods = callinMapping.getBoundBaseMethods();
+        assertNotNull(boundBaseMethods);
+        assertEquals(1, boundBaseMethods.length);
+        assertEquals("baseMethod1", boundBaseMethods[0].getElementName());
+    }
+
+    public void testMapping1FromMemento() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[0];
+        assertNotNull(mapping);
+        
+        String token = mapping.getHandleIdentifier();
+        
+        SourceType sourceType = (SourceType)roleOTElem.getCorrespondingJavaElement();
+		IJavaElement fromMemento = JavaCore.create(token, sourceType.getCompilationUnit().getOwner());
+        
+        assertEquals("Elements should be equal", mapping, fromMemento);
+        
+        assertTrue("Element should exist", fromMemento.exists());
+        
+        assertFalse("Mapping should not have signature", ((IMethodMapping)fromMemento).hasSignature());
+    }
+    
+    public void testMapping2() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[1];
+        assertNotNull(mapping);
+ 
+        assertEquals("roleMethodA <- baseMethod2", mapping.getElementName());
+        assertEquals(IOTJavaElement.CALLIN_MAPPING, mapping.getMappingKind());
+        
+        IMethod roleMethod = mapping.getRoleMethod();
+        assertNull(roleMethod);
+        
+        ICallinMapping callinMapping = (ICallinMapping) mapping;
+        IMethod[] boundBaseMethods = callinMapping.getBoundBaseMethods();
+        assertNotNull(boundBaseMethods);
+        assertEquals(1, boundBaseMethods.length);
+        assertEquals("baseMethod2", boundBaseMethods[0].getElementName());
+    }
+ 
+    public void testMapping3() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[2];
+        assertNotNull(mapping);
+        
+        assertEquals("roleMethod2 <- baseMethodA", mapping.getElementName());
+        assertEquals(IOTJavaElement.CALLIN_MAPPING, mapping.getMappingKind());
+        
+        IMethod roleMethod = mapping.getRoleMethod();
+        assertNotNull(roleMethod);
+        assertEquals("roleMethod2", roleMethod.getElementName());
+        
+        ICallinMapping callinMapping = (ICallinMapping) mapping;
+        IMethod[] boundBaseMethods = callinMapping.getBoundBaseMethods();
+        assertEquals(0, boundBaseMethods.length);
+    }
+    
+    public void testMapping4() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[3];
+        assertNotNull(mapping);
+        
+        assertEquals("roleMethodB <- baseMethodB", mapping.getElementName());
+        assertEquals(IOTJavaElement.CALLIN_MAPPING, mapping.getMappingKind());
+        
+        IMethod roleMethod = mapping.getRoleMethod();
+        assertNull(roleMethod);
+  
+        ICallinMapping callinMapping = (ICallinMapping) mapping;
+        IMethod[] boundBaseMethods = callinMapping.getBoundBaseMethods();
+        assertEquals(0, boundBaseMethods.length);
+    }
+    
+    public void testMapping5() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[4];
+        assertNotNull(mapping);
+        
+        assertEquals("roleMethod3 <- {baseMethod3,baseMethod4,baseMethodC}", mapping.getElementName());
+        assertEquals(IOTJavaElement.CALLIN_MAPPING, mapping.getMappingKind());
+        
+        IMethod roleMethod = mapping.getRoleMethod();
+        assertNotNull(roleMethod);
+        assertEquals("roleMethod3", roleMethod.getElementName());
+        
+        ICallinMapping callinMapping = (ICallinMapping) mapping;
+        IMethod[] boundBaseMethods = callinMapping.getBoundBaseMethods();
+        assertNotNull(boundBaseMethods);
+        assertEquals(2, boundBaseMethods.length);
+        assertEquals("baseMethod3", boundBaseMethods[0].getElementName());
+        assertEquals("baseMethod4", boundBaseMethods[1].getElementName());
+    }
+    
+    public void testMapping5FromMemento() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[4];
+        assertNotNull(mapping);
+        
+        assertNotNull(mapping);
+        
+        String token = mapping.getHandleIdentifier();
+        
+        SourceType sourceType = (SourceType)roleOTElem.getCorrespondingJavaElement();
+		IJavaElement fromMemento = JavaCore.create(token, sourceType.getCompilationUnit().getOwner());
+        
+        assertEquals("Elements should be equal", mapping, fromMemento);
+        
+        assertTrue("Element should exist", fromMemento.exists());
+
+        ICallinMapping callinMapping = (ICallinMapping) fromMemento;
+        IMethod[] boundBaseMethods = callinMapping.getBoundBaseMethods();
+        assertNotNull(boundBaseMethods);
+        assertEquals(2, boundBaseMethods.length);
+        assertEquals("baseMethod3", boundBaseMethods[0].getElementName());
+        assertEquals("baseMethod4", boundBaseMethods[1].getElementName());
+    }
+    
+    public void testMapping6() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[5];
+        assertNotNull(mapping);
+        
+        assertEquals("roleMethod4 <- baseMethod4", mapping.getElementName());
+        assertEquals(IOTJavaElement.CALLIN_MAPPING, mapping.getMappingKind());
+        
+        IMethod roleMethod = mapping.getRoleMethod();
+        assertNotNull(roleMethod);
+        assertEquals("roleMethod4", roleMethod.getElementName());
+        
+        ICallinMapping callinMapping = (ICallinMapping) mapping;
+        IMethod[] boundBaseMethods = callinMapping.getBoundBaseMethods();
+        assertNotNull(boundBaseMethods);
+        assertEquals(1, boundBaseMethods.length);
+        assertEquals("baseMethod4", boundBaseMethods[0].getElementName());
+    }
+    
+    public void testMapping7() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[6];
+        assertNotNull(mapping);
+        
+        assertEquals("roleMethod5(int) <- baseMethod5(int)", mapping.getElementName());
+        assertEquals(IOTJavaElement.CALLIN_MAPPING, mapping.getMappingKind());
+        
+        IMethod roleMethod = mapping.getRoleMethod();
+        assertNotNull(roleMethod);
+        assertEquals("roleMethod5", roleMethod.getElementName());
+        
+        ICallinMapping callinMapping = (ICallinMapping) mapping;
+        IMethod[] boundBaseMethods = callinMapping.getBoundBaseMethods();
+        assertNotNull(boundBaseMethods);
+        assertEquals(1, boundBaseMethods.length);
+        assertEquals("baseMethod5", boundBaseMethods[0].getElementName());
+    }
+    
+    public void testMapping7FromMemento() throws JavaModelException
+    {
+    	IRoleType roleOTElem = getRoleOTElem();
+    	assertNotNull(roleOTElem);
+    	IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+    	
+    	IMethodMapping mapping = callinMethodMappings[6];
+    	assertNotNull(mapping);
+    	
+    	String token = mapping.getHandleIdentifier();
+    	
+    	SourceType sourceType = (SourceType)roleOTElem.getCorrespondingJavaElement();
+    	IJavaElement fromMemento = JavaCore.create(token, sourceType.getCompilationUnit().getOwner());
+    	
+    	assertEquals("Elements should be equal", mapping, fromMemento);
+    	
+    	assertTrue("Element should exist", fromMemento.exists());
+    	
+    	assertTrue("Mapping should have signature", ((IMethodMapping)fromMemento).hasSignature());
+    }
+    
+    public void testMapping8() throws JavaModelException 
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        IMethodMapping mapping = callinMethodMappings[7];
+        assertNotNull(mapping);
+        
+        assertEquals("roleMethod6() <- baseMethod6() <T>", mapping.getElementName());
+        assertEquals(IOTJavaElement.CALLIN_MAPPING, mapping.getMappingKind());
+        assertTrue(mapping.getRoleMethod().getTypeParameters().length == 1);
+        assertEquals(new String(mapping.getRoleMethodHandle().getTypeParameterNames()[0]), "T");
+        assertEquals(CharOperation.toString(mapping.getRoleMethodHandle().getTypeParameterBounds()[0]), "Object");
+        
+        ICallinMapping callinMapping = (ICallinMapping) mapping;
+        IMethod[] boundBaseMethods = callinMapping.getBoundBaseMethods();
+        assertNotNull(boundBaseMethods);
+        assertEquals(1, boundBaseMethods.length);
+        assertEquals("baseMethod6", boundBaseMethods[0].getElementName());
+        assertTrue(callinMapping.hasCovariantReturn());
+    }
+    
+    public void testMappingModifier1() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[0];        
+        assertEquals(ICallinMapping.KIND_AFTER, callinMapping.getCallinKind());
+    }
+    
+    public void testMappingModifier2() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+ 
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[1];        
+        assertEquals(ICallinMapping.KIND_BEFORE, callinMapping.getCallinKind());
+    }
+    
+    public void testMappingModifier3() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[2];        
+        assertEquals(ICallinMapping.KIND_REPLACE, callinMapping.getCallinKind());
+    } 
+    
+    public void testMappingModifier4() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[3];        
+        assertEquals(ICallinMapping.KIND_AFTER, callinMapping.getCallinKind());
+    }
+    
+    public void testMappingModifier5() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+ 
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[4];        
+        assertEquals(ICallinMapping.KIND_BEFORE, callinMapping.getCallinKind());
+    }
+    
+    public void testMappingModifier6() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[5];        
+        assertEquals(ICallinMapping.KIND_REPLACE, callinMapping.getCallinKind());
+    }
+    
+    public void testMappingModifier7() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[6];        
+        assertEquals(ICallinMapping.KIND_AFTER, callinMapping.getCallinKind());
+    }
+    
+    public void testSource1() throws JavaModelException
+    {
+    	IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[0];
+        
+        assertEquals("roleMethod1 <- after baseMethod1;", callinMapping.getSource());
+    }
+    
+    public void testSource2() throws JavaModelException
+    {
+    	IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[1];
+        
+        assertEquals("roleMethodA <- before baseMethod2;", callinMapping.getSource());
+    }
+    
+    public void testSource3() throws JavaModelException
+    {
+    	IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[2];
+        
+        assertEquals("roleMethod2 <- replace baseMethodA;", callinMapping.getSource());
+    }
+    
+    public void testSource4() throws JavaModelException
+    {
+    	IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[3];
+        
+        assertEquals("roleMethodB <- after baseMethodB;", callinMapping.getSource());
+    }
+    
+    public void testSource5() throws JavaModelException
+    {
+    	IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[4];
+        
+        assertEquals("roleMethod3 <- before baseMethod3, baseMethod4, baseMethodC;", callinMapping.getSource());
+    }
+
+    public void testSource6() throws JavaModelException
+    {
+    	IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[5];
+        
+        assertEquals("roleMethod4 <- replace baseMethod4;", callinMapping.getSource());
+    }
+        
+    public void testSource7() throws JavaModelException
+    {
+    	IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        
+        ICallinMapping callinMapping = (ICallinMapping) callinMethodMappings[6];
+        
+        assertEquals("void roleMethod5(int ir)  <- after void baseMethod5(int ib) with { ir <- ib }", callinMapping.getSource());
+    }
+}    
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/CalloutMappingTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/CalloutMappingTest.java
new file mode 100644
index 0000000..8c314a5
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/CalloutMappingTest.java
@@ -0,0 +1,212 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: CalloutMappingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.core.SourceType;
+import org.eclipse.objectteams.otdt.core.ICalloutMapping;
+import org.eclipse.objectteams.otdt.core.ICalloutToFieldMapping;
+import org.eclipse.objectteams.otdt.core.IMethodMapping;
+import org.eclipse.objectteams.otdt.core.IOTType;
+import org.eclipse.objectteams.otdt.core.IRoleType;
+import org.eclipse.objectteams.otdt.core.OTModelManager;
+
+/**
+ * $Id: CalloutMappingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ *
+ * testcase:
+ * a team class with a bound role class and various callout binding declarations
+ */
+public class CalloutMappingTest extends FileBasedModelTest
+{
+    
+    private IType _teamJavaElem;
+    private IType _roleJavaElem;
+    
+    public CalloutMappingTest(String name)
+    {
+        super(name);
+    }
+    static boolean ALL_TESTS=true;
+    public static Test suite()
+    {
+        if (ALL_TESTS) return new Suite(CalloutMappingTest.class);
+        junit.framework.TestSuite suite = new Suite(CalloutMappingTest.class.getName());
+        return suite;
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir("CalloutMapping");
+        super.setUpSuite();
+    }
+    
+    public void setUp() throws Exception
+    {
+    		super.setUp();
+    	
+        try
+        {
+            ICompilationUnit teamUnit = getCompilationUnit(
+                    "CalloutMapping", 
+                    "src",
+                    "teampkg", 
+                    "SampleTeam" + ".java");
+
+            _teamJavaElem = teamUnit.getType("SampleTeam");
+
+            _roleJavaElem = _teamJavaElem.getType("SampleRole");
+
+        }
+        catch (JavaModelException ex)
+        {
+            ex.printStackTrace();
+        }
+    }    
+    
+    private IRoleType getRoleOTElem()
+    {
+        if ((_roleJavaElem != null) && (_roleJavaElem.exists()))
+        {
+            IOTType roleOTElem = OTModelManager.getOTElement(_roleJavaElem);
+            
+            if ((roleOTElem != null) && (roleOTElem instanceof IRoleType))
+            {
+                return ((IRoleType) roleOTElem);
+            }
+        }
+        return null;
+    }
+    
+    public void testExistenceOfMappings() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        
+        IMethodMapping[] allMethodMappings = roleOTElem.getMethodMappings();
+        assertEquals(4, allMethodMappings.length);
+        
+        IMethodMapping[] calloutMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLOUTS);
+        assertEquals(4, calloutMethodMappings.length);
+        
+        IMethodMapping[] callinMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLINS);
+        assertEquals(0, callinMethodMappings.length);
+    }
+
+    public void testMapping1FromMemento() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] calloutMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLOUTS);
+        
+        IMethodMapping mapping = calloutMethodMappings[0];
+        assertNotNull(mapping);
+        
+        String token = mapping.getHandleIdentifier();
+        
+        SourceType sourceType = (SourceType)roleOTElem.getCorrespondingJavaElement();
+		IJavaElement fromMemento = JavaCore.create(token, sourceType.getCompilationUnit().getOwner());
+        
+        assertEquals("Elements should be equal", mapping, fromMemento);
+        
+        assertTrue("Element should exist", fromMemento.exists());
+        
+        assertTrue("Mapping should have signature", ((IMethodMapping)fromMemento).hasSignature());
+    }
+
+    public void testMapping2FromMemento() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] calloutMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLOUTS);
+        
+        IMethodMapping mapping = calloutMethodMappings[1];
+        assertNotNull(mapping);
+        
+        String token = mapping.getHandleIdentifier();
+        
+        SourceType sourceType = (SourceType)roleOTElem.getCorrespondingJavaElement();
+		IJavaElement fromMemento = JavaCore.create(token, sourceType.getCompilationUnit().getOwner());
+        
+        assertEquals("Elements should be equal", mapping, fromMemento);
+        
+        assertTrue("Element should exist", fromMemento.exists());
+        
+        assertFalse("Mapping should not have signature", ((IMethodMapping)fromMemento).hasSignature());
+    }
+
+    public void testMapping3FromMemento() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] calloutMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLOUTS);
+        
+        IMethodMapping mapping = calloutMethodMappings[2];
+        assertNotNull(mapping);
+        
+        String token = mapping.getHandleIdentifier();
+        
+        SourceType sourceType = (SourceType)roleOTElem.getCorrespondingJavaElement();
+		IJavaElement fromMemento = JavaCore.create(token, sourceType.getCompilationUnit().getOwner());
+        
+        assertEquals("Elements should be equal", mapping, fromMemento);
+        
+        assertTrue("Element should exist", fromMemento.exists());
+        
+        ICalloutMapping mappingFromMemento = (ICalloutMapping)fromMemento;
+		assertTrue("Mapping should have signature", mappingFromMemento.hasSignature());
+        
+        assertTrue("Expecting 1 role parameter", mappingFromMemento.getRoleMethodHandle().getArgumentTypes().length == 1);
+        assertTrue("Expecting 2 base parameters", mappingFromMemento.getBaseMethodHandle().getArgumentTypes().length == 2);
+    }
+
+    public void testMapping4FromMemento() throws JavaModelException
+    {
+        IRoleType roleOTElem = getRoleOTElem();
+        assertNotNull(roleOTElem);
+        IMethodMapping[] calloutMethodMappings = roleOTElem.getMethodMappings(IRoleType.CALLOUTS);
+        
+        IMethodMapping mapping = calloutMethodMappings[3];
+        assertNotNull(mapping);
+        
+        String token = mapping.getHandleIdentifier();
+        
+        SourceType sourceType = (SourceType)roleOTElem.getCorrespondingJavaElement();
+		IJavaElement fromMemento = JavaCore.create(token, sourceType.getCompilationUnit().getOwner());
+        
+        assertEquals("Elements should be equal", mapping, fromMemento);
+        
+        assertTrue("Element should exist", fromMemento.exists());
+        
+        assertTrue("Expecting callout to field", fromMemento instanceof ICalloutToFieldMapping);
+        ICalloutToFieldMapping mappingFromMemento = (ICalloutToFieldMapping)fromMemento;
+		assertTrue("Mapping should have signature", mappingFromMemento.hasSignature());
+        
+        assertFalse("Expecting no setter", mappingFromMemento.getBaseFieldHandle().isSetter());
+    }
+    
+}    
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/DeclaredLiftingTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/DeclaredLiftingTest.java
new file mode 100644
index 0000000..993643f
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/DeclaredLiftingTest.java
@@ -0,0 +1,135 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: DeclaredLiftingTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.tests.StringBasedTest;
+
+/**
+ * @author kaschja
+ */
+//TODO (kaschja) create tests by the time declared lifting has been made visible to the OT-Model  
+public class DeclaredLiftingTest extends StringBasedTest
+{
+	public DeclaredLiftingTest()
+	{
+		super("Declared Lifting Tests");
+	}
+	
+	public static Test suite()
+    {
+        return new Suite(DeclaredLiftingTest.class);
+    }
+	
+    /**
+     * a team class with 
+     * a bound role class and
+     * a teamlevel-method with declared lifting
+     */
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        
+        createProjectFolder("basepkg");
+        createProjectFile(
+            "/basepkg/SampleBase.java",
+            "package basepkg;\n"
+                    + "public class SampleBase \n"
+                    + "{\n"
+                    + "    public void baseMethod(String stringParameter) {}\n"
+                    + "}\n");
+        createProjectFolder("teampkg");
+        createProjectFile(
+            "/teampkg/SampleTeam.java",
+            "import basepkg.SampleBase;\n"
+                    + "package teampkg;\n"
+                    + "public team class SampleTeam \n"
+                    + "{\n"
+                    + "    public void teamlevelMethod(SampleBase as SampleRole sampleParameter){}"
+                    + "		public class SampleRole playedBy SampleBase{}\n"
+                    + "}\n");
+    }
+      
+    public void test1() throws JavaModelException
+    {        
+        IType baseJavaElem = getTestProject().findType("basepkg.SampleBase");
+        
+        IMethod[] baseMethods = baseJavaElem.getMethods();
+        assertTrue(baseMethods.length == 1);
+        
+        IMethod method = baseMethods[0];
+        assertNotNull(method);
+        
+        System.out.println("Base-Methode");
+        System.out.println("number of parameters: " + method.getNumberOfParameters()); 
+        
+        System.out.println("parameter names:");  
+        String[] paraNames = method.getParameterNames();
+        for (int idx = 0; idx < paraNames.length; idx++)
+        {
+            System.out.println(paraNames[idx]);
+        }
+        
+        System.out.println("parameter types:");  
+        String[] paraTypes = method.getParameterTypes();
+        for (int idx = 0; idx < paraTypes.length; idx++)
+        {
+            System.out.println(paraTypes[idx]);
+        }
+            
+        System.out.println("signature: " + method.getSignature() + "\n");
+        
+        //*********************************************
+        
+        IType teamJavaElem = getTestProject().findType("teampkg.SampleTeam");
+        
+        IMethod[] teamLevelMethods = teamJavaElem.getMethods();
+        assertTrue(teamLevelMethods.length == 1);
+        
+        method = teamLevelMethods[0];
+        assertNotNull(method);
+        
+        System.out.println("Teamlevel-Methode");
+        System.out.println("number of parameters: " + method.getNumberOfParameters()); 
+        
+        System.out.println("parameter names:");  
+        paraNames = method.getParameterNames();
+        for (int idx = 0; idx < paraNames.length; idx++)
+        {
+            System.out.println(paraNames[idx]);
+        }
+        
+        System.out.println("parameter types:");  
+        paraTypes = method.getParameterTypes();
+        for (int idx = 0; idx < paraTypes.length; idx++)
+        {
+            System.out.println(paraTypes[idx]);
+        }
+            
+        System.out.println("signature: " + method.getSignature() + "\n");
+        
+       System.out.println("toString: " + method.toString());
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/FileBasedModelTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/FileBasedModelTest.java
new file mode 100644
index 0000000..68d896b
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/FileBasedModelTest.java
@@ -0,0 +1,40 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: FileBasedModelTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel;
+
+import org.eclipse.objectteams.otdt.tests.FileBasedTest;
+
+/**
+ * @author anklam
+ *
+ * TODO To change the template for this generated type comment go to
+ * Window - Preferences - Java - Code Style - Code Templates
+ */
+public class FileBasedModelTest extends FileBasedTest {
+
+    public FileBasedModelTest(String name) {
+        super(name);
+    }
+
+    protected String getPluginID() {
+        return "org.eclipse.objectteams.otdt.tests";
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/OTReconcilerTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/OTReconcilerTests.java
new file mode 100644
index 0000000..7b09601
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/OTReconcilerTests.java
@@ -0,0 +1,877 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: OTReconcilerTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.util.Map;
+
+import junit.framework.Test;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.compiler.CategorizedProblem;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.tests.model.ReconcilerTests;
+import org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.eclipse.jdt.internal.compiler.Compiler;
+import org.eclipse.jdt.internal.compiler.DefaultErrorHandlingPolicies;
+import org.eclipse.jdt.internal.compiler.ICompilerRequestor;
+import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
+import org.eclipse.jdt.internal.compiler.IProblemFactory;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
+import org.eclipse.jdt.internal.compiler.env.INameEnvironment;
+import org.eclipse.jdt.internal.compiler.env.ISourceType;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
+import org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
+import org.eclipse.jdt.internal.compiler.parser.Parser;
+import org.eclipse.jdt.internal.compiler.parser.SourceTypeConverter;
+import org.eclipse.jdt.internal.compiler.problem.DefaultProblemFactory;
+import org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
+import org.eclipse.jdt.internal.core.JavaProject;
+import org.eclipse.jdt.internal.core.SearchableEnvironment;
+import org.eclipse.jdt.internal.core.SourceType;
+import org.eclipse.text.edits.DeleteEdit;
+import org.eclipse.objectteams.otdt.core.IOTType;
+import org.eclipse.objectteams.otdt.core.OTModelManager;
+import org.eclipse.objectteams.otdt.core.ext.OTDTPlugin;
+import org.eclipse.objectteams.otdt.core.ext.OTREContainer;
+import org.eclipse.objectteams.otdt.internal.core.compiler.control.Dependencies;
+import org.eclipse.objectteams.otdt.internal.core.compiler.control.ITranslationStates;
+
+/**
+ * Tests for errors shown only in the gutter (CompilationUnitProblemFinder),
+ * but not reported by the ImageBuilder.
+ * 
+ * @author stephan
+ * @since 1.2.1
+ */
+public class OTReconcilerTests extends ReconcilerTests {
+
+	public static Test suite() {
+		return buildModelTestSuite(OTReconcilerTests.class);
+	}
+	
+	public OTReconcilerTests(String name) {
+		super(name);
+	}
+	
+	static {
+//		TESTS_NAMES = new String[] { "testAnchoredType01", "testAnchoredType02", "testAnchoredType03" };
+	}
+// ===== Copied all our modifications from AbstractJavaModelTests ===== 
+	/*
+	 * Returns the OS path to the external directory that contains external jar files.
+	 * This path ends with a File.separatorChar.
+	 */
+	protected String getExternalPath() {
+		if (EXTERNAL_JAR_DIR_PATH == null)
+			try {
+				String path = getWorkspaceRoot().getLocation().toFile().getParentFile().getCanonicalPath();
+				if (path.charAt(path.length()-1) != File.separatorChar)
+					path += File.separatorChar;
+				EXTERNAL_JAR_DIR_PATH = path;
+//{ObjectTeams: use separate dir for our JCL since we use a modified version which must not conflict with the std version:
+				EXTERNAL_JAR_DIR_PATH += "OTJCLDir"+File.separatorChar;
+// SH}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		return EXTERNAL_JAR_DIR_PATH;
+	}
+	/**
+	 * Returns the OS path to the directory that contains this plugin.
+	 */
+	protected String getPluginDirectoryPath() {
+		try {
+//{ObjectTeams: adjust plugin id from org.eclipse.jdt.core.tests.model to org.eclipse.objectteams.otdt.tests 
+			URL platformURL = Platform.getBundle("org.eclipse.objectteams.otdt.tests").getEntry("/");
+//carp}
+			return new File(FileLocator.toFileURL(platformURL).getFile()).getAbsolutePath();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return null;
+	}
+	protected IJavaProject setUpJavaProject(final String projectName) throws CoreException, IOException {
+//{ObjectTeams: OT/J needs at least 1.5 (was 1.4):
+		IJavaProject javaProject = setUpJavaProject(projectName, "1.5");
+		return javaProject;
+// SH}
+	}
+//{ObjectTeams: copy jcl at least once per test run:
+	private static boolean forceCopyJCL= true; 
+// SH}
+	/**
+	 * Check locally for the required JCL files, <jclName>.jar and <jclName>src.zip.
+	 * If not available, copy from the project resources.
+	 */
+	public void setupExternalJCL(String jclName) throws IOException {
+		String externalPath = getExternalPath();
+		String separator = java.io.File.separator;
+		String resourceJCLDir = getPluginDirectoryPath() + separator + "JCL";
+		java.io.File jclDir = new java.io.File(externalPath);
+		java.io.File jclMin =
+			new java.io.File(externalPath + jclName + ".jar");
+		java.io.File jclMinsrc = new java.io.File(externalPath + jclName + "src.zip");
+		if (!jclDir.exists()) {
+			if (!jclDir.mkdir()) {
+				//mkdir failed
+				throw new IOException("Could not create the directory " + jclDir);
+			}
+			//copy the two files to the JCL directory
+			java.io.File resourceJCLMin =
+				new java.io.File(resourceJCLDir + separator + jclName + ".jar");
+			copy(resourceJCLMin, jclMin);
+			java.io.File resourceJCLMinsrc =
+				new java.io.File(resourceJCLDir + separator + jclName + "src.zip");
+			copy(resourceJCLMinsrc, jclMinsrc);
+		} else {
+			//check that the two files, jclMin.jar and jclMinsrc.zip are present
+			//copy either file that is missing or less recent than the one in workspace
+			java.io.File resourceJCLMin =
+				new java.io.File(resourceJCLDir + separator + jclName + ".jar");
+//{ObjectTeams: added option forceCopyJCL
+			if (forceCopyJCL ||
+				(jclMin.lastModified() < resourceJCLMin.lastModified())
+                    || (jclMin.length() != resourceJCLMin.length())) {
+				copy(resourceJCLMin, jclMin);
+			}
+			java.io.File resourceJCLMinsrc =
+				new java.io.File(resourceJCLDir + separator + jclName + "src.zip");
+			if (forceCopyJCL ||
+				(jclMinsrc.lastModified() < resourceJCLMinsrc.lastModified())
+                    || (jclMinsrc.length() != resourceJCLMinsrc.length())) {
+				copy(resourceJCLMinsrc, jclMinsrc);
+			}
+			if (forceCopyJCL)
+				System.out.println("Test "+this.getClass().getName()+" has copied jclMin.");
+			forceCopyJCL= false; // done
+// SH}
+		}
+	}
+	
+// ===== End COPY_AND_PASTE
+	
+	protected IJavaProject createOTJavaProject(String projectName, String[] sourceFolders, String[] libraries, String output) throws CoreException {
+		IJavaProject javaProject = createJavaProject(projectName, sourceFolders, libraries, output, "1.5");
+		IProjectDescription description = javaProject.getProject().getDescription();
+		description.setNatureIds(OTDTPlugin.createProjectNatures(description));
+		javaProject.getProject().setDescription(description, null);
+		javaProject.setOption(CompilerOptions.OPTION_ReportWeaveIntoSystemClass, CompilerOptions.IGNORE);
+		return javaProject;
+	}
+
+	// http://trac.objectteams.org/ot/ticket/142
+	public void testTrac142() throws CoreException, InterruptedException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "bin");
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			//prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+			this.createFile(
+				"/P/SuperFoo.java",
+				"public team class SuperFoo {\n" +
+				"	public class Role {}\n" +
+				"	public SuperFoo(Role r) {\n" +
+				"	}\n" +
+				"}\n"
+			);
+			String sourceFoo = "public team class Foo extends SuperFoo {\n" +
+			"	public class Role playedBy String {}\n" +
+			"	public Foo(String as Role r) {\n" +
+			"       super(r);\n" +
+			"	}\n" +
+			"}\n";
+			this.createFile(
+					"/P/Foo.java",
+					sourceFoo
+			);
+
+			char[] sourceChars = sourceFoo.toCharArray();
+			this.problemRequestor.initialize(sourceChars);
+		
+			
+			getCompilationUnit("/P/Foo.java").getWorkingCopy(this.wcOwner, null);
+			
+			assertProblems(
+				"Unexpected problems",
+				"----------\n" +
+				"----------\n"
+			);
+		} finally {
+			deleteProject("P");
+		}
+	}
+	
+	// http://trac.objectteams.org/ot/ticket/143 (comment1)
+	public void testTrac143b() throws CoreException, InterruptedException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "bin");
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+			this.createFile(
+				"/P/SuperFoo.java",
+				"public team class SuperFoo {\n" +
+				"	public abstract class Role {\n" +
+				"		abstract void foo();\n" +
+				"	}\n" +
+				"}\n"
+			);
+			String sourceFoo = "public team class Foo extends SuperFoo {\n" +
+			"	public class Role playedBy String {\n" +
+			"		void foo() -> int length();\n" +
+			"	}\n" +
+			"}\n";
+			this.createFile(
+					"/P/Foo.java",
+					sourceFoo
+			);
+			String sourceSubFoo = "public team class SubFoo extends Foo {\n" +
+			"	public class Role {}\n" +
+			"}\n";
+			this.createFile(
+					"/P/SubFoo.java",
+					sourceSubFoo
+			);
+
+			char[] sourceChars = sourceSubFoo.toCharArray();
+			this.problemRequestor.initialize(sourceChars);
+		
+			
+			getCompilationUnit("/P/SubFoo.java").getWorkingCopy(this.wcOwner, null);
+			
+			assertProblems(
+				"Unexpected problems",
+				"----------\n" +
+				"----------\n"
+			);
+		} finally {
+			deleteProject("P");
+		}
+	}
+	
+
+	// http://trac.objectteams.org/ot/ticket/248
+	public void testTrac248() throws CoreException, InterruptedException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {"src"}, new String[] {"JCL15_LIB"}, "bin");
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+			// ROFI will be pulled in via CompilationUnitProblemFinder.accept -> SourceTypeConverter.buildCompilationUnit
+			this.createFolder("/P/src/FooTeam");
+			this.createFile(
+					"/P/src/FooTeam/R.java",
+					"team package FooTeam;\n" +
+					"protected class R {\n" +
+					"    private static int getI() {\n" + 
+					"        return 3;\n" + 
+					"    }\n" + 
+					"    protected int test() {\n" + 
+					"        return getI();\n" + 
+					"    }\n" +
+					"}\n");
+			
+			String sourceTeam = 
+				"public team class FooTeam {\n" +
+				"   R r;\n" +
+				"}\n";
+			this.createFile(
+					"/P/src/FooTeam.java",
+					sourceTeam
+			);
+
+			char[] sourceChars = sourceTeam.toCharArray();
+			this.problemRequestor.initialize(sourceChars);
+		
+			
+			getCompilationUnit("/P/src/FooTeam.java").getWorkingCopy(this.wcOwner, null);
+			
+			assertProblems(
+				"Unexpected problems",
+				"----------\n" +
+				"----------\n"
+			);
+		} finally {
+			deleteProject("P");
+		}
+	}	
+
+	// http://trac.objectteams.org/ot/ticket/259
+	public void testTrac259() throws CoreException, InterruptedException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "bin");
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+			this.createFile(
+				"/P/MyBase.java",
+				"public class MyBase {\n" +
+				"	private void secretDo() {\n" +
+				"	}\n" +
+				"}\n"
+			);
+			this.createFolder("/P/Foo");
+			this.createFile("/P/Foo/Role.java", 
+					"team package Foo;\n" +
+					"protected class Role playedBy MyBase {\n" +
+					"	protected void doit() -> void secretDo();\n" +
+					"}\n");
+			String sourceFoo = "public team class Foo {\n" +
+			"	protected void test(Role r) {\n" +
+			" 		r.doit();\n" +
+			"	}\n" +
+			"}\n";
+			this.createFile(
+					"/P/Foo.java",
+					sourceFoo
+			);
+
+			char[] sourceChars = sourceFoo.toCharArray();
+			this.problemRequestor.initialize(sourceChars);
+		
+			
+			getCompilationUnit("/P/Foo.java").getWorkingCopy(this.wcOwner, null);
+			
+			assertProblems(
+				"Unexpected problems",
+				"----------\n" +
+				"----------\n"
+			);
+		} finally {
+			deleteProject("P");
+		}
+	}
+	
+	// previously a syntax error could cause an IllegalArgumentException, see r19238 ff.
+	public void testSyntaxError() throws CoreException, InterruptedException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "bin");
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+			this.createFile(
+				"/P/Bar.java",
+				"public class Bar {\n" +
+				"   String baz() { return null;  }\n" +
+				"}\n"
+			);
+			String sourceFoo = "public team class Foo  {\n" +
+			"	public class Role playedBy String \n" +
+			"       base when (base.){\n" +
+			"       String getFoo() -> get String foo\n" +
+			"         with { result <- (String)foo }\n" +
+			"   }\n" +
+			"   void doodle() {}" +
+			"}\n";
+			this.createFile(
+					"/P/Foo.java",
+					sourceFoo
+			);
+			String sourceMain = "public class Main {\n" +
+					"void zork(Foo f) {\n" +
+					"    f.doodle();\n" +
+					"}\n" +
+					"}";
+			this.createFile(
+					"/P/Main.java",
+					sourceMain
+			);
+
+			char[] sourceChars = sourceMain.toCharArray();
+			this.problemRequestor.initialize(sourceChars);
+		
+			
+			getCompilationUnit("/P/Main.java").getWorkingCopy(this.wcOwner, null);
+			
+			assertProblems(
+				"Unexpected problems",
+				"----------\n" +
+				"----------\n"
+			);
+		} finally {
+			deleteProject("P");
+		}
+	}
+	
+	@SuppressWarnings("unchecked") // options in a raw map
+	public void testLocalInRoFi() throws CoreException, InterruptedException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "bin");
+			// set compliance to 1.6 to force generated of a stack map attribute.
+			Map options = p.getOptions(true);
+			options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_6);
+			options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_6);
+			options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_6);
+			p.setOptions(options);
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+			this.createFile(
+				"/P/Plain.java",
+				"public class Plain {\n" +
+				"    public Object getVal() {\n" + 
+				"        return \"Plain\";\n" + 
+				"    }\n" +
+				"}\n"
+			);
+			String sourceTeam = "public team class Foo {\n" +
+				"    String foo, blub, bar, dings, wurgs, zork;\n" + 
+				"    public static void main(String[] args) {\n" + 
+				"        new Foo().new Role().test();\n" + 
+				"    }\n" +
+				"}\n";
+			this.createFile(
+					"/P/Foo.java",
+					sourceTeam
+			);
+			this.createFolder("/P/Foo");
+			
+			String sourceRole1= "team package Foo;\n" +
+				"@SuppressWarnings(\"unused\")\n" +
+				"public class Role1 {\n" +
+				"	String s1, s2, s3, s4, s5, s6;\n" +
+				"}\n";
+			this.createFile(
+					"/P/Foo/Role1.java",
+					sourceRole1);
+
+			String sourceRole2 = "team package Foo;\n" +
+				"@SuppressWarnings(\"unused\")\n" +
+				"public class Role2 extends Role1 {\n" +
+				"        protected void test() {\n" + 
+				"            Plain isub = new Plain() {\n" + 
+				"                public Object getVal() {\n" + 
+				"                    Object edits = super.getVal();\n" + 
+				"                    if (edits instanceof String) {\n" + 
+				"                        String string = (String)edits;\n" + 
+				"                        int l = string.length();\n" + 
+				"                    }\n" + 
+				"                    return edits;\n" + 
+				"                }\n" + 
+				"            };\n" + 
+				"            Object v = isub.getVal();\n" + 
+				"        }\n" +
+				"}\n";
+			this.createFile(
+					"/P/Foo/Role2.java",
+					sourceRole2
+			);
+
+			char[] sourceChars = sourceRole2.toCharArray();
+			this.problemRequestor.initialize(sourceChars);
+		
+			
+			ICompilationUnit wc = getCompilationUnit("/P/Foo/Role2.java").getWorkingCopy(this.wcOwner, null);
+			wc.reconcile(AST.JLS3, 
+						 ICompilationUnit.FORCE_PROBLEM_DETECTION|ICompilationUnit.ENABLE_STATEMENTS_RECOVERY|ICompilationUnit.ENABLE_BINDINGS_RECOVERY,
+						 wc.getOwner(), null);
+			
+			assertProblems(
+				"Unexpected problems",
+				"----------\n" +
+				"----------\n" +
+				"----------\n" +
+				"----------\n"
+			);
+		} finally {
+			deleteProject("P");
+		}
+	}
+	
+
+	@SuppressWarnings("unchecked") // options in a raw map
+	public void testRemoveRole() throws CoreException, InterruptedException, UnsupportedEncodingException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "bin");
+			// set compliance to 1.6 to force generated of a stack map attribute.
+			Map options = p.getOptions(true);
+			options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_6);
+			options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_6);
+			options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_6);
+			p.setOptions(options);
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+
+			String sourceTeam = "public team class Foo {\n" +
+				"	public class Role1 {\n" +
+				"		String s1, s2, s3, s4, s5, s6;\n" +
+				"	}\n" +
+				"   String foo, blub, bar, dings, wurgs, zork;\n" + 
+				"   public static void main(String[] args) {\n" + 
+				"       new Foo().new Role1().test();\n" + 
+				"   }\n" +
+				"}\n";
+			this.createFile(
+					"/P/Foo.java",
+					sourceTeam
+			);
+					
+			this.problemRequestor.initialize(sourceTeam.toCharArray());
+			
+			ICompilationUnit wc = getCompilationUnit("/P/Foo.java").getWorkingCopy(this.wcOwner, null);
+			IType itype = wc.getType("Foo");
+			IOTType ottype = OTModelManager.getOTElement(itype);
+			IType rt = ottype.getRoleType("Role1");
+			IOTType roleType = OTModelManager.getOTElement(rt); // this caches the role type
+			assertTrue ("Role should initially exist", rt.exists());
+			assertTrue ("RoleType should initially exist", roleType.exists());
+			
+			// delete Role1
+			wc.applyTextEdit(new DeleteEdit(
+					("public team class Foo {\n").length(), 
+					("	public class Role1 {\n" +
+							"		String s1, s2, s3, s4, s5, s6;\n" +
+					"	}\n").length()), 
+					null);
+			wc.reconcile(AST.JLS3, 
+					ICompilationUnit.FORCE_PROBLEM_DETECTION|ICompilationUnit.ENABLE_STATEMENTS_RECOVERY|ICompilationUnit.ENABLE_BINDINGS_RECOVERY,
+					wc.getOwner(), null);
+			
+			// watch that
+			// ... the JavaElement no longer exists:
+			rt = itype.getType("Role1");
+			assertFalse ("Role should no longer exist", rt.exists());
+			// ... and OTModel no longer has a RoleType:
+			ottype = OTModelManager.getOTElement(itype);
+			rt = ottype.getRoleType("Role1");
+			assertNull("Role should be null", rt);			
+		} finally {
+			deleteProject("P");
+		}
+	}
+
+	public void testAnchoredType01() throws CoreException, InterruptedException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "bin");
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			//prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+			this.createFile(
+				"/P/BaseTeam.java",
+				"public team class BaseTeam {\n" +
+				"	public class Role {}\n" +
+				"}\n"
+			);
+			
+			String sourceFoo = "public team class Foo {\n" +
+					"   protected team class Mid playedBy BaseTeam {\n" +
+					"		public class Inner1 playedBy Role<@Mid.base> {}\n" +
+					"		protected class Inner2 playedBy Role<@base> {}\n" +
+					"		@SuppressWarnings(\"roletypesyntax\")\n" +
+					"		protected class Inner3 playedBy base.Role {}\n" +
+					"	}\n" +
+					"}\n";
+			this.createFile(
+					"/P/Foo.java",
+					sourceFoo
+			);
+
+			char[] sourceChars = sourceFoo.toCharArray();
+			this.problemRequestor.initialize(sourceChars);
+			
+			ICompilationUnit fooWC = getCompilationUnit("/P/Foo.java").getWorkingCopy(this.wcOwner, null);
+			IType foo =  fooWC.getType("Foo");
+			
+			CompilerOptions compilerOptions = new CompilerOptions(p.getOptions(true));
+			ProblemReporter problemReporter = new ProblemReporter(
+					DefaultErrorHandlingPolicies.proceedWithAllProblems(),
+					compilerOptions,
+					new DefaultProblemFactory());
+			
+			// force usage of type converter:
+			CompilationUnitDeclaration parsedUnit =
+				SourceTypeConverter.buildCompilationUnit(
+						new ISourceType[] {(ISourceType) ((SourceType)foo).getElementInfo()},
+						SourceTypeConverter.FIELD_AND_METHOD | SourceTypeConverter.MEMBER_TYPE,
+						problemReporter,
+						new CompilationResult("Foo.java".toCharArray(), 1, 1, 90));
+			
+			// force resolving:
+			process(parsedUnit, p, compilerOptions, problemReporter, ITranslationStates.STATE_RESOLVED);
+			
+			// evaluate result:
+			String result = "";
+			CategorizedProblem[] problems = parsedUnit.compilationResult().problems;
+			assertNotNull(problems);
+			for (IProblem problem : problems)
+				if (problem != null && problem.isError())
+					result += problem;
+			assertEquals("", result);
+		} finally {
+			deleteProject("P");
+		}
+	}
+	
+	public void testAnchoredType02() throws CoreException, InterruptedException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "bin");
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			//prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+			this.createFile(
+				"/P/BaseTeam.java",
+				"public team class BaseTeam {\n" +
+				"	public class Role {}\n" +
+				"   Role baseField;" +
+				"}\n"
+			);
+			
+			String sourceFoo = "public team class Foo {\n" +
+					"   protected team class Mid playedBy BaseTeam {\n" +
+					"		public class Inner playedBy Role<@Mid.base> {}\n" +
+					"       Inner get1() -> get Role<@Mid.base> baseField;\n" +
+					"       Inner get2() -> get Role<@base> baseField;\n" +
+					"		@SuppressWarnings(\"roletypesyntax\")\n" +
+					"       Inner get3() -> get base.Role baseField;\n" +
+					"	}\n" +
+					"}\n";
+			this.createFile(
+					"/P/Foo.java",
+					sourceFoo
+			);
+
+			char[] sourceChars = sourceFoo.toCharArray();
+			this.problemRequestor.initialize(sourceChars);
+			
+			ICompilationUnit fooWC = getCompilationUnit("/P/Foo.java").getWorkingCopy(this.wcOwner, null);
+			IType foo =  fooWC.getType("Foo");
+			
+			CompilerOptions compilerOptions = new CompilerOptions(p.getOptions(true));
+			ProblemReporter problemReporter = new ProblemReporter(
+					DefaultErrorHandlingPolicies.proceedWithAllProblems(),
+					compilerOptions,
+					new DefaultProblemFactory());
+			
+			// force usage of type converter:
+			CompilationUnitDeclaration parsedUnit =
+				SourceTypeConverter.buildCompilationUnit(
+						new ISourceType[] {(ISourceType) ((SourceType)foo).getElementInfo()},
+						SourceTypeConverter.FIELD_AND_METHOD | SourceTypeConverter.MEMBER_TYPE,
+						problemReporter,
+						new CompilationResult("Foo.java".toCharArray(), 1, 1, 90));
+			
+			// force resolving:
+			process(parsedUnit, p, compilerOptions, problemReporter, ITranslationStates.STATE_RESOLVED);
+			
+			// evaluate result:
+			String result = "";
+			CategorizedProblem[] problems = parsedUnit.compilationResult().problems;
+			assertNotNull(problems);
+			for (IProblem problem : problems)
+				if (problem != null && problem.isError())
+					result += problem;
+			assertEquals("", result);
+		} finally {
+			deleteProject("P");
+		}
+	}
+
+	class SourceTypeCompiler extends Compiler {
+		public SourceTypeCompiler(INameEnvironment nameEnvironment,
+				IErrorHandlingPolicy policy,
+				CompilerOptions compilerOptions,
+				IProblemFactory problemFactory) 
+		{
+			super(nameEnvironment, policy, compilerOptions, 
+				  new ICompilerRequestor() { public void acceptResult(CompilationResult result) { } },
+				  problemFactory);
+		}
+
+		// from CompilationUnitProblemFinder:
+		public void accept(ISourceType[] sourceTypes, PackageBinding packageBinding, AccessRestriction accessRestriction) {
+			// ensure to jump back to toplevel type for first one (could be a member)
+//				while (sourceTypes[0].getEnclosingType() != null)
+//					sourceTypes[0] = sourceTypes[0].getEnclosingType();
+
+			CompilationResult result =
+				new CompilationResult(sourceTypes[0].getFileName(), 1, 1, this.options.maxProblemsPerUnit);
+
+			// need to hold onto this
+			CompilationUnitDeclaration unit =
+				SourceTypeConverter.buildCompilationUnit(
+					sourceTypes,//sourceTypes[0] is always toplevel here
+					SourceTypeConverter.FIELD_AND_METHOD // need field and methods
+					| SourceTypeConverter.MEMBER_TYPE // need member types
+					| SourceTypeConverter.FIELD_INITIALIZATION, // need field initialization
+					this.lookupEnvironment.problemReporter,
+					result);
+
+			if (unit != null) {
+	//{ObjectTeams: controlled by Dependencies:
+			  boolean newDependencySetup= false;
+			  try {
+				if (!Dependencies.isSetup()) {
+					newDependencySetup= true;
+					Dependencies.setup(this, this.parser, this.lookupEnvironment, true, false);
+				}
+				// Note(SH): this will redirect:
+				this.lookupEnvironment.buildTypeBindings(unit, accessRestriction);
+				this.lookupEnvironment.completeTypeBindings(unit);
+			  } finally {
+				if (newDependencySetup)
+					Dependencies.release(this);
+			  }
+	// SH}
+			}
+		}
+	}
+	private void process(CompilationUnitDeclaration parsedUnit, IJavaProject p,
+			CompilerOptions compilerOptions, ProblemReporter problemReporter, int state)
+			throws JavaModelException {
+		Parser parser = new Parser(problemReporter, false);
+		INameEnvironment nameEnvironment = new SearchableEnvironment((JavaProject)p, this.wcOwner);
+		Compiler compiler = new SourceTypeCompiler(
+					nameEnvironment, 
+					DefaultErrorHandlingPolicies.proceedWithAllProblems(), 
+					compilerOptions, 
+					problemReporter.problemFactory);
+		
+		Dependencies.setup(this, parser, compiler.lookupEnvironment, true, false);
+		Dependencies.ensureState(parsedUnit, state);
+	}
+	
+	public void testAnchoredType03() throws CoreException, InterruptedException {
+		try {
+			// Resources creation
+			IJavaProject p = createOTJavaProject("P", new String[] {""}, new String[] {"JCL15_LIB"}, "bin");
+			IProject project = p.getProject();
+			IProjectDescription prjDesc = project.getDescription();
+			//prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+			prjDesc.setBuildSpec(OTDTPlugin.createProjectBuildCommands(prjDesc));
+			project.setDescription(prjDesc, null);
+
+			OTREContainer.initializeOTJProject(project);
+
+			this.createFile(
+				"/P/BaseTeam.java",
+				"public team class BaseTeam {\n" +
+				"	public class Role {}\n" +
+				"}\n"
+			);
+			String sourceFoo = "public team class Foo {\n" +
+					"   protected team class Mid playedBy BaseTeam {\n" +
+					"		public class Inner1 playedBy Role<@Mid.base> {}\n" +
+					"		protected class Inner2 playedBy Role<@base> {}\n" +
+					"		@SuppressWarnings(\"roletypesyntax\")\n" +
+					"		protected class Inner3 playedBy base.Role {}\n" +
+					"	}\n" +
+					"}\n";
+			this.createFile(
+					"/P/Foo.java",
+					sourceFoo
+			);
+
+			char[] sourceChars = sourceFoo.toCharArray();
+			this.problemRequestor.initialize(sourceChars);
+		
+			this.createFile(
+					"/P/Main.java",
+					"public team class Main extends Foo {\n" +
+					"	public team class Mid {\n" +
+					"		public class Inner1 {}\n" +
+					"		public class Inner2 {}\n" +
+					"		public class Inner3 {}\n" +
+					"	}\n" +
+					"}\n"
+			);
+			
+			getCompilationUnit("/P/Main.java").getWorkingCopy(this.wcOwner, null);
+			
+			assertProblems(
+				"Unexpected problems",
+				"----------\n" +
+				"----------\n"
+			);
+		} finally {
+			deleteProject("P");
+		}
+	}
+	
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/TestDataHandler.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/TestDataHandler.java
new file mode 100644
index 0000000..f868ad2
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/TestDataHandler.java
@@ -0,0 +1,64 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: TestDataHandler.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author  jwloka
+ * @version $Id: TestDataHandler.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class TestDataHandler
+{
+    private static TestDataHandler _singleton;
+    private Map<String, TestSetting> _mapping = new HashMap<String, TestSetting>(); // test case::test setting
+     
+    private TestDataHandler()
+    {
+        _singleton = this;
+    }
+    
+    /**
+     * Assigns a <code>FileBasedTest</code>-test case to a specific <code>TestSetting</code>.
+     */
+    public static void addTestSetting(Class testCase, TestSetting ts)
+    {
+        if (ts != null)
+        {
+            getMapping().put(testCase.getName(), ts);
+        }
+    }
+    
+    public static TestSetting getTestSetting(Class testClass)
+    {
+        return (TestSetting)getMapping().get(testClass.getName());
+    }
+    
+    private static Map<String,TestSetting> getMapping()
+    {
+        if (_singleton == null)
+        {
+            new TestDataHandler();
+        }
+        return _singleton._mapping;
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/TestSetting.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/TestSetting.java
new file mode 100644
index 0000000..d8c044a
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/TestSetting.java
@@ -0,0 +1,168 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: TestSetting.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.IOTType;
+import org.eclipse.objectteams.otdt.core.OTModelManager;
+
+/**
+ * @author kaschja
+ * @version $Id: TestSetting.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+// FIXME: why does this inherit FileBasedModelTest??? See also setUp() and tearDown() comments!
+public class TestSetting extends FileBasedModelTest
+{
+    private static final String SAMPLE_ROLE_NAME = "SampleRole";
+
+    private List<String> _roleNames;
+    private String _testProject;
+    private String _srcDir;
+    private String _teamPkg;
+    private String _teamClass;
+    
+    private IType _teamJavaElem;
+    
+    public TestSetting(String testPrj, String srcDir, String teamPkg)
+    {
+        super(createName(testPrj, srcDir, teamPkg));
+        
+        _testProject = testPrj;
+        _srcDir = srcDir;
+        _teamPkg = teamPkg;
+        
+        setUsePerformanceMeter(false);
+    }
+    
+    public static String createName(String testPrj, String srcDir, String teamPkg)
+    {
+    	StringBuffer buffer = new StringBuffer("TestSetting");
+    	buffer.append("/").append(testPrj);
+    	buffer.append("/").append(srcDir);
+    	buffer.append("/").append(teamPkg);
+    	
+    	return buffer.toString();
+    }
+    
+    public void setUp() throws Exception
+    {
+		super.setUp();
+        try
+        {
+            ICompilationUnit teamUnit = getCompilationUnit(
+                    _testProject,
+                    _srcDir,
+                    _teamPkg, 
+                    _teamClass + ".java");
+
+            _teamJavaElem = teamUnit.getType(_teamClass);
+        }
+        catch (JavaModelException ex)
+        {
+            ex.printStackTrace();
+        }
+    }
+    
+    protected void tearDown() throws Exception 
+    {
+		super.tearDown();
+    }
+    
+    public IType getTeamJavaElement()
+    {
+        return _teamJavaElem;
+    }
+
+    public IType getRoleJavaElement()
+    {
+        //TODO(jwl): Fix to parse the Team file for an external role!
+        _teamJavaElem.exists();
+        
+        IOTType teamOTElem = OTModelManager.getOTElement(_teamJavaElem);
+        assertNotNull("The team type you're trying to test, seems not to exist for the OTModel!", teamOTElem);
+        
+        return teamOTElem.getRoleType(getRoleName());
+    }
+    
+    public IType[] getRoleJavaElements()
+    {       
+        if (_roleNames == null)
+        {
+            return new IType[] { getRoleJavaElement() };
+        }
+        
+        //TODO(jwl): Fix to parse the Team file for an external role!
+        _teamJavaElem.exists();
+        
+        IOTType teamOTElem = OTModelManager.getOTElement(_teamJavaElem);
+        assertNotNull("The team type you're trying to test, seems not to exist for the OTModel!", teamOTElem);
+        
+        List<IType> roles = new LinkedList<IType>();
+        for (Iterator<String> roleIter = _roleNames.iterator(); roleIter.hasNext();)
+        {
+            String roleName = roleIter.next();
+            IType role = teamOTElem.getRoleType(roleName);
+            assertNotNull("The role type you're trying to test seems not to exist!", role);
+            if (role != null)
+            {
+                roles.add(role);
+            }
+        }
+        
+        return roles.toArray(new IType[roles.size()]);
+    }
+    
+    public String getTeamClass()
+    {
+        return _teamClass;
+    }
+    
+    public String getRoleName()
+    {
+        return SAMPLE_ROLE_NAME;
+    } 
+    
+    public String getTestProject()
+    {
+        return _testProject;
+    }
+
+    public void setTeamClass(String teamName)
+    {
+        _teamClass = teamName;
+    }
+    
+    public void setRoleNames(String[] names)
+    {
+        _roleNames = new ArrayList<String>(names.length);
+        for (int idx = 0; idx < names.length; idx++)
+        {
+        	_roleNames.add(names[idx]);
+		}
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/AllTests.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/AllTests.java
new file mode 100644
index 0000000..5fcb623
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/AllTests.java
@@ -0,0 +1,93 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * $Id: AllTests.java 23494 2010-02-05 23:06:44Z stephan $
+ */
+public class AllTests extends TestCase
+{
+    public AllTests(String name) 
+    {
+        super(name);
+    }
+
+    public static Class[] getAllTestClasses()
+    {
+        return new Class[]
+        {
+            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.Test1.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.Test2.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.Test3a.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.Test3b.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.Test4.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.Test5.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.Test6.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.Test7.class,
+            org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal.Test8.class,
+        };
+    }
+
+    public static Test suite()
+    {
+        TestSuite ts = new TestSuite(AllTests.class.getName());
+
+        Class[] testClasses = getAllTestClasses();
+        // Reset forgotten subsets of tests
+//        AbstractJavaModelTests.testsNames = null;
+//        AbstractJavaModelTests.testsNumbers = null;
+//        AbstractJavaModelTests.testsRange = null;
+
+        for (int idx = 0; idx < testClasses.length; idx++)
+        {
+            Class<?> testClass = testClasses[idx];
+
+            // call the suite() method and add the resulting suite to the suite
+            try
+            {
+                Method suiteMethod = testClass.getDeclaredMethod(
+                    "suite", new Class<?>[0]); //$NON-NLS-1$
+                Test suite = (Test) suiteMethod.invoke(null, new Object[0]);
+                ts.addTest(suite);
+            }
+            catch (IllegalAccessException ex)
+            {
+                ex.printStackTrace();
+            }
+            catch (InvocationTargetException ex)
+            {
+                ex.getTargetException().printStackTrace();
+            }
+            catch (NoSuchMethodException ex)
+            {
+                ex.printStackTrace();
+            }
+        }
+        return ts;
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/AttributeAssignmentTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/AttributeAssignmentTest.java
new file mode 100644
index 0000000..1de68d2
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/AttributeAssignmentTest.java
@@ -0,0 +1,77 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: AttributeAssignmentTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal;
+
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+
+/**
+ * $Id: AttributeAssignmentTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * superclass for all testcases
+ * in which an instance of an anonymous class is assigned to an attribut
+ */
+public abstract class AttributeAssignmentTest extends GeneralTest
+{
+    
+    private final String ATTR_NAME = "rolelevelAttr";
+    
+    public AttributeAssignmentTest(String name)
+    {
+        super(name);
+    }
+    
+    protected IType getAnonymousType() throws JavaModelException
+    {
+        IType fieldOwner = _roleJavaElem;
+        
+        if ((fieldOwner != null) && (fieldOwner.exists()))
+        {
+            IField enclosingField = fieldOwner.getField(ATTR_NAME);
+            
+            if ((enclosingField != null) && (enclosingField.exists()))
+            {
+                IType anonymousType = enclosingField.getType("",1);
+                
+                if ((anonymousType != null) && (anonymousType.exists()))
+                {
+                    return anonymousType;
+                }
+            }
+        }
+        return null;
+    } 
+    
+    public void testExistenceOfAnonymousType() throws JavaModelException
+    {
+        assertNotNull(_roleJavaElem);
+        assertTrue(_roleJavaElem.exists());
+        
+        IField rolelevelAttr = _roleJavaElem.getField(ATTR_NAME);
+        assertNotNull(rolelevelAttr);
+        assertTrue(rolelevelAttr.exists());
+        
+        IType anonymousType = rolelevelAttr.getType("",1);
+        assertNotNull(anonymousType);
+        assertTrue(anonymousType.exists());
+    }    
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/GeneralTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/GeneralTest.java
new file mode 100644
index 0000000..1be2004
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/GeneralTest.java
@@ -0,0 +1,84 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: GeneralTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.tests.otmodel.FileBasedModelTest;
+
+/**
+ * $Id: GeneralTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * superclass for all testcases
+ * in which an anonymous class is instantiated insight a role class
+ */
+public abstract class GeneralTest extends FileBasedModelTest
+{
+    
+    protected final String PROJECT =  "AnonymousInnerclass";
+    protected final String SRC_FOLDER = "rolelevelinternal";
+    protected final String TEAM_PKG = "rolelevelinternal.teampkg";
+    
+    protected IType _roleJavaElem = null;
+    
+    
+    public GeneralTest(String name)
+    {
+        super(name);
+    }
+    
+    public void setUpSuite() throws Exception
+    {
+        setTestProjectDir(PROJECT);
+        super.setUpSuite();
+    }
+    
+    protected void setUp() throws Exception
+    {
+    		super.setUp();
+    	
+        try
+        {
+            ICompilationUnit teamUnit = getCompilationUnit(
+                PROJECT,
+                SRC_FOLDER,
+                TEAM_PKG,
+                getTeamName() +".java");
+            IType teamJavaElem = teamUnit.getType(getTeamName());
+            
+            System.out.println(getClass().getName());
+            System.out.println("Teamklasse: \n" +teamJavaElem);
+            
+            _roleJavaElem = teamJavaElem.getType(getRoleName());
+            
+            System.out.println("Rollenklasse\n" +_roleJavaElem);
+        }
+        catch (JavaModelException ex)
+        {
+            ex.printStackTrace();
+        }
+    }
+    
+    protected abstract String getTeamName();
+    
+    protected abstract String getRoleName();
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/LocalClassTest.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/LocalClassTest.java
new file mode 100644
index 0000000..8b9befb
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/LocalClassTest.java
@@ -0,0 +1,79 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: LocalClassTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+
+/**
+ * $Id: LocalClassTest.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * superclass for all testcases
+ * in which the anonymous class is declared as a local class insight a method
+ */
+public abstract class LocalClassTest extends GeneralTest
+{    
+    
+    private final String METHOD_NAME = "rolelevelMethod";
+  
+    
+    public LocalClassTest(String name)
+    {
+        super(name);
+    }
+    
+    public void testExistenceOfAnonymousType() throws JavaModelException
+    {
+        assertNotNull(_roleJavaElem);
+        assertTrue(_roleJavaElem.exists());
+         
+        IMethod rolelevelMethod = _roleJavaElem.getMethod(METHOD_NAME, new String[0]);
+        assertNotNull(rolelevelMethod);
+        assertTrue(rolelevelMethod.exists());
+        
+        IType anonymousType = rolelevelMethod.getType("",1);
+        assertNotNull(anonymousType);
+        assertTrue(anonymousType.exists());
+    }  
+ 
+    
+    protected IType getAnonymousType() throws JavaModelException
+    {
+        IType methodOwner = _roleJavaElem;
+        
+        if ((methodOwner != null) && (methodOwner.exists()))
+        {
+            IMethod enclosingMethod = methodOwner.getMethod(METHOD_NAME, new String[0]);
+            
+            if ((enclosingMethod != null) && (enclosingMethod.exists()))
+            {
+                IType anonymousType = enclosingMethod.getType("",1);
+                
+                if ((anonymousType != null) && (anonymousType.exists()))
+                {
+                    return anonymousType;
+                }
+            }
+        }
+        return null;
+    }        
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/Test1.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/Test1.java
new file mode 100644
index 0000000..4963c2c
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/Test1.java
@@ -0,0 +1,77 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: Test1.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+
+/**
+ * $Id: Test1.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * testcase:
+ * a role class (defined insight the file of its team class) with an attribut
+ * attribut assignment with instantiation of an anonymous class
+ * the anonymous class is an ordinary class with a method
+ */
+public class Test1 extends AttributeAssignmentTest
+{
+    private final String ANONYMOUS_METHOD_NAME = "additionalMethod";
+
+    
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(Test1.class);
+        }
+        junit.framework.TestSuite suite = new Suite(Test1.class
+            .getName());
+        return suite;
+    }    
+    
+    public Test1(String name)
+    {
+        super(name);
+    }    
+    
+    protected String getTeamName()
+    {
+        return "Test1_SampleTeam";
+    }    
+    
+    protected String getRoleName()
+    {
+        return "SampleRole";
+    }
+    
+    public void testContainmentOfMethodInAnonymousType() throws JavaModelException
+    {
+        IType anonymousType = getAnonymousType();
+        assertNotNull(anonymousType);
+        
+        IMethod methodOfAnonymousType = anonymousType.getMethod(ANONYMOUS_METHOD_NAME, new String[0]);
+        assertNotNull(methodOfAnonymousType);
+        assertTrue(methodOfAnonymousType.exists());
+    } 
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/Test2.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/Test2.java
new file mode 100644
index 0000000..01d1b3f
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/Test2.java
@@ -0,0 +1,80 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: Test2.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+
+/**
+ * $Id: Test2.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * testcase:
+ * a role class (defined insight the file of its team class) with a method
+ * instantiation of an anonymous class inside the method
+ * the anonymous class is an ordinary class
+ */
+public class Test2 extends LocalClassTest
+{
+
+    private final String ANONYMOUS_METHOD_NAME = "additionalMethod";    
+    
+    
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(Test2.class);
+        }
+        junit.framework.TestSuite suite = new Suite(Test2.class
+            .getName());
+        return suite;
+    }
+        
+    public Test2(String name)
+    {
+        super(name);
+    }
+
+    protected String getTeamName()
+    {
+        return "Test2_SampleTeam";
+    }
+    
+    protected String getRoleName()
+    {
+        return "SampleRole";  
+    }
+
+
+    
+    public void testContainmentOfMethodInAnonymousType() throws JavaModelException
+    {
+        IType anonymousType = getAnonymousType();
+        assertNotNull(anonymousType);
+        
+        IMethod method = anonymousType.getMethod(ANONYMOUS_METHOD_NAME, new String[0]);
+        assertNotNull(method);
+        assertTrue(method.exists());
+    }
+}
diff --git a/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/Test3a.java b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/Test3a.java
new file mode 100644
index 0000000..a208ecb
--- /dev/null
+++ b/testplugins/org.eclipse.objectteams.otdt.tests/model/org/eclipse/objectteams/otdt/tests/otmodel/anonymousinnerclass/rolelevel/internal/Test3a.java
@@ -0,0 +1,242 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute and Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * 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
+ * $Id: Test3a.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	  Fraunhofer FIRST - Initial API and implementation
+ * 	  Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.tests.otmodel.anonymousinnerclass.rolelevel.internal;
+
+import junit.framework.Test;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otdt.core.ICallinMapping;
+import org.eclipse.objectteams.otdt.core.IMethodMapping;
+import org.eclipse.objectteams.otdt.core.IOTJavaElement;
+import org.eclipse.objectteams.otdt.core.IOTType;
+import org.eclipse.objectteams.otdt.core.IRoleType;
+import org.eclipse.objectteams.otdt.core.OTModelManager;
+
+/**
+ * $Id: Test3a.java 23494 2010-02-05 23:06:44Z stephan $
+ * 
+ * testcase:
+ *  a role class (defined insight the file of its team class) with an attribut
+ * attribut assignment with instantiation of an anonymous class
+ * the anonymous class is a role class with an after-callin method mapping 
+ */
+public class Test3a extends AttributeAssignmentTest
+{
+
+    private final String ANONYMOUS_MAPPING_NAME = "roleMethod() <- baseMethod()";
+    private final String SUPERROLE_NAME = "Role1"; 
+    private final String MAPPED_ROLEMETHOD_NAME = "roleMethod";
+    private final String BASE_PKG = SRC_FOLDER + "." + "basepkg";
+    private final String BASE_NAME = "SampleBase";
+    private final String MAPPED_BASEMETHOD_NAME = "baseMethod";
+ 
+    
+    public static Test suite()
+    {
+        if (true)
+        {
+            return new Suite(Test3a.class);
+        }
+        junit.framework.TestSuite suite = new Suite(Test3a.class
+            .getName());
+        return suite;
+    }    
+
+    public Test3a(String name)
+    {
+        super(name);
+    }    
+    
+    protected String getTeamName()
+    {
+        return "Test3a_SampleTeam";
+    }
+    
+    protected String getRoleName()
+    {
+        return "Role2";
+    }
+ 
+    public void testExistenceOfAnonymousTypeInOTModel() throws JavaModelException
+    {
+        IType anonymousTypeJavaElem = getAnonymousType();
+        assertNotNull(anonymousTypeJavaElem);
+        
+        IOTType anonymousTypeOTElem = OTModelManager.getOTElement(anonymousTypeJavaElem);
+        assertNotNull(anonymousTypeOTElem);
+    }
+    
+    public void testRolePropertyOfAnonymousType() throws JavaModelException
+    {
+        IType anonymousTypeJavaElem = getAnonymousType();
+        assertNotNull(anonymousTypeJavaElem);
+        
+        IOTType anonymousTypeOTElem = OTModelManager.getOTElement(anonymousTypeJavaElem);
+        assertNotNull(anonymousTypeOTElem);
+        
+        assertTrue(anonymousTypeOTElem.isRole());
+        assertTrue(anonymousTypeOTElem instanceof IRoleType);
+    }
+    
+    public void testContainmentOfMethodMappingInAnonymousType() throws JavaModelException
+    {
+        IType anonymousTypeJavaElem = getAnonymousType();
+        assertNotNull(anonymousTypeJavaElem);
+        
+        IOTType anonymousTypeOTElem = OTModelManager.getOTElement(anonymousTypeJavaElem);
+        assertNotNull(anonymousTypeOTElem);
+        
+        assertTrue(anonymousTypeOTElem instanceof IRoleType);
+        IRoleType role = (IRoleType) anonymousTypeOTElem;
+        assertNotNull(role);
+        
+        IMethodMapping[] mappings = role.getMethodMappings();
+        assertNotNull(mappings);
+        assertTrue(mappings.length == 1);
+        assertEquals(mappings[0].getElementName(), ANONYMOUS_MAPPING_NAME);
+    }
+
+    public void testMappingPropertyBoundRoleMethod() throws JavaModelException
+    {
+        IType anonymousTypeJavaElem = getAnonymousType();
+        assertNotNull(anonymousTypeJavaElem);
+        
+        IOTType anonymousTypeOTElem = OTModelManager.getOTElement(anonymousTypeJavaElem);
+        assertNotNull(anonymousTypeOTElem);
+        
+        assertTrue(anonymousTypeOTElem instanceof IRoleType);
+        IRoleType role = (IRoleType) anonymousTypeOTElem;
+        assertNotNull(role);
+        
+        IMethodMapping[] mappings = role.getMethodMappings();
+        assertNotNull(mappings);
+        assertTrue(mappings.length == 1);
+        assertEquals(mappings[0].getElementName(), ANONYMOUS_MAPPING_NAME);
+
+        
+        ICompilationUnit teamUnit = getCompilationUnit(
+                PROJECT,
+                SRC_FOLDER,
+                TEAM_PKG,
+                getTeamName() +".java");
+        IType teamJavaElem = teamUnit.getType(getTeamName());
+
+        IType superRoleJavaElem = teamJavaElem.getType(SUPERROLE_NAME);
+        assertNotNull(superRoleJavaElem);
+        assertTrue(superRoleJavaElem.exists());
+        
+        IMethod superRoleMethod = superRoleJavaElem.getMethod(MAPPED_ROLEMETHOD_NAME, new String[0]);
+        assertNotNull(sup