initial commit in accordance with CQ 3784
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/.classpath b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/.classpath
new file mode 100644
index 0000000..987380a
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="OTRE"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/.project b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/.project
new file mode 100644
index 0000000..12e57b3
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/.project
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.objectteams.otdt.compiler.adaptor</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.objectteams.otdt.builder.OTJBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.objectteams.otdt.OTJavaNature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3b91683
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,85 @@
+#Sun Nov 09 02:20:07 CET 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+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=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=warning
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+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=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=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=warning
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+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.unusedParameterIncludeDocCommentReference=enabled
+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.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.5
+org.objectteams.otdt.compiler.option.joinpoint_queries=disabled
+org.objectteams.otdt.compiler.option.scoped_keywords=enabled
+org.objectteams.otdt.compiler.problem.abstract_potential_relevant_role=warning
+org.objectteams.otdt.compiler.problem.basecall=warning
+org.objectteams.otdt.compiler.problem.binding_conventions=error
+org.objectteams.otdt.compiler.problem.decapsulation=warning
+org.objectteams.otdt.compiler.problem.deprecated_path_syntax=warning
+org.objectteams.otdt.compiler.problem.effectless_fieldaccess=warning
+org.objectteams.otdt.compiler.problem.fragile_callin=warning
+org.objectteams.otdt.compiler.problem.incomplete_build=error
+org.objectteams.otdt.compiler.problem.inferred_callout=error
+org.objectteams.otdt.compiler.problem.potential_ambiguous_playedby=warning
+org.objectteams.otdt.compiler.problem.unsafe_liftctor=warning
+org.objectteams.otdt.compiler.problem.unsafe_role_instantiation=warning
+org.objectteams.otdt.compiler.problem.unused_parammap=warning
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/META-INF/MANIFEST.MF b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b43819b
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/META-INF/MANIFEST.MF
@@ -0,0 +1,16 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OT/J Compiler Adaptor Plug-in
+Bundle-SymbolicName: org.eclipse.objectteams.otdt.compiler.adaptor;singleton:=true
+Bundle-Version: 1.4.0.qualifier
+Bundle-Vendor: objectteams.org
+Bundle-Localization: plugin
+Require-Bundle: org.eclipse.jdt.core;bundle-version="[3.4.2.vOTDT_r124,4.0.0)",
+ org.eclipse.objectteams.otequinox,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.pde.core,
+ org.eclipse.objectteams.otdt
+Export-Package: org.eclipse.objectteams.otdt.internal.compiler.adaptor
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/build.properties b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/build.properties
new file mode 100644
index 0000000..e9863e2
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/plugin.xml b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/plugin.xml
new file mode 100644
index 0000000..36e2732
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/plugin.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   <extension
+         point="org.eclipse.objectteams.otequinox.aspectBindings">
+      <aspectBinding
+            icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/calloutbinding_obj.gif">
+         <basePlugin
+               icon="platform:/plugin/org.eclipse.pde.ui/icons/obj16/plugin_obj.gif"
+               id="org.eclipse.jdt.core"/>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.compiler.adaptor.AdaptorActivator"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif"/>
+         <team
+               activation="NONE"
+               class="org.eclipse.objectteams.otdt.internal.compiler.adaptor.BuildManager"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif"
+               superclass="org.eclipse.objectteams.otdt.internal.compiler.adaptor.CompilationThreadWatcher"/>
+         <team
+               activation="NONE"
+               class="org.eclipse.objectteams.otdt.internal.compiler.adaptor.CompilationThreadWatcher"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif"/>
+         <team
+               activation="NONE"
+               class="org.eclipse.objectteams.otdt.internal.compiler.adaptor.BaseImportChecker"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif"
+               superclass="org.eclipse.objectteams.otdt.internal.compiler.adaptor.CompilationThreadWatcher"/>
+         <team
+               activation="NONE"
+               class="org.eclipse.objectteams.otdt.internal.compiler.adaptor.RoleReuseGuard"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+         <team
+               activation="NONE"
+               class="org.eclipse.objectteams.otdt.internal.compiler.adaptor.PlainProjectWatcher"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif"
+               superclass="org.eclipse.objectteams.otdt.internal.compiler.adaptor.CompilationThreadWatcher">
+         </team>
+      </aspectBinding>
+      <aspectBinding
+            icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/calloutbinding_obj.gif">
+         <basePlugin
+               icon="platform:/plugin/org.eclipse.pde.ui/icons/obj16/plugin_obj.gif"
+               id="org.eclipse.pde.core">
+         </basePlugin>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.compiler.adaptor.PDEAdaptor"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+      </aspectBinding>
+      <aspectBinding
+            icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/calloutbinding_obj.gif">
+         <basePlugin
+               icon="platform:/plugin/org.eclipse.pde.ui/icons/obj16/plugin_obj.gif"
+               id="org.eclipse.core.resources">
+         </basePlugin>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.compiler.adaptor.ResourceProjectAdaptor"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+      </aspectBinding>
+   </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/AdaptedBaseBundle.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/AdaptedBaseBundle.java
new file mode 100644
index 0000000..fa33586
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/AdaptedBaseBundle.java
@@ -0,0 +1,115 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: AdaptedBaseBundle.java 23451 2010-02-04 20:33:32Z 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.internal.compiler.adaptor;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Objects of this class encode the information about aspectBindings
+ * affecting a given type/package within a base bundle.
+ * 
+ * @author stephan
+ * @since 1.1.5
+ */
+public class AdaptedBaseBundle 
+{
+	// the Object-value is used as a time stamp for reloading after the reader has been reloaded:
+	private HashMap<AspectBindingReader,Object> readers= new HashMap<AspectBindingReader, Object>();
+	
+	
+	/** Symbolic name of this base bundle. */
+	String symbolicName;
+	/** Teams adapting this base bundle. */
+	Set<String> adaptingTeams;
+	
+	/** Does this aspect bundle have one or more split packages? */
+	public boolean hasPackageSplit = false; 
+
+	public AdaptedBaseBundle(String symbolicName,
+							 AspectBindingReader reader)
+	{
+		this.symbolicName = symbolicName;
+		this.adaptingTeams= reader.getTeamsForBase(symbolicName);			
+		this.readers.put(reader, reader.token);
+	}
+	public boolean isAdaptedBy(String teamName) {
+		checkReload();
+		for (String aTeam : adaptingTeams)
+			if (aTeam.equals(teamName))
+				return true;
+		return false;
+	}
+	
+	public String getSymbolicName() {
+		return this.symbolicName;
+	}
+	
+	public synchronized boolean merge(AdaptedBaseBundle otherData) {
+		if (this.symbolicName.equals(otherData.symbolicName)) {
+			this.adaptingTeams.addAll(otherData.adaptingTeams);
+			this.readers.putAll(otherData.readers);
+			return true;
+		} else {
+			// different base bundle but same package: split package
+			return false;
+		}
+	}
+	
+	/** Check whether the AspectBindingReader has been reloaded, and if so,
+	 *  also reload our data (adaptingTeams) from the reader. */
+	private void checkReload() {
+		synchronized (this.readers) {
+			boolean reloadNeeded= false;
+			for (Map.Entry<AspectBindingReader,Object> readerEntry : this.readers.entrySet()) {
+				AspectBindingReader reader= readerEntry.getKey();
+				if (readerEntry.getValue() != reader.token) {
+					// token changed means: reader has reloaded.
+					reloadNeeded= true;
+					this.readers.put(reader, reader.token);
+				}
+			}
+			if (!reloadNeeded)
+				return;
+			// perform the reload:
+			HashSet<String> newSet= new HashSet<String>();
+			for (AspectBindingReader reader: this.readers.keySet())
+				newSet.addAll(reader.getTeamsForBase(this.symbolicName));
+			this.adaptingTeams= newSet; // only now assign, because querying the readers might call back into this!
+		}
+	}
+	
+	@SuppressWarnings("nls")
+	@Override
+	public String toString() {
+		String result= "bundle "+this.symbolicName+" is adapted by";
+		if (this.adaptingTeams == null)
+			return result+" (null)";
+		if (this.adaptingTeams.isEmpty())
+			return result+" no teams";
+		for (String aTeam : this.adaptingTeams) {
+			result+= "\n\t"+aTeam;
+		}
+		return result;
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/AdaptorActivator.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/AdaptorActivator.java
new file mode 100644
index 0000000..59e30c1
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/AdaptorActivator.java
@@ -0,0 +1,371 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: AdaptorActivator.java 23451 2010-02-04 20:33:32Z 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.internal.compiler.adaptor;
+
+import static org.eclipse.core.resources.IncrementalProjectBuilder.FULL_BUILD;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.eclipse.core.internal.resources.Project;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IAccessRule;
+import org.eclipse.jdt.core.IClasspathAttribute;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.WorkingCopyOwner;
+import org.eclipse.jdt.internal.compiler.CompilationResult;
+import org.eclipse.jdt.internal.compiler.SourceElementParser;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.eclipse.jdt.internal.compiler.util.ObjectVector;
+import org.eclipse.jdt.internal.compiler.util.SimpleLookupTable;
+import org.eclipse.jdt.internal.core.ClasspathAccessRule;
+import org.eclipse.jdt.internal.core.CompilationUnit;
+import org.eclipse.pde.internal.core.RequiredPluginsClasspathContainer;
+import org.objectteams.LiftingVetoException;
+import org.objectteams.Team;
+import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
+import org.eclipse.objectteams.otdt.core.compiler.OTNameUtils;
+
+import base org.eclipse.jdt.core.JavaCore;
+import base org.eclipse.jdt.internal.core.CompilationUnitProblemFinder;
+import base org.eclipse.jdt.internal.core.JavaProject;
+import base org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder;
+import base org.eclipse.jdt.internal.core.builder.JavaBuilder;
+import base org.eclipse.objectteams.otdt.internal.core.compiler.statemachine.copyinheritance.CopyInheritance;
+
+/**
+ * This team is activated via the OT/Equinox transformer plugin.
+ * It controls the activation of the BuildManager and BaseImportChecker teams.
+ * 
+ * Control entry for BuildManager: IncrementalImageBuilder.
+ * Control entries for BaseImportChecker: JavaBuilder and CompilationUnitProblemFinder
+ * @author stephan
+ */
+@SuppressWarnings("restriction")
+public team class AdaptorActivator 
+{
+	/**
+	 * Name of classpath attributes denoting the base bundle from which a classpath entry originates.
+	 * Persistently stored so we can later associate aspect binding data to that classpath entry. 
+	 */
+	public static final String CPENTRY_ATTR_ORIGIN_BASE_BUNDLE = "org.eclipse.objectteams.originBaseBundle"; //$NON-NLS-1$
+
+	/**
+	 * Copy of a constant from PDECore to reduce dependencies (must be compared with .equals())).
+	 */
+	public static final IPath REQUIRED_PLUGINS_CONTAINER_PATH = new Path("org.eclipse.pde.core.requiredPlugins"); //$NON-NLS-1$
+
+	
+	public static AdaptorActivator instance;
+	public AdaptorActivator() {
+		instance= this;
+	}
+
+	/** 
+	 * Pass the AspectBindingReader from a JavaProject to its RequiredPluginsClasspathContainer,
+	 * and pass aspect binding data from the reader to individual classpath entries having a 
+	 * originBaseBundle attribute.
+	 */
+	@SuppressWarnings("decapsulation") // base class is final
+	protected class JavaCore playedBy JavaCore 
+	{
+		IClasspathAttribute newClasspathAttribute(String name, String value) -> IClasspathAttribute newClasspathAttribute(String name, String value);
+		
+// (see TODO above) Attention: 
+// this solution would require partial array lifting if an element throws LiftingVetoException:
+//		void setClasspathContainer(OTEquinoxProject[] javaProjects, IClasspathContainer[] container) 
+		void setClasspathContainer(IJavaProject[] javaProjects, IClasspathContainer[] containers) 
+		<- before void setClasspathContainer(IPath container, IJavaProject[] affectedProjects, IClasspathContainer[] respectiveContainers, IProgressMonitor pm)
+		   with { javaProjects <- affectedProjects, 
+			      containers   <- respectiveContainers
+		   }
+//		static void setClasspathContainer(OTEquinoxProject[] javaProject, IClasspathContainer[] container) 
+		static void setClasspathContainer(IJavaProject[] javaProjects, IClasspathContainer[] containers) 
+		{
+			try {
+				for (int i=0; i<javaProjects.length; i++) {
+					Project project= (Project)javaProjects[i].getProject();
+					if (   containers[i] != null
+						&& REQUIRED_PLUGINS_CONTAINER_PATH.equals(containers[i].getPath())
+						&& ProjectUtil.isOTPluginProject(project)) // avoid LiftingVetoException
+					{
+						AspectBindingReader aspectBindingReader = ResourceProjectAdaptor.getDefault().getAspectBindingReader(project);
+						if (PDEAdaptor.instance != null)
+							//otherwise PDEAdaptor has not been activated yet (PDE neither) hoping this can be ignored.
+							PDEAdaptor.instance.setAspectBindingReader(aspectBindingReader, (RequiredPluginsClasspathContainer)containers[i]);
+						else
+							org.eclipse.jdt.core.JavaCore.getJavaCore().getLog().log(new Status(Status.WARNING, "org.eclipse.objectteams.otdt.internal.compiler.adaptor",  //$NON-NLS-1$
+																				     "PDEAdaptor not yet initialized while setting classpath for "+project.getName())); //$NON-NLS-1$
+					}
+				}
+			} catch (LiftingVetoException lve) {
+				// ignore, aspect just didn't apply
+			} catch (Throwable t) {
+				org.eclipse.jdt.core.JavaCore.getJavaCore().getLog().log(new Status(Status.ERROR, "org.eclipse.objectteams.otdt.internal.compiler.adaptor", "Error initializing AspectBindingReader", t)); //$NON-NLS-1$ //$NON-NLS-2$
+			}
+		}
+		
+		void addBaseBundleAttribute(IAccessRule[] accessRules, IClasspathAttribute[] extraAttributes) 
+			<- replace IClasspathEntry newLibraryEntry(IPath path1, IPath path2, IPath path3, IAccessRule[] accessRules, IClasspathAttribute[] extraAttributes, boolean isExported)
+			when (accessRules != null && accessRules.length > 0)
+			with { accessRules <- accessRules, extraAttributes <- extraAttributes }
+
+		void addBaseBundleAttribute(IAccessRule[] accessRules, IClasspathAttribute[] extraAttributes) 
+			<- replace IClasspathEntry newProjectEntry(IPath path, IAccessRule[] accessRules, boolean combineAccessRules, IClasspathAttribute[] extraAttributes, boolean isExported)
+			when (accessRules != null && accessRules.length > 0)
+			with { accessRules <- accessRules, extraAttributes <- extraAttributes }
+
+		/**
+		 * when creating a new classpath entry for a require plugin, check whether this plugin is affected by aspect bindings.
+		 * If so, add a classpath attribute to denote the base plugin from which this entry originates.
+		 * If a package is split among several plugins, a rule may carry one aspectBindingData for each part of the split.
+		 */
+		static callin void addBaseBundleAttribute(IAccessRule[] accessRules, IClasspathAttribute[] extraAttributes) {
+			if (accessRules[0] instanceof ClasspathAccessRule) {
+				Object[] datas = ((ClasspathAccessRule)accessRules[0]).aspectBindingData;
+				int i = 0;
+				if (datas != null)
+					for (Object data : datas)
+						if (data instanceof AdaptedBaseBundle) {
+							// note: more than one data is rather infrequent, no need to optimize array copying
+							int len = extraAttributes.length;
+							System.arraycopy(extraAttributes, 0, extraAttributes=new IClasspathAttribute[len+1], 1, len);
+							String baseBundleName = ((AdaptedBaseBundle) data).getSymbolicName();
+							extraAttributes[0] = newClasspathAttribute(CPENTRY_ATTR_ORIGIN_BASE_BUNDLE+(i++), baseBundleName);
+						}
+			}
+			base.addBaseBundleAttribute(accessRules, extraAttributes);
+		}		
+	}
+
+	/** 
+	 * When a JavaProject computes its package fragment roots from its classpath entries,
+	 * enhance the classpath entries with aspect binding data, using the classpath attribute
+	 * to determine the corresponding base bundle.
+	 * 
+	 * @author stephan
+	 * @since 1.2.5
+	 */
+	protected class CPEntryEnhancer playedBy JavaProject {
+
+		IProject getProject() -> IProject getProject();
+
+		@SuppressWarnings("rawtypes")
+		void enhanceCPEntry(IClasspathEntry[] resolvedEntries) 
+			<- before void computePackageFragmentRoots(IClasspathEntry[] resolvedEntries, ObjectVector accumulatedRoots,
+													   HashSet rootIDs, IClasspathEntry referringEntry,
+													   boolean retrieveExportedRoots, Map rootToResolvedEntries);
+
+		/**
+		 * @param entry the entry to enhance
+		 * @throws LiftingVetoException when the project is not an OT/Equinox project.
+		 */
+		void enhanceCPEntry(IClasspathEntry[] entries) throws LiftingVetoException 
+		{
+			IProject project = getProject();
+			AspectBindingReader reader = ResourceProjectAdaptor.getDefault().getAspectBindingReader((Project)project);
+			for (IClasspathEntry entry : entries) {
+				IClasspathAttribute[] attributes = entry.getExtraAttributes();
+				attributes_loop:
+				for (IClasspathAttribute attribute : attributes) {
+					if (attribute.getName().startsWith(CPENTRY_ATTR_ORIGIN_BASE_BUNDLE)) {
+						AdaptedBaseBundle aspectBindingData = reader.getAdaptationInfo(attribute.getValue());
+						if (aspectBindingData == null) continue; // means reader and attr are inconsistent
+						rules_loop:
+						for (IAccessRule rule : entry.getAccessRules())
+							if (rule instanceof ClasspathAccessRule) 
+								if (!PDEAdaptor.addAspectBindingData((ClasspathAccessRule)rule, aspectBindingData))
+									break rules_loop; // when not adding assume all rules share the same aspect data
+						break attributes_loop;
+					}
+				}
+			}
+		}
+	}
+	
+	/** 
+	 * Interface to the controlling builder. Tasks:
+	 * <ul>
+	 * <li>Life-cycle management for the BuildManager</li>
+	 * <li>cflow like bracket [initializeBuilder,cleanup] 
+	 *     for temporary activation of BaseImportChecker.
+	 *     Note, that build() is not a suitable join point, 
+	 *     because javaProject is not yes assigned.</li>     
+	 * </ul>
+	 */
+	protected class JavaBuilderObserver playedBy JavaBuilder 
+	{	
+		@SuppressWarnings("decapsulation")
+		Project getProject() -> get JavaProject javaProject
+			with { result <- (Project)javaProject.getProject() }
+		
+		Team projectWatcher= null;
+		
+		// initialize local data structures when a full build is started: 
+		void initialize(int kind) <- after int initializeBuilder(int kind, boolean forBuild);
+		void initialize(int kind) {
+			if (kind == FULL_BUILD)
+				manager.initializeDependencyStorage();
+			try {
+				this.projectWatcher= ResourceProjectAdaptor.getDefault().getChecker(getProject());
+			} catch (LiftingVetoException lve) {
+				this.projectWatcher= new PlainProjectWatcher();
+			}
+			this.projectWatcher.activate();
+		}
+		
+		cleanup <- after cleanup;
+		void cleanup() {
+			if (this.projectWatcher != null)
+				this.projectWatcher.deactivate();
+			this.projectWatcher= null;
+		}
+		
+		// need to recompute the classpath if aspect binding data have changed:
+		@SuppressWarnings("decapsulation")
+		boolean aspectBindingHasChanged() <- replace boolean hasClasspathChanged();
+		@SuppressWarnings("basecall")
+		callin boolean aspectBindingHasChanged() {
+			try {
+				if (ResourceProjectAdaptor.getDefault().hasAspectDataChanged(getProject()))
+					return true;
+			} catch (LiftingVetoException lve) {
+				// thrown while lifting project, means that javaProject is not OT-Project.
+			}
+			return base.aspectBindingHasChanged();
+		}
+
+	}
+
+	/** 
+	 * This role observes another entry into the compiler to activate a BaseImportChecker if needed.
+	 */
+	protected class CompilationUnitProblemFinder playedBy CompilationUnitProblemFinder 
+	{
+		@SuppressWarnings("rawtypes")
+		void activateChecker(ICompilationUnit unitElement)
+		<- replace CompilationUnitDeclaration process(CompilationUnit unitElement, 
+													  SourceElementParser parser,
+													  WorkingCopyOwner workingCopyOwner,
+													  HashMap problems,
+													  boolean creatingAST,
+													  int reconcileFlags,
+													  IProgressMonitor monitor)
+			with { unitElement <- unitElement }
+	
+		static callin void activateChecker(ICompilationUnit unitElement)
+				throws JavaModelException
+		{	
+			within (getChecker(unitElement)) 
+			 	base.activateChecker(unitElement);
+		}
+
+		static Team getChecker(ICompilationUnit unitElement) {			
+			try {
+				Project project= ProjectUtil.safeGetOTPluginProject(unitElement);
+				if (project != null) {
+					Team baseChecker= ResourceProjectAdaptor.getDefault().getChecker(project);
+					if (baseChecker != null)
+						return baseChecker;
+				}
+			} catch (LiftingVetoException lve) {
+				// shouldn't happen, have checked above.
+			}
+			return new PlainProjectWatcher(); // fallback for non OT-Plugin projects
+		}
+	}
+
+	private BuildManager manager = new BuildManager();
+	
+	/**
+	 * This role observes the IncrementalImageBuilder.
+	 * It enables all callins of BuildManager only while 
+	 * performing an incremental build (method build(deltas)). 
+	 */
+	protected class BuilderGuard playedBy IncrementalImageBuilder 
+	{
+		build <- replace build;
+		callin boolean build(SimpleLookupTable deltas) 
+		{
+			// Activation only for this thread/control flow:
+			within (manager) {
+				return base.build(deltas);
+			}
+		}
+	}
+	
+	/**
+	 * This role class simply tracks all executions of CopyInheritance.copyRole(..)
+	 * 
+	 * Purpose: collect data for recompiling sub-teams if tsuper roles have been changed.
+	 */
+	protected class CopyInheritanceObserver playedBy CopyInheritance 
+	{
+		// This trigger applies to source and binary tsupers being copied into source:
+		void observeCopyRole(ReferenceBinding superRole, char[] subTeamFileName)
+			<- after TypeDeclaration copyRole(ReferenceBinding tsuperRole, 
+											  boolean isNestedType, 
+							                  TypeDeclaration subTeamDecl, 
+							                  boolean isTsuperTeam)
+		base when (result != null)
+		with  { superRole       <- tsuperRole, 
+		        subTeamFileName <- subTeamDecl.compilationResult.getFileName() }
+
+		// static for optimization: avoid lifting.
+		static void observeCopyRole(ReferenceBinding superRole, char[] subTeamFileName) 
+		{
+			if (superRole.enclosingType().id == IOTConstants.T_OrgObjectTeamsTeam)
+				return;
+			if (subTeamFileName == null || subTeamFileName[0] != '/')
+				return; // only useful if an absolute path is given.
+			
+			// no need to recompile these: 
+			char[] superRoleName = superRole.internalName();
+			if (   BuildManager.isPredefinedRole(superRoleName) 
+				|| OTNameUtils.isTSuperMarkerInterface(superRoleName))
+				return;
+			AdaptorActivator.this.manager.recordCopiedRole(superRole.attributeName(), subTeamFileName); 
+		}
+		
+		@SuppressWarnings("decapsulation")
+		boolean shouldPreserveBinary(ReferenceBinding role, CompilationResult cResult) 
+			<-replace boolean shouldPreserveBinaryRole(ReferenceBinding role, CompilationResult cResult);
+		static callin boolean shouldPreserveBinary(ReferenceBinding role, CompilationResult cResult) 
+		{
+			if (!base.shouldPreserveBinary(role, cResult))
+				return false;
+			if (!AdaptorActivator.this.manager.isActive())
+				return true;
+			return AdaptorActivator.this.manager.shouldPreserveBinaryRole(role, cResult);
+		}
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/AspectBindingReader.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/AspectBindingReader.java
new file mode 100644
index 0000000..bae44d0
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/AspectBindingReader.java
@@ -0,0 +1,364 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: AspectBindingReader.java 23451 2010-02-04 20:33:32Z 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.internal.compiler.adaptor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.IClasspathContainer;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.objectteams.otdt.core.ext.OTDTPlugin;
+import org.eclipse.pde.core.build.IBuild;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.internal.core.ClasspathUtilCore;
+import org.eclipse.pde.internal.core.PDECore;
+import org.eclipse.pde.internal.core.PluginModelManager;
+import org.eclipse.pde.internal.core.RequiredPluginsClasspathContainer;
+import org.objectteams.LiftingVetoException;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * Utility to read the aspectBinding extension from a projects plugin.xml,
+ * in order to provide this information during compilation.
+ * 
+ * References to an AspectBindingReader are passed along the full information flow
+ * from PDEAdaptor to BaseImportChecker as a source for fetching aspect binding information.
+ * 
+ * @author stephan
+ * @since 1.1.5
+ */
+@SuppressWarnings("restriction")
+public class AspectBindingReader {
+
+	// XML-Structure of aspectBindings in plugin.xml:
+	private final static String ASPECT_BINDING       = "aspectBinding";     //$NON-NLS-1$
+	private final static String    BASE_PLUGIN       = "basePlugin";        //$NON-NLS-1$
+	private final static String       ID             = "id"; //attribute    //$NON-NLS-1$
+	private final static String       FORCED_EXPORTS = "forcedExports";     //$NON-NLS-1$
+	private final static String    TEAM              = "team";              //$NON-NLS-1$
+	private final static String       CLASS          = "class"; //attribute //$NON-NLS-1$
+	
+	private static final String SELF                 = "SELF";  //value     //$NON-NLS-1$
+	// Note: we do NOT read the requiredFragment element, because when creating access rules
+	//       the packages of the fragment will report the host bundle as their providingBundle.
+	//       (see PDEAdaptor.RequiredPluginsClasspathContainer#updateRule())
+	
+	private static SAXParserFactory fSAXFactory;
+	
+	// == local cached storage: ==
+	
+	// main date storage: teamClassName -> basePluginName* 
+	private HashMap<String, HashSet<String>> team2basePlugins = null;
+	
+	private HashMap<String, HashSet<String>> base2forcedExports = null;
+	private HashSet<String> teamsAdaptingSelf= new HashSet<String>();
+	
+	// reverse info with more details: basePluginName -> AdaptedBaseBundle
+	private HashMap<String, AdaptedBaseBundle> adaptationInfos= new HashMap<String, AdaptedBaseBundle>();
+	
+	private String project;
+	private IProject iProject;
+	
+	/** This field serves as a time stamp to track whether an
+	 * aspect binding reader has been reloaded. */
+	Object token;
+
+	private boolean hasChanges;
+	
+	// for accessing objects of type IPluginModelBase:
+	PluginModelManager fPluginModelManager;
+
+	/**
+	 * Create and initialize an AspectBindingReader, i.e., try to read aspect binding info from the project's plugin.xml.
+	 * 
+	 * @param project the project whose aspect bindings should be analyzed.
+	 * @throws LiftingVetoException  if the project was not ready for reading plugin.xml.
+	 */
+	public AspectBindingReader(IProject project) throws LiftingVetoException {
+		if (!this.readAspectBindings(project, getSaxParserFactory()))
+			throw new LiftingVetoException();
+		this.project= project.getName();
+		this.iProject= project;
+		this.fPluginModelManager = PDECore.getDefault().getModelManager();
+	}
+
+	/** Is the given team declared to adapt classes from its own plug-in ("self")? */
+	public boolean isAdaptingSelf(String teamName) {
+		return this.teamsAdaptingSelf.contains(teamName);
+	}
+
+	/** Get the base plug-in adapted by the given team. */
+	public Set<String> getBasePlugins(String teamName) {
+		if (this.team2basePlugins != null)
+			return this.team2basePlugins.get(teamName);
+		return null;
+	}
+	
+	/** Is the bundle identified by this symbolic name an adapted base bundle.? */
+	public boolean isAdaptedBase(String symbolicName) {
+		return this.adaptationInfos.containsKey(symbolicName);
+	}
+	
+	/** Get the names of all teams that adapt the given base bundle. */
+	public Set<String> getTeamsForBase(String basePluginName) {
+		AdaptedBaseBundle info = this.adaptationInfos.get(basePluginName);
+		if (info == null) 
+			return new HashSet<String>();
+		return info.adaptingTeams;
+	}
+
+	/** Get (lazily create) the detailed info for an adapted base bundle. */
+	public AdaptedBaseBundle getAdaptationInfo(String basePluginName) {
+		AdaptedBaseBundle result= this.adaptationInfos.get(basePluginName);
+		if (result == null) {
+			result= new AdaptedBaseBundle(basePluginName, this);
+			this.adaptationInfos.put(basePluginName, result);
+		}
+		return result;
+	}
+
+
+	/** Is the given package force-exported? */
+	public String getForcedExportingBase(String packageName) {
+		if (this.base2forcedExports == null)
+			return null;
+		for (Entry<String, HashSet<String>> entry: this.base2forcedExports.entrySet()) {
+			if (entry.getValue().contains(packageName))
+				return entry.getKey();
+		}
+		return null;
+	}
+
+	public HashSet<String> getForcedExports(String symbolicName) {
+		if (this.base2forcedExports == null)
+			return null;
+		return this.base2forcedExports.get(symbolicName);
+	}
+
+	static SAXParserFactory getSaxParserFactory() {
+		if (fSAXFactory == null) 
+			fSAXFactory = SAXParserFactory.newInstance();
+		return fSAXFactory;
+	}
+	
+
+	/** Read all the <aspectBinding> declarations from plugin.xml. 
+	 * @return whether or not reading plugin.xml was successful.
+	 */ 
+	private boolean readAspectBindings (IProject project, SAXParserFactory factory)  {
+		SAXParser parser;
+		try {
+			parser = factory.newSAXParser();
+			IFile file = project.getFile("plugin.xml"); //$NON-NLS-1$
+			if (!file.exists())
+				return false;
+			collectAspectBindings(file, parser);
+			this.token= new Object();
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return true;
+	}
+	
+	/** Stage 1: remember which team declares to adapt classes from which base plug-in. */
+	void recordAspectBinding(String teamClass, String basePluginID) {
+		if (SELF.equals(basePluginID.toUpperCase())) {
+			this.teamsAdaptingSelf.add(teamClass);
+			return;
+		}
+		if (this.team2basePlugins == null)
+			this.team2basePlugins = new HashMap<String, HashSet<String>>();
+		HashSet<String> plugins = this.team2basePlugins.get(teamClass);
+		if (plugins == null) {
+			plugins = new HashSet<String>();
+			this.team2basePlugins.put(teamClass, plugins);
+		}
+		plugins.add(basePluginID);
+		
+		// and store detailed reverse info:
+		AdaptedBaseBundle adaptationInfo = getAdaptationInfo(basePluginID);
+		adaptationInfo.adaptingTeams.add(teamClass);
+	}
+
+	void recordForcedExports(String basePlugin, String exports) {
+		if (this.base2forcedExports == null) 
+			this.base2forcedExports= new HashMap<String, HashSet<String>>();
+		HashSet<String> baseExports= this.base2forcedExports.get(basePlugin);
+		if (baseExports == null) 
+			this.base2forcedExports.put(basePlugin, baseExports= new HashSet<String>());
+		String[] singleExports= exports.split(","); //$NON-NLS-1$
+		for (int i = 0; i < singleExports.length; i++)
+			baseExports.add(singleExports[i].trim());
+		// TODO(SH): not yet checked: are the exports really packages of basePlugin?
+	}
+
+	void collectAspectBindings(IFile file, SAXParser parser) {
+		try {
+			parser.parse(file.getContents(), new DefaultHandler() {
+				String basePluginID = null;
+				ArrayList<String> teamClasses = null;
+				StringBuffer forcedExports= null;
+				@Override
+				public void startElement(String uri, String localName, String name, Attributes attributes) 
+						throws SAXException 
+				{
+					if (name.equals(ASPECT_BINDING)) 
+						this.teamClasses = new ArrayList<String>();
+					else if (this.teamClasses != null) { // within an aspectBinding element?
+						if (name.equals(BASE_PLUGIN)) {
+							this.basePluginID = attributes.getValue(ID);
+						} else if (name.equals(TEAM)) {                  
+							String teamClass = attributes.getValue(CLASS);
+							if (teamClass == null)
+								throw new SAXException("team element lacking \"class\" attribute"); //$NON-NLS-1$
+							this.teamClasses.add(teamClass);
+						} else if (name.equals(FORCED_EXPORTS)) {
+							this.forcedExports= new StringBuffer();
+						}
+					}
+				}
+				@Override
+				public void characters(char[] ch, int start, int length) throws SAXException 
+				{
+					if (this.forcedExports != null)
+						this.forcedExports.append(ch, start, length);
+				}
+				@Override
+				public void endElement(String uri, String localName, String name)
+						throws SAXException 
+				{
+					if (name.equals(ASPECT_BINDING)) {
+						if (this.basePluginID == null)
+							throw new SAXException("aspectBinding missing a \"basePlugin\" element"); //$NON-NLS-1$
+						for (String	teamClass : this.teamClasses) 
+							recordAspectBinding(teamClass, this.basePluginID);
+						this.basePluginID = null;
+						this.teamClasses = null;
+					} else if (name.equals(FORCED_EXPORTS)) {
+						if (this.forcedExports != null && this.forcedExports.length() > 0)
+							recordForcedExports(this.basePluginID, this.forcedExports.toString());
+						this.forcedExports= null;
+					}
+				}
+			});
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}	
+	}
+	// ===== Below: Updating. =====
+
+	/** When plugin.xml has changed re-read our data and perhaps clear
+	 *  cached data in the JavaModelManager and RequirePluginsClasspathContainer. */
+	void reload() {
+		this.hasChanges= true;
+		
+		HashMap<String,HashSet<String>> oldForcedExports= this.base2forcedExports;
+		HashMap<String,HashSet<String>> oldTeamBindings= this.team2basePlugins;
+		// clear internal storage:
+		this.team2basePlugins = null;   // be sure to initialize new sets if needed, so we can compare sets using mapHasChanged
+		this.base2forcedExports = null;
+		this.adaptationInfos.clear();   // these two are created by default (and no need to compare old/new)
+		this.teamsAdaptingSelf.clear();
+		
+		if (!this.readAspectBindings(this.iProject, getSaxParserFactory())) {
+			OTDTPlugin.getDefault().getLog().log(new Status(Status.ERROR, OTDTPlugin.PLUGIN_ID, "Unable to re-read plugin.xml!;")); //$NON-NLS-1$
+			return ;
+		}
+		
+		// remove cached data if forced exports or team bindings have changed:
+		if (   mapHasChanged(oldForcedExports, this.base2forcedExports)
+		    || mapHasChanged(oldTeamBindings,  this.team2basePlugins)) 
+		{
+			resetRequiredPluginsClasspathContainer(this.iProject);
+		}
+	}
+	
+	/** Destructively read the flag indicating changed aspect binding data. */
+	boolean fetchHasChanges() {
+		try {
+			return this.hasChanges;
+		} finally {
+			this.hasChanges= false;
+		}
+	}
+	
+	private void resetRequiredPluginsClasspathContainer(IProject project) {
+		IJavaProject jProject = JavaCore.create(project);
+		IPluginModelBase model = fPluginModelManager.findModel(project);
+		try {
+			IBuild build = ClasspathUtilCore.getBuild(model);
+			RequiredPluginsClasspathContainer container = new RequiredPluginsClasspathContainer(model, build);
+			// this triggers recomputing the classpath:
+			JavaCore.setClasspathContainer(PDECore.REQUIRED_PLUGINS_CONTAINER_PATH, new IJavaProject[]{jProject}, new IClasspathContainer[] {container}, null);
+			// AspectBindingReader is automatically shared via the ResourceProjectAdaptor.OTEquinoxProject
+			// see org.eclipse.objectteams.otdt.internal.compiler.adaptor.AdaptorActivator.JavaCore.setClasspathContainer(..)
+		} catch (CoreException ce) {
+			OTDTPlugin.getExceptionHandler().logException("Failed to reload classpath container for "+project, ce); //$NON-NLS-1$
+		}
+	}
+
+	private <T> boolean mapHasChanged(HashMap<String,T> oldMap, 
+									  HashMap<String,T> newMap) 
+	{
+		if (oldMap == null || newMap== null)
+			return oldMap != newMap; // null and non-null?
+		HashSet<String> newKeys= new HashSet<String>(newMap.keySet());
+		for (Map.Entry<String, T> oldEntry : oldMap.entrySet()) {
+			T newVal= newMap.get(oldEntry.getKey());
+			if (newVal == null)
+				return true;       // removed entry
+			if (!newVal.equals(oldEntry.getValue()))
+				return true;	   // changed value (simple or complex)
+			newKeys.remove(oldEntry.getKey());
+		}
+		return !newKeys.isEmpty(); // added entries in newKeys?		
+	}
+	
+	// ===== Debug: =====
+	@SuppressWarnings("nls")
+	@Override
+	public String toString() {
+		String result= "AspectBindingReader for project "+this.project;
+		if (this.team2basePlugins != null)
+			result+= "\n\t known teams: "+this.team2basePlugins.size();
+		if (this.teamsAdaptingSelf != null)
+			result+= "\n\t self-adaption teams: "+this.teamsAdaptingSelf.size();
+		if (this.base2forcedExports != null)
+			result+= "\n\t plugins with forced exports: "+this.base2forcedExports.size();
+		return result;
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BaseImportChecker.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BaseImportChecker.java
new file mode 100644
index 0000000..c8f33cf
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BaseImportChecker.java
@@ -0,0 +1,289 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: BaseImportChecker.java 23451 2010-02-04 20:33:32Z 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.internal.compiler.adaptor;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.eclipse.jdt.core.Flags;
+import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.eclipse.jdt.internal.compiler.ast.AllocationExpression;
+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.ast.MessageSend;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.Expression.DecapsulationState;
+import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
+import org.eclipse.jdt.internal.compiler.env.AccessRule;
+import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
+import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
+import org.eclipse.jdt.internal.compiler.lookup.ImportBinding;
+import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+import org.eclipse.objectteams.otdt.core.exceptions.InternalCompilerError;
+
+import base org.eclipse.jdt.internal.compiler.lookup.CompilationUnitScope;
+import base org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
+
+/**
+ * This team checks whether base-imports are backed up by proper aspectBinding declarations.
+ * (Only activated if the project has the PluginNature).
+ * This team is only temporarily instantiated/activated by AdaptorActivator.JavaProject(JavaProject).
+ * 
+ * This team also handles the forcedExport declarations from aspectBindings extensions
+ * and correspondingly converts some diagnostics from forbiddenAccess to decapsulationByForcedExport.
+ * 
+ * Other parts involved:
+ * 
+ *  + PDEAdaptor is responsible for adding aspectBindingData (of type AdaptedBaseBundle) 
+ *    to ClasspathAccessRules and adjusting the problemID
+ *  
+ *  + org.eclipse.jdt.internal.core.builder.NameEnvironment
+ *    - computeClasspathLocations(IWorkspaceRoot, JavaProject, SimpleLookupTable)
+ *    Feed AccessRuleSet from ClasspathEntry into ClasspathLocations like ClasspathDirectory.
+ *     
+ *  + org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment
+ *    - setAccessRestriction(ReferenceBinding, AccessRestriction)
+ *    - AccessRestriction getAccessRestriction(TypeBinding type)
+ *    Pass AccessRestriction from sources like ClasspathDirectory.accessRuleSet into the compiler. 
+ * 
+ * @author stephan
+ * @since 1.1.2
+ */
+@SuppressWarnings("restriction")
+public team class BaseImportChecker extends CompilationThreadWatcher
+{
+	private AspectBindingReader aspectBindingReader;
+	
+	public BaseImportChecker() {/* emtpy ctor for OT/Equinox */ }
+	
+	/**
+	 * @param aspectBindingReader must be non-null (and initialized). 
+	 */
+	public BaseImportChecker(AspectBindingReader aspectBindingReader) {
+		this.aspectBindingReader= aspectBindingReader;
+	}
+
+	/**
+	 * If a forced exports exist convert some diagnostics from forbiddenAccess 
+	 * to decapsulationByForcedExport.
+	 */
+	protected class ProblemReporter playedBy ProblemReporter 
+	{   
+		// imports via callout:
+		protected void baseImportInRegularClass(TypeDeclaration firstType, ImportReference reference) 
+			-> void baseImportInRegularClass(TypeDeclaration firstType, ImportReference reference);
+		protected void illegalBaseImportNoAspectBinding(ImportReference ref, String teamName) 
+			-> void illegalBaseImportNoAspectBinding(ImportReference ref, String teamName);
+		protected void illegalBaseImport(ImportReference ref, String expectedBasePlugin, String actualBasePlugin) 
+			-> void illegalBaseImport(ImportReference ref, String expectedBasePlugin, String actualBasePlugin);
+		void illegalUseOfForcedExport(ReferenceBinding type, ASTNode reference) 
+			-> void illegalUseOfForcedExport(ReferenceBinding type, ASTNode reference);
+		void decapsulationByForcedExport(ReferenceBinding type, ASTNode reference) 
+			-> void decapsulationByForcedExport(ReferenceBinding type, ASTNode reference);
+		void baseImportFromSplitPackage(ImportReference ref, String expectedPlugin)
+		    -> void baseImportFromSplitPackage(ImportReference ref, String expectedPlugin);
+		
+
+		ReferenceContext getReferenceContext() -> get ReferenceContext referenceContext;
+		
+		/** The callin entry into this role: analyze and report various access situations. */
+		@SuppressWarnings("basecall")
+		callin void forbiddenReference(TypeBinding type, ASTNode location, AccessRestriction restriction) 
+		{
+			switch (restriction.getProblemId()) {
+			case IProblem.BaseclassDecapsulationForcedExport:
+				switch (getBaseclassDecapsulation(location)) {
+				case ALLOWED:
+					decapsulationByForcedExport((ReferenceBinding)type, location);
+				case REPORTED:
+					break;
+				default:
+					// no forced export for regular use!
+					illegalUseOfForcedExport((ReferenceBinding)type, location);
+				}
+				break;
+			case IProblem.AdaptedPluginAccess: 
+				// not a real error but requires consistency check against aspectBinding:
+				if (location instanceof ImportReference) {
+					ImportReference imp= (ImportReference)location;
+					if (imp.isBase()) {
+						String teamName= getReferenceTeam();
+						if (teamName == null) 
+							baseImportInRegularClass(getPublicType(), imp);
+						
+						Set<String> basePlugins= aspectBindingReader.getBasePlugins(teamName);
+						if (basePlugins == null || basePlugins.isEmpty()) {
+							illegalBaseImportNoAspectBinding(imp, teamName);
+							return;
+						}
+						String baseString = flattenSet(basePlugins);
+						Set<String> actualBases = new HashSet<String>();
+						AccessRule rule= restriction.getAccessRule();
+						if (rule.aspectBindingData != null) {
+							for (Object data : rule.aspectBindingData) {
+								AdaptedBaseBundle info= (AdaptedBaseBundle) data;
+								if (info.isAdaptedBy(teamName)) {
+									// OK, no error
+									if (info.hasPackageSplit)
+										baseImportFromSplitPackage(imp, baseString); // just a warning
+									return;
+								}
+								actualBases.add(info.getSymbolicName());
+							}
+						}
+						illegalBaseImport(imp, baseString, flattenSet(actualBases));
+					}
+				}
+				break;
+			default:
+				base.forbiddenReference(type, location, restriction);
+			}
+		}
+		void forbiddenReference(TypeBinding type, ASTNode location, AccessRestriction restriction)
+		<- replace void forbiddenReference(TypeBinding type, ASTNode location, byte entryType, AccessRestriction restriction)
+		   with { type <- type, location <- location, restriction <- restriction }
+
+		void forbiddenReference(TypeBinding type, ASTNode location, AccessRestriction restriction) 
+		<- replace void forbiddenReference(MethodBinding method, ASTNode location, byte entryType, AccessRestriction restriction)
+		   with { type <- method.declaringClass, location <- location, restriction <- restriction }
+
+		void forbiddenReference(TypeBinding type, ASTNode location, AccessRestriction restriction) 
+		<- replace void forbiddenReference(FieldBinding field, ASTNode location, byte entryType, AccessRestriction restriction)
+		   with { type <- field.declaringClass, location <- location, restriction <- restriction }
+
+		
+		private DecapsulationState getBaseclassDecapsulation(ASTNode location) {
+			if (location instanceof Expression) {
+				if (location instanceof AllocationExpression)
+					return DecapsulationState.REPORTED; // base-ctor expression.
+				if (location instanceof MessageSend)
+					return DecapsulationState.REPORTED; // callout message send.
+				Expression expr= (Expression) location;
+				DecapsulationState result= expr.getBaseclassDecapsulation();
+				if (result == DecapsulationState.ALLOWED)
+					expr.tagReportedBaseclassDecapsulation();
+				return result;
+			} 
+			if (location instanceof ImportReference) {
+				ImportReference impRef= (ImportReference)location;
+				if (impRef.isBase())
+					return DecapsulationState.ALLOWED; // always need to report 
+			}
+			return DecapsulationState.NONE;
+		}
+		private String getReferenceTeam() {
+			TypeDeclaration type= getPublicType();
+			if (type != null && type.isTeam())
+				return new String(type.binding.readableName());
+			return null;
+		}
+		private TypeDeclaration getPublicType() {
+			ReferenceContext context= getReferenceContext();
+			if (context instanceof CompilationUnitDeclaration) {
+				CompilationUnitDeclaration unit= (CompilationUnitDeclaration)context;
+				if (unit.types == null) return null;
+				for (TypeDeclaration type : unit.types)
+					if (Flags.isPublic(type.modifiers))
+						return type;
+			}
+			return null;
+		}
+	}
+	
+	
+	protected class ImportTracker playedBy CompilationUnitScope
+	{
+		ReferenceBinding[] getTopLevelTypes() -> get ReferenceBinding[] topLevelTypes;
+	  private // don't publically expose protected role ProblemReporter
+		ProblemReporter    problemReporter()  ->     ProblemReporter    problemReporter();
+
+		/** When setting the base imports to a CUScope, check for imports from undeclared plug-ins. */
+		void setBaseImports(ImportBinding[] resolvedBaseImports, int baseCount, ImportReference[] refs) 
+		<- before void setBaseImports(ImportBinding[] resolvedBaseImports, int baseCount, ImportReference[] refs);
+		void setBaseImports(ImportBinding[] resolvedBaseImports, int baseCount, ImportReference[] refs) 
+		{
+			if (baseCount == 0) return;
+			ReferenceBinding teamType = findMainType();
+			String teamName= (teamType != null)
+								? new String(teamType.readableName()) : null;
+			for (int i=0; i<baseCount; i++) {
+				if (teamType == null) {
+					problemReporter().baseImportInRegularClass(null, refs[i]);
+					continue;
+				}
+				if (resolvedBaseImports[i].onDemand) // syntactically impossible
+					throw new InternalCompilerError("Ondemand base import not supported");  //$NON-NLS-1$
+				String basePlugins= null;
+				if (resolvedBaseImports[i].resolvedImport instanceof ReferenceBinding) {
+					ReferenceBinding importedType= (ReferenceBinding)resolvedBaseImports[i].resolvedImport;
+					if (!importedType.isValidBinding())
+						continue; // already reported
+					if (importedType.hasRestrictedAccess())
+						continue; // checked by forbiddenAccess()
+					if (aspectBindingReader.isAdaptingSelf(teamName)) {
+						char[][] current= CharOperation.splitOn('/', teamType.getFileName());
+						char[][] imported= CharOperation.splitOn('/', importedType.getFileName());
+						if (CharOperation.equals(current[1], imported[1]))
+							return;
+						basePlugins= "<self>"; //$NON-NLS-1$
+					}
+				}
+				if (basePlugins == null)
+					basePlugins= flattenSet(aspectBindingReader.getBasePlugins(teamName));
+				if (basePlugins != null)
+					problemReporter().illegalBaseImport(refs[i], basePlugins, null);
+				else
+					problemReporter().illegalBaseImportNoAspectBinding(refs[i], teamName);
+			}
+		}
+		private ReferenceBinding findMainType() {
+			ReferenceBinding[] toplevelTypes = getTopLevelTypes();
+			if (toplevelTypes != null)
+				for (ReferenceBinding referenceBinding : toplevelTypes) 
+					if (referenceBinding.isPublic())
+						return referenceBinding;
+
+			return null;
+		}
+	}
+	@SuppressWarnings("nls")
+	String flattenSet(Set<String> stringSet) {
+		if (stringSet == null) return null;
+		Iterator<String> iterator = stringSet.iterator();
+		if (stringSet.size()==1) {
+			return iterator.next();
+		} else {
+			String result = "[";
+			while(true) {
+				result += iterator.next();
+				if (!iterator.hasNext()) break;
+				result += ", ";
+			}
+			return result + "]";
+		}
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BuildManager.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BuildManager.java
new file mode 100644
index 0000000..6be0534
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BuildManager.java
@@ -0,0 +1,345 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: BuildManager.java 23451 2010-02-04 20:33:32Z 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.internal.compiler.adaptor;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
+import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
+import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
+import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
+import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
+
+import base org.eclipse.jdt.core.compiler.CategorizedProblem;
+import base org.eclipse.jdt.internal.compiler.CompilationResult;
+import base org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader; // base-class of a role file
+import base org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding;
+import base org.eclipse.jdt.internal.compiler.lookup.ClassScope;
+import base org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
+import base org.eclipse.jdt.internal.compiler.problem.AbortType;
+import base org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
+import base org.eclipse.objectteams.otdt.internal.core.compiler.lifting.LiftingEnvironment;
+import base org.eclipse.jdt.internal.core.builder.IncrementalImageBuilder; // base-class of a role file
+
+/**
+ * This Team observes the build/compile process and advises the IncrementalImageBuilder, 
+ * when and what to recompile due to OT-specific dependencies.
+ * 
+ * @author stephan
+ * @version $Id: BuildManager.java 23451 2010-02-04 20:33:32Z stephan $
+ */
+@SuppressWarnings("restriction")
+public team class BuildManager extends CompilationThreadWatcher
+{
+	public static int DEBUG = 0; // levels: 0 nothing, 1 some, 2 more.
+
+	/** Remember the (one) ImageBuilder role. */
+	ImageBuilder builder = null;
+	
+	// ====== Data common for all roles (incl. accessors and life-cycle). ======
+	
+	
+	/** Manage cross-ref table for copied roles:
+	 *  PRODUCER: RoleCopyTracker.trackCopyRole()
+	 *  CONSUMER: ClassFileChangeTracker.nonStructuralChange()
+	 *  
+	 *  ENCODING: RoleTypeName -> Set<TeamSourceFileName> */
+	HashMap<String, Set<String>> roleToSubTeams = new HashMap<String, Set<String>>();
+	
+	void recordCopiedRole(char[] roleName, char[] subTeamSourceFileName) {
+		String roleString = new String(roleName);
+		Set<String> teams = roleToSubTeams.get(roleString);
+		if (teams == null) 
+			roleToSubTeams.put(roleString, teams = new HashSet<String>());
+		teams.add(new String(subTeamSourceFileName));
+		if (DEBUG >= 2)
+			System.out.println("role "+roleString+" is COPIED to "+new String(subTeamSourceFileName));  //$NON-NLS-1$//$NON-NLS-2$
+	}
+//	// debug helper
+//	void printCopyTable() {
+//		System.out.print("-------------------------");
+//		for (Map.Entry<String, Set<String>> entry : roleToSubTeams.entrySet()) {
+//			System.out.print("\nRole "+entry.getKey());
+//			for (String value : entry.getValue()) {
+//				System.out.print("\n\t"+value);
+//			}
+//		}
+//		System.out.println("\n-------------------------");
+//	}
+	
+	/** If a tsuper role has non-structural changes, some sub-teams need to be recompiled.
+	 *  This set holds the teams to be recompiled.
+	 *
+	 *  PRODUCERS: ClassFileChangeTracker.nonStructuralChange()
+	 *  		   ImageBuilder.shouldPreserveBinary() (during compile->finishedWith)
+	 *  CONSUMER:  ImageBuilder.addAffectedTeamFiles()
+	 *  
+	 *  ENCODING: source file name
+	 */
+	HashSet<String> teamsToRecompile = new HashSet<String>();
+	
+	/** Get and clear the set of teams waiting for recompilation. */
+	HashSet<String> fetchTeamsToRecompile() {
+		HashSet<String> result = teamsToRecompile;
+		teamsToRecompile = new HashSet<String>();
+		return result;
+	}
+
+	/** If a tsuper role has non-structural changes, some sub-teams need to be recompiled.
+	 *  This set holds the roles that should NOT be preserved.
+	 *  PRODUCER: ClassFileChangeTracker.nonStructuralChange()
+	 *  CONSUMER: shouldPreserveBinary() (via shouldCandidateBePreserved())
+	 *  
+	 *  ENCODING: Qualified Type Name. p.T$I, canonical form, i.e., __OT__ prefixes removed.
+	 */
+	HashSet<String> staleRoles = new HashSet<String>();
+
+	synchronized void initializeDependencyStorage() {
+		this.roleToSubTeams = new HashMap<String, Set<String>>();
+		this.teamsToRecompile = new HashSet<String>();
+		this.staleRoles = new HashSet<String>();
+	}
+	
+	protected class BinaryType playedBy BinaryTypeBinding 
+	{
+		/** Record if a given type depends on an unresolvable type.
+		 *  More specifically, we look for roles depending on unresolvable tsuper roles. 
+		 */
+		superInterfaces         <- replace superInterfaces;
+		callin ReferenceBinding[] superInterfaces() {
+			try { 
+				return base.superInterfaces();
+			} catch (AbortCompilation as Abort abort) {
+				abort.referencedBinaries.add(this);
+				throw abort;
+			}
+		}
+		
+		// ==== Callouts: ==== 
+				
+		char[][] compoundName() -> get char[][] compoundName;
+
+		// DEBUGGING:
+		String internalName() -> char[] internalName() 
+			with { result <- new String(result) }
+	}
+	
+	protected class ClassScope playedBy ClassScope
+	{
+		@SuppressWarnings("decapsulation")
+		void connectTypeHierarchy() <- replace void connectTypeHierarchy();
+		@SuppressWarnings("basecall")
+		callin void connectTypeHierarchy() {
+			try {
+				base.connectTypeHierarchy();
+			} catch (org.eclipse.jdt.internal.compiler.problem.AbortType at) {
+				TypeDeclaration referenceContext = referenceContext();
+				SourceTypeBinding sourceType = referenceContext.binding;
+				at.updateContext(referenceContext, referenceCompilationUnit().compilationResult);
+				referenceContext.ignoreFurtherInvestigation = true;
+				if (sourceType.superInterfaces == null)
+					sourceType.superInterfaces = TypeBinding.NO_SUPERINTERFACES; // TODO(SH): recurse?
+				// don't rethrow, marking ignoreFurtherInvestigation is enough abortion
+			}
+		}
+		TypeDeclaration referenceContext()                    -> get TypeDeclaration referenceContext;
+		CompilationUnitDeclaration referenceCompilationUnit() -> CompilationUnitDeclaration referenceCompilationUnit();
+	}
+
+	protected class LiftingEnv playedBy LiftingEnvironment 
+	{
+		callin void init(TypeDeclaration teamType) {
+			try {
+				base.init(teamType);
+			} catch (org.eclipse.jdt.internal.compiler.problem.AbortType at) {
+				teamType.ignoreFurtherInvestigation = true;
+				BuildManager.this.teamsToRecompile.add(String.valueOf(teamType.compilationResult.fileName));
+				throw at; // TODO(SH): might want to mark certain AT-instances as recoverable?
+			}
+		}
+		init <- replace init;
+	}
+	
+	/** This role helps to link Problem->Abort->BinaryType,
+	 *  in order to determine whether a problem was caused by an unresolvable tsuper role.  
+	 */
+	protected class Abort playedBy AbortCompilation 
+	{
+		public List<BinaryType> referencedBinaries = new ArrayList<BinaryType>();
+
+		/** Trigger: this role has more to be updated from the context. */
+		void updateContext(ASTNode astNode, CompileResult unitResult) 
+			<- after void updateContext(ASTNode astNode, CompilationResult unitResult);
+
+		/** 
+		 * If the current abort exception could possibly be fixed by a recompile,
+		 * + convert the exception onto a less drastic AbortType 
+		 * + record the link Problem->Abort.
+		 */
+		public void updateContext(ASTNode astNode, CompileResult unitResult) {
+			Problem problem = getProblem();
+			if (   problem != null
+				&& problem.couldBeFixedByRecompile()
+				&& unitResult.isReusingBinaryMember()) 
+			{ 
+				// convert AbortCompilation into AbortType
+				Abort abort = new AbortType(
+								new org.eclipse.jdt.internal.compiler.problem.AbortType(
+									unitResult, problem));
+				abort.referencedBinaries = this.referencedBinaries;
+				problem.abortException = abort;				
+				RuntimeException ex = abort;
+				throw ex;
+			}
+		}
+	
+		protected Problem getProblem() -> get CategorizedProblem problem;
+	}
+	
+	protected class AbortType extends Abort playedBy AbortType 
+	{
+//		// FIXME : this ctor gives a VerifyError:
+//		AbortType (CompileResult result, Problem problem) {
+//			base(result, problem);
+//			problem.abortException = this;
+//		}
+		@Override
+		public void updateContext(ASTNode astNode, CompileResult unitResult) {
+			// no super call: would cause recursive creation of roles
+			Problem problem = getProblem();
+			if (problem != null) {
+				problem.abortException = this;
+			}
+		}
+	}
+	
+	/** Intermediate purely callout role. */
+	protected class CompileResult playedBy CompilationResult
+	{
+	  protected // don't publically export protected role Problem
+		Problem[] problems()                     -> get CategorizedProblem[] problems;
+		
+		// TODO(SH): workaround for lowering problem concerning base call in ImageBuilder.shouldPreserveBinary() 
+		boolean hasBinaryMember(char[] typeName) ->     boolean hasBinaryMember(char[] typeName);
+		
+		@SuppressWarnings({"decapsulation", "unchecked"})
+	  protected
+		boolean isReusingBinaryMember() 		 -> get ArrayList binaryMemberNames
+			with { result <- !(result == null || result.isEmpty()) }
+		
+		char[] getFileName() -> char[] getFileName();
+		// debugging:
+		toString => toString;
+	}
+	
+	/** Let a problem know about the associated exception. */
+	protected class Problem playedBy CategorizedProblem 
+	{
+		public Abort abortException = null;
+		public char[] typeToRemove= null;
+	
+		/** Certain problem reasons might be fixed by recompilation. */
+		protected boolean couldBeFixedByRecompile() {
+			switch (getID()) {
+			case IProblem.IsClassPathCorrect:
+			case IProblem.StaleTSuperRole:
+			case IProblem.StaleSubRole:
+			case IProblem.MissingRoleInBinaryTeam:
+			case IProblem.RoleFileInBinaryTeam:
+			case IProblem.CorruptBytecode:
+			case IProblem.MissingAccessorInBinary:
+			case IProblem.MismatchingRoleParts:
+			case IProblem.InconsistentlyResolvedRole:
+			case IProblem.NotGeneratingCallinBinding:
+				return true;
+			default:
+				return false;
+			}
+		}
+		
+		int getID() -> int getID();
+		// debugging:
+		toString => getMessage;
+	}
+
+	/** Watch specific error reports. */
+	protected class ProblemReporter playedBy ProblemReporter {
+
+		// a missing role in a binary team means the binary team should probably be deleted.
+		void missingRoleInBinaryTeam(ReferenceBinding type)
+		<- replace void missingRoleInBinaryTeam(char[] roleName, ReferenceBinding enclosingTeam)
+			with { type <- enclosingTeam }
+
+		callin void missingRoleInBinaryTeam(ReferenceBinding type) {
+			ReferenceContext context= getReferenceContext();
+			try {
+				base.missingRoleInBinaryTeam(type);
+			} finally {
+				if (context != null && context.compilationResult() != null) {			
+					int count= context.compilationResult().problemCount;
+					recordTypeToRemove(context.compilationResult().problems[count-1], 
+										  type.constantPoolName());
+				}
+			}
+		}
+
+		ReferenceContext getReferenceContext() -> get ReferenceContext referenceContext;
+	}
+
+	// ---- ImageBuilder is a role file ---- 
+
+	
+	// ---- Team level features: ----
+	void recordTypeToRemove(CategorizedProblem as Problem prob, char[] roleName) {
+		prob.typeToRemove= roleName;
+	}
+
+	public static boolean isPredefinedRole(char[] roleName) {
+		int dollarPos = CharOperation.lastIndexOf('$', roleName);
+		if (dollarPos != -1) 
+			roleName = CharOperation.subarray(roleName, dollarPos+1, -1);
+		return CharOperation.equals(roleName, IOTConstants.CONFINED)
+			|| CharOperation.equals(roleName, IOTConstants.OTCONFINED)
+			|| CharOperation.equals(roleName, IOTConstants.ICONFINED)
+			|| CharOperation.equals(roleName, IOTConstants.IBOUNDBASE)
+			|| CharOperation.equals(roleName, IOTConstants.ILOWERABLE);					
+	}
+	
+	/** Answer whether the given role type should be re-used (ask the ImageBuilder). */
+	public boolean shouldPreserveBinaryRole(ReferenceBinding role, CompilationResult as CompileResult cResult) {
+		if (builder == null)
+			return true;
+		return builder.shouldPreserveBinaryRole(role, cResult);
+	}
+	
+	public String canonicalName(String roleName) {
+		return roleName.replace(IOTConstants.OT_DELIM, ""); //$NON-NLS-1$
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BuildManager/ClassFileChangeTracker.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BuildManager/ClassFileChangeTracker.java
new file mode 100644
index 0000000..f1d9b75
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BuildManager/ClassFileChangeTracker.java
@@ -0,0 +1,62 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: ClassFileChangeTracker.java 23451 2010-02-04 20:33:32Z 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
+ **********************************************************************/
+team package org.eclipse.objectteams.otdt.internal.compiler.adaptor.BuildManager;
+
+import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
+
+
+/**
+ * This class tracks whenever a classfile has non-structural changes.
+ * In that case a re-compile is needed iff the class is a role of
+ * which copies exist in subteams within the workspace/project.
+ *  
+ * @author stephan
+ */
+@SuppressWarnings("restriction")
+public class ClassFileChangeTracker playedBy ClassFileReader 
+{	
+	void nonStructuralChange(String className) <- after boolean hasStructuralChanges(byte[] newBytes)
+			when (!result)
+			with {className <- new String(base.getName())}
+			
+	/** No structural changes where detected, yet bytes differ.*/
+	// static for optimization (avoid lifting).
+	protected static void nonStructuralChange(String className) {
+		className = className.replace('/', '.');
+		if (DEBUG >= 2)
+			System.out.println("Non-structural change for "+className); //$NON-NLS-1$
+		int dollarPos = className.lastIndexOf('$');
+		if (dollarPos == -1)
+			return; // not a role
+		String roleName = canonicalName(className.substring(dollarPos+1)); //excluding '$'	
+		Set<String> teamSourceFileNames = BuildManager.this.roleToSubTeams.get(className);
+		if (teamSourceFileNames != null)
+			for (String teamSourceFileName : teamSourceFileNames) { 
+				if (DEBUG > 0)
+					System.out.println("need to recompile "+teamSourceFileName);  //$NON-NLS-1$
+				BuildManager.this.teamsToRecompile.add(teamSourceFileName);
+				String teamTypeName = teamSourceFileName.substring(0, teamSourceFileName.length()-5); // .java
+				// mark both parts (class/ifc) as stale:
+				BuildManager.this.staleRoles.add(teamTypeName+'$'+roleName);
+				BuildManager.this.staleRoles.add(teamTypeName+'$'+IOTConstants.OT_DELIM+roleName);
+			}		
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BuildManager/ImageBuilder.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BuildManager/ImageBuilder.java
new file mode 100644
index 0000000..f434f76
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/BuildManager/ImageBuilder.java
@@ -0,0 +1,269 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: ImageBuilder.java 23451 2010-02-04 20:33:32Z 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
+ **********************************************************************/
+team package org.eclipse.objectteams.otdt.internal.compiler.adaptor.BuildManager;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.internal.core.builder.SourceFile;
+import org.eclipse.jdt.internal.core.builder.WorkQueue;
+import org.eclipse.objectteams.otdt.core.compiler.OTNameUtils;
+
+/**
+ * @author stephan
+ */
+@SuppressWarnings("restriction")
+protected class ImageBuilder playedBy IncrementalImageBuilder 
+{
+	ImageBuilder (IncrementalImageBuilder builder) {
+		BuildManager.this.builder = this;
+	}
+	
+	// Set of teams being compiled due to our special request.
+	// don't preserve binary roles within such a team.
+	private HashSet<String> teamsForcedRecompilation = new HashSet<String>(); 
+	resetQueue:
+	void resetQueue() <- after void compile(SourceFile[] files);
+	void resetQueue() {
+		teamsForcedRecompilation.clear();
+	}
+
+	/**
+	 * Trigger B1: During processing a type with errors ... 
+	 */
+	storeProblemsFor <- replace storeProblemsFor;
+	
+	/** Before storing problems for a given source file, check whether the problem
+	 *  could be due to a binary role referring to a stale or missing tsuper-copy.
+	 *  In that case trigger recompilation. 
+	 *  The binary file will be deleted later ...
+	 */
+	callin void storeProblemsFor(SourceFile sourceFile, Problem[] problems) 
+		throws org.eclipse.core.runtime.CoreException 
+	{
+		if (sourceFile != null && problems != null && problems.length > 0) {
+			Problem[] remainingProblems = new Problem[problems.length];
+			int count = 0;
+			for (int i = 0; i < problems.length; i++) {
+				if (problems[i].couldBeFixedByRecompile()) {
+					// record the source file for recompilation:
+					ArrayList<SourceFile> sourceFiles = sourceFiles();
+					if (!sourceFiles.contains(sourceFile)) {
+						sourceFiles.add(sourceFile);
+						if (DEBUG>0)
+							System.out.println("Abort causes recompile of "+sourceFile); //$NON-NLS-1$
+					}
+					// don't add the problem to remainingProblems, because any IProblem.IsClassPathCorrect
+					// will abort this compilation! (we still think, we can fix this problem..)
+					char[] typePath= problems[i].typeToRemove;
+					if (typePath != null)
+						this.scheduleForRemoval(sourceFile, String.valueOf(typePath));
+				} else {
+					remainingProblems[count++] = problems[i];
+				}
+			}
+			if (count < problems.length)
+				System.arraycopy(remainingProblems, 0, problems = new Problem[count], 0, count);
+		}
+		base.storeProblemsFor(sourceFile, problems);
+	}
+	
+	void scheduleForRemoval(SourceFile sourceFile, String typePath) 
+		-> void scheduleForRemoval(SourceFile sourceFile, String typePath);
+	
+	/**
+	 * Trigger B2: During finishedWith() generated binary files are deleted, but some 
+	 *             should perhaps be preserved...
+	 */
+	shouldPreserveBinary <- replace shouldPreserveBinary;
+
+	/**
+	 * If the given binary type is a re-used member (role) preserve the binary file, 
+	 * HOWEVER, if it has dependency problems do NOT preserve it.
+	 * 
+	 * @param cResult
+	 * @param sourceFolder
+	 * @param packagePath
+	 * @param binaryTypeName
+	 * @return
+	 */
+	callin boolean shouldPreserveBinary(CompileResult cResult,
+									    IPath sourceFolder,
+										IPath packagePath,
+										char[] binaryTypeName) 
+	{
+		// don't preserve re-used binary types with problems. They might be stale.
+		if (!base.shouldPreserveBinary(cResult, sourceFolder, packagePath, binaryTypeName))
+			return false;
+		return shouldPreserveBinaryRole(cResult, sourceFolder, packagePath, binaryTypeName);
+	}
+	/** Entry from AdaptorActivator.CopyInheritanceObserver (via BuildManager): */
+	protected boolean shouldPreserveBinaryRole(ReferenceBinding role, CompileResult cResult) {
+		String fileName    = new String(cResult.getFileName());
+		IPath packagePath  = new Path(fileName).removeLastSegments(1);
+		int packageDepth   = role.getPackage().compoundName.length;
+		IPath sourceFolder = packagePath.removeLastSegments(packageDepth);	
+		packagePath        = packagePath.removeFirstSegments(sourceFolder.segmentCount());
+		char[][] roleName  = CharOperation.splitOn('.', role.attributeName());
+		boolean result = shouldPreserveBinaryRole(cResult, sourceFolder, packagePath, roleName[roleName.length-1]); // Team$Role
+		if (!result)
+			scheduleForRemoval(findTeamSourceFile(fileName), new String(role.constantPoolName()));
+		return result;
+	}
+	/** Common implementation for the two entries above.
+	 *  Both clients when receiving a 'false' answer will remove the stale binary class.
+	 *  This will ensure that during the next cycle this type will be compiled from source.
+	 */
+	boolean shouldPreserveBinaryRole(CompileResult cResult, IPath sourceFolder, IPath packagePath, char[] binaryTypeName) 
+	{
+		// binary type with problem -> NO 		
+		if (binaryHasProblem(cResult.problems(), binaryTypeName))
+			return false;
+		
+		String binaryTypeString = packagePath.toString()+"/"+new String(binaryTypeName);
+		if (DEBUG >= 2)
+			System.out.print("candidate for preserving: "+binaryTypeString); //$NON-NLS-1$
+		
+		// predefined type -> YES
+		if (isPredefinedRole(binaryTypeName)) {
+			if (DEBUG >= 2)
+				System.out.println(" YES(predefined)."); //$NON-NLS-1$
+			return true;
+		}
+		// others: further investigate.
+		boolean shouldPreserve = shouldCandidateBePreserved(sourceFolder, binaryTypeString);
+		if (!shouldPreserve)
+			// propagate changes down to sub-teams:
+			ClassFileChangeTracker.nonStructuralChange(binaryTypeString);
+		return shouldPreserve;
+	}
+	/** Checks the following reasons against preserving:<ul>
+	 *  <li> the enclosing team is forced for recompilation (meaning: full recompilation)
+	 *  <li> the given type is a role known to be stale                                   */
+	boolean shouldCandidateBePreserved(IPath sourceFolder, String binaryTypeString) 
+	{
+		int dollarPos = binaryTypeString.lastIndexOf('$');
+		String enclosingRelativeFileString = binaryTypeString.substring(0, dollarPos)+".java"; //$NON-NLS-1$
+		String enclosingAbsoluteFileString = sourceFolder.append(enclosingRelativeFileString).toString();
+		for (String teamFileName : teamsForcedRecompilation) {
+			if (teamFileName.equals(enclosingAbsoluteFileString)) {
+				if (DEBUG >= 2)
+					System.out.println(" NO(forced)."); //$NON-NLS-1$
+				BuildManager.this.teamsToRecompile.add(teamFileName); // let binary roles be removed and try again.
+				return false;
+			}
+		}		
+		binaryTypeString = sourceFolder.append(binaryTypeString).toString();
+		if (BuildManager.this.staleRoles.contains(binaryTypeString)) {
+			BuildManager.this.staleRoles.remove(binaryTypeString);
+			if (DEBUG >= 2)
+				System.out.println(" NO(changed).");
+			return false;
+		}
+		
+		if (DEBUG >= 2)
+			System.out.println(" YES");
+		return true;		
+	}
+	
+	/** Is the given binary type known to have an unresolved dependency? */
+	boolean binaryHasProblem(Problem[] problems, char[] binaryTypeName) {
+		if (problems != null) 
+			for (Problem problem : problems) 
+				if (problem != null && problem.abortException != null) {
+					Abort abort = problem.abortException;
+					for (BinaryType binding : abort.referencedBinaries) {
+						char[][] compoundName = binding.compoundName();
+						if (CharOperation.equals(compoundName[compoundName.length-1], binaryTypeName))
+							return true;
+					}
+				}
+		// remove "__OT__" from binaryTypeName
+		char[] strippedName = OTNameUtils.removeOTDelim(binaryTypeName);
+		if (strippedName != binaryTypeName)
+			return binaryHasProblem(problems, strippedName);
+		return false;
+	}
+	
+	// Trigger: after adding source files to compile,
+	//          consider any roles which have been copied:
+	//          if the source changed, all sub teams must be recompiled.
+	void addAffectedTeamFiles() <- after void addAffectedSourceFiles();
+	
+	void addAffectedTeamFiles() {
+		// fetch sets of teams:
+		Set<String> teamFiles = fetchTeamsToRecompile();
+		
+		ArrayList<SourceFile> sourceFiles = sourceFiles();
+		
+		// add all relevant teams to sourceFiles:
+		for (String teamName : teamFiles) {
+			SourceFile teamFile = findTeamSourceFile(teamName);
+			if (   teamFile != null 
+				&& !sourceFiles.contains(teamFile)) 
+			{
+				if (DEBUG>0)
+					System.out.println("Scheduling for recompilation: teamFile "+teamFile+" for "+teamName); //$NON-NLS-1$ //$NON-NLS-2$
+				sourceFiles.add(teamFile);
+				teamsForcedRecompilation.add(teamName);
+			}
+		}
+	}
+	SourceFile findTeamSourceFile(String teamName) {
+		IWorkspace ws = ResourcesPlugin.getWorkspace();
+		IFile file = ws.getRoot().getFile(new Path(teamName));
+		return findSourceFile(file);
+	}
+
+	// ==== GENERAL ACCESS TO BASE ELEMENTS: ====
+	
+	@SuppressWarnings("decapsulation")
+	SourceFile findSourceFile(IFile file) -> SourceFile findSourceFile(IFile file, boolean mustExist)
+		with { file -> file, true -> mustExist, result <- result }
+
+	@SuppressWarnings({"decapsulation", "unchecked"})
+	ArrayList<SourceFile> sourceFiles() -> get ArrayList<SourceFile> sourceFiles;
+	
+	@SuppressWarnings("decapsulation")
+	WorkQueue   getWorkQueue()          -> get WorkQueue workQueue;
+		
+	// ==== LOGGING ====
+	void logCompile(String msg) <- before void compile(SourceFile[] units)
+		with { msg <- "Starting" }
+
+	logDone:
+	void logCompile(String msg) <- after void compile(SourceFile[] units)
+		with { msg <- "Done" }
+
+	void logCompile(String msg)
+		when (DEBUG > 0)
+	{
+		System.out.println("Incremental compilation: "+msg+" for "+getWorkQueue());
+	}
+	
+	precedence resetQueue, logDone;
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/CompilationThreadWatcher.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/CompilationThreadWatcher.java
new file mode 100644
index 0000000..7b4ca0c
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/CompilationThreadWatcher.java
@@ -0,0 +1,48 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2008 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: CompilationThreadWatcher.java 23451 2010-02-04 20:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.compiler.adaptor;
+
+import base org.eclipse.jdt.internal.compiler.ProcessTaskManager;
+
+/**
+ * This team observes the ProcessTaskManager in order to extend team activation
+ * of sub-teams to the processingTask once it is created.
+ * 
+ * @author stephan
+ * @since 1.2.0
+ */
+@SuppressWarnings("restriction")
+public team class CompilationThreadWatcher 
+{
+	protected class ProcessTaskManager playedBy ProcessTaskManager 
+	{
+		
+		@SuppressWarnings("decapsulation")
+		Thread getProcessingThread() -> get Thread processingThread; 
+
+		
+		extendActivation <- after setConfig;
+		void extendActivation() {
+			CompilationThreadWatcher.this.activate(getProcessingThread());
+		}
+		
+
+		void cleanup() <- after void run();
+		void cleanup() { CompilationThreadWatcher.this.deactivate(); }
+		
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/IllegalReusedBinaryRoleException.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/IllegalReusedBinaryRoleException.java
new file mode 100644
index 0000000..04f52fb
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/IllegalReusedBinaryRoleException.java
@@ -0,0 +1,29 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: IllegalReusedBinaryRoleException.java 23451 2010-02-04 20:33:32Z 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.internal.compiler.adaptor;
+
+@SuppressWarnings("serial")
+public class IllegalReusedBinaryRoleException extends RuntimeException {
+	public IllegalReusedBinaryRoleException(String msg) {
+		super(msg);
+	}
+	
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/PDEAdaptor.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/PDEAdaptor.java
new file mode 100644
index 0000000..ff3c448
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/PDEAdaptor.java
@@ -0,0 +1,273 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: PDEAdaptor.java 23451 2010-02-04 20:33:32Z 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.internal.compiler.adaptor;
+
+import java.io.InputStream;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IAccessRule;
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.core.ClasspathAccessRule;
+import org.eclipse.osgi.service.resolver.BundleDescription;
+import org.eclipse.osgi.service.resolver.ExportPackageDescription;
+import org.eclipse.osgi.service.resolver.StateHelper;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase;
+
+import base org.eclipse.pde.internal.core.PDEClasspathContainer;
+import base org.eclipse.pde.internal.core.RequiredPluginsClasspathContainer;
+import base org.eclipse.pde.internal.core.PDEClasspathContainer.Rule;
+import base org.eclipse.pde.internal.core.bundle.BundlePluginModel;
+import base org.eclipse.pde.internal.core.plugin.WorkspaceExtensionsModel;
+
+/**
+ * Adapt classes from the PDE core as to feed information about aspectBindings
+ * into the compilation process (to be consumed by BaseImportChecker).
+ * 
+ * Final target as expected by the BaseImportChecker:
+ *  + aspectBindingData (of type AdaptedBaseBundle) have been added to ClasspathAccessRules 
+ *    and the problemID has been adjusted.
+ * 
+ * 
+ * @author stephan
+ * @since 1.1.5
+ */
+@SuppressWarnings("restriction")
+public team class PDEAdaptor 
+{
+	static PDEAdaptor instance; 
+	
+	public PDEAdaptor() {
+		instance= this;
+	}
+
+	/**
+	 * <ul> 
+	 * <li>Store aspectBinding info in Role objects.</li>
+	 * <li>Add additional rules for forcedExports.</li>
+	 * </ul> 
+	 */
+	protected class RequiredPluginsClasspathContainer
+			extends PDEClasspathContainer
+			playedBy RequiredPluginsClasspathContainer 
+	{
+		
+		protected AspectBindingReader aspectBindingReader;
+		
+		void updateRule(String providingBundle, Rule rule) 
+		 <- after Rule getRule(StateHelper helper, BundleDescription desc, ExportPackageDescription export)
+			with { providingBundle <- export.getExporter().getSymbolicName(),
+				   rule            <- result
+			}
+		/** Handles adaptation info for exported packages, Rule role created via regular lifting. */
+		void updateRule(String providingBundle, Rule rule) {
+			if (aspectBindingReader != null && aspectBindingReader.isAdaptedBase(providingBundle)) {
+				// no merging because rule (base & role) are fresh instances
+				rule.aspectBindingData= aspectBindingReader.getAdaptationInfo(providingBundle);
+			}
+		}
+		
+		@SuppressWarnings({ "decapsulation", "rawtypes" })
+		Rule[] addForcedExports(BundleDescription desc) 
+		 <- replace Rule[] getInclusions(Map map, BundleDescription desc)
+		    with { desc <- desc }
+		/** Handles adaptation info for non-exported packages, Rule role explicitly created. */		
+		callin Rule[] addForcedExports(BundleDescription desc) 
+		{
+			Rule[] regularRules= base.addForcedExports(desc);
+			if (aspectBindingReader == null)
+				return regularRules; // done: no aspect bindings
+			HashSet<String> forcedExports= aspectBindingReader.getForcedExports(desc.getSymbolicName());
+			if (forcedExports == null)
+				return regularRules; // done: no forced exports
+			
+			AdaptedBaseBundle aspectBindingData= aspectBindingReader.getAdaptationInfo(desc.getSymbolicName());			
+			// create additional rules:
+			Rule[] additionalRules= new Rule[forcedExports.size()];
+			Iterator<String> exportIter= forcedExports.iterator();
+			for (int i = 0; i < additionalRules.length; i++) 
+				additionalRules[i]= new Rule(this, aspectBindingData, exportIter.next());
+			
+			// merge arrays:
+			int len1= regularRules.length, len2= additionalRules.length;
+			Rule[] result= new Rule[len1+len2];
+			System.arraycopy(additionalRules, 0, result, 0, len2);
+			System.arraycopy(regularRules, 0, result, len2, len1);
+			
+			return result;
+		}
+		
+		@SuppressWarnings("decapsulation")
+		protected
+		BundleModel getBundleModel() -> get IPluginModelBase fModel
+			with { result <- (BundlePluginModel)fModel }
+
+		// -- debug: --		
+		String baseToString() => String toString();
+		
+		@SuppressWarnings("nls")
+		@Override
+		public String toString() {
+			return "Role for "+baseToString()+" with aspectBindingReader\n  "
+				  + ((this.aspectBindingReader != null) ? this.aspectBindingReader.toString() : "null");
+		}
+	}
+	
+	/**
+	 * Synthetic rules representing adapted or forcedExports.
+	 */
+	@SuppressWarnings("decapsulation")
+	protected class Rule playedBy Rule 
+	{
+		void setPath(IPath path) -> set IPath path;
+
+		// intermediate storage between AspectBindingReader and ClasspathAccessRule:
+		protected AdaptedBaseBundle aspectBindingData; 
+		protected boolean isForcedExport;
+		
+		/** Ctor for force-exported packages (merely adapted packages instantiate via lifting ctor). */
+		protected Rule(RequiredPluginsClasspathContainer encl, AdaptedBaseBundle aspectBindingData, String packageName) 
+		{
+			encl.base();
+			String pattern= packageName.replace('.', '/')+"/*"; //$NON-NLS-1$
+			setPath(new Path(pattern));
+			this.aspectBindingData= aspectBindingData;
+			this.isForcedExport= true;
+		}
+		// -- debug: --
+		String baseToString() => String toString();
+		
+		@SuppressWarnings("nls")
+		@Override
+		public String toString() {
+			String result= baseToString();
+			if (this.isForcedExport)
+				result+= " (forced export)";
+			return result+" with aspect data\n  "
+				  + ((this.aspectBindingData == null) ? "null" : this.aspectBindingData.toString());
+		}		
+	}
+	
+	/** After converting Rules to IAccessRules transfer adaptation info and adjust problemId. */
+	protected class PDEClasspathContainer playedBy PDEClasspathContainer 
+	{
+		void getAccessRules(Rule[] rules, IAccessRule[] accessRules) 
+		  <- after IAccessRule[] getAccessRules(Rule[] rules)
+			 with { rules <- rules, accessRules <- result }
+		static void getAccessRules(Rule[] rules, IAccessRule[] accessRules) {
+			for (int i = 0; i < rules.length; i++) {
+				Rule rule = rules[i];
+				if (rule.aspectBindingData != null) {
+					ClasspathAccessRule classpathAccessRule = (ClasspathAccessRule)accessRules[i];
+					if (rule.isForcedExport) {
+						// don't let this rule leak to other clients
+						classpathAccessRule = new ClasspathAccessRule(classpathAccessRule.pattern, IProblem.BaseclassDecapsulationForcedExport);
+						classpathAccessRule.aspectBindingData = new Object[] { rule.aspectBindingData };
+						accessRules[i] = classpathAccessRule;
+					} else { 
+						addAspectBindingData(classpathAccessRule, rule.aspectBindingData);
+					}
+				}
+			}
+		}
+	}
+	/**
+     * Add the given aspect binding data to the given access rule.
+     * @return: has data been added (vs. merged or already present)? 
+	 */
+	public static boolean addAspectBindingData(ClasspathAccessRule accessRule, AdaptedBaseBundle aspectBindingData) {
+		// nothing present yet?
+		if (accessRule.aspectBindingData == null) {
+			accessRule.aspectBindingData = new Object[] { aspectBindingData };
+			if (accessRule.problemId == 0)
+				accessRule.problemId= IProblem.AdaptedPluginAccess;
+			return true;
+		}
+		// exact binding data already present?
+		for (Object data : accessRule.aspectBindingData)
+			if (data == aspectBindingData)
+				return false;
+		// different binding data for the same base bundle present?
+		for (Object data : accessRule.aspectBindingData)
+			if (((AdaptedBaseBundle)data).merge(aspectBindingData))
+				return false;
+		// different base bundles, must be the case of split packages
+		for (Object data : accessRule.aspectBindingData)
+			((AdaptedBaseBundle)data).hasPackageSplit = true;
+		aspectBindingData.hasPackageSplit = true;
+		int len = accessRule.aspectBindingData.length;
+		System.arraycopy(accessRule.aspectBindingData, 0, accessRule.aspectBindingData = new Object[len+1], 0, len);
+		accessRule.aspectBindingData[len] = aspectBindingData;
+		return true;
+	}
+
+	/** Helper role for updating aspect binding information. */
+	protected class BundleModel playedBy BundlePluginModel {
+		protected AspectBindingReader aspectBindingReader;
+		
+	}
+	
+	/** 
+	 * This role listens to updates on its base.
+	 * If the associated bundle model has a role with a registered
+	 * aspect binding reader, trigger reloading when the model has changed. 
+	 */
+	protected class ModelListener playedBy WorkspaceExtensionsModel {
+		void resetAspectReader() <- after void load(InputStream is, boolean reload);
+		void resetAspectReader () throws CoreException {
+			try {
+				BundleModel bundle= getFBundleModel();
+				if (bundle != null && bundle.aspectBindingReader != null)
+					bundle.aspectBindingReader.reload();
+			} catch (ClassCastException cce) {
+				// CCE could be thrown by parameter mapping of getFBundleModel().
+			}
+		}
+		/** This declaration is for documentation only: read the fBundleModel field.
+		 * @return a BundleModel role
+		 * @throws ClassCastException thrown when fBundleModel is not a BundlePluginModel.
+		 */
+		abstract BundleModel getFBundleModel() throws ClassCastException;
+		@SuppressWarnings("decapsulation")
+		BundleModel getFBundleModel() -> get IBundlePluginModelBase fBundleModel
+			with { result <- (BundlePluginModel)fBundleModel }
+	}
+
+	/** Register an aspect binding reader for a given RequiredPluginsClasspathContainer. */
+	void setAspectBindingReader(AspectBindingReader aspectBindingReader,
+		RequiredPluginsClasspathContainer as RequiredPluginsClasspathContainer container) 
+	{
+		container.aspectBindingReader= aspectBindingReader;
+		try {
+			// link bundle model and reader for updating lateron:
+			BundleModel bundle= container.getBundleModel();
+			if (bundle != null)
+				bundle.aspectBindingReader= aspectBindingReader;
+		} catch (ClassCastException cce) {
+			// can happen in param mapping of c-t-f, wrong model type, ignore.
+		}
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/PlainProjectWatcher.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/PlainProjectWatcher.java
new file mode 100644
index 0000000..d1258ce
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/PlainProjectWatcher.java
@@ -0,0 +1,57 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: PlainProjectWatcher.java 23451 2010-02-04 20:33:32Z 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.internal.compiler.adaptor;
+
+import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
+import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
+import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
+import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
+
+import base org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
+
+/**
+ * This team advises the ProblemReporter for non-OT-Plugin projects.
+ * These projects must simply ignore `AccessRestrictions' with
+ * problemId AdaptedPluginAccess, which is not a real problem.
+ *   
+ * @author stephan
+ * @since 1.1.5
+ */
+@SuppressWarnings("restriction")
+public team class PlainProjectWatcher extends CompilationThreadWatcher
+{
+	protected class ProblemReporter playedBy ProblemReporter 
+	{
+		void forbiddenReference(AccessRestriction restriction) 
+		<- replace void forbiddenReference(TypeBinding   type,   ASTNode location, byte entryType, AccessRestriction restriction),
+				   void forbiddenReference(FieldBinding  field,  ASTNode location, byte entryType, AccessRestriction restriction),
+				   void forbiddenReference(MethodBinding method, ASTNode location, byte entryType, AccessRestriction restriction)
+		   with { restriction <- restriction }
+
+		@SuppressWarnings("basecall")
+		callin void forbiddenReference(AccessRestriction restriction) {
+			if (restriction.getProblemId() != IProblem.AdaptedPluginAccess)
+				base.forbiddenReference(restriction);
+		}
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/ProjectUtil.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/ProjectUtil.java
new file mode 100644
index 0000000..a7d4b5c
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/ProjectUtil.java
@@ -0,0 +1,63 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for 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: ProjectUtil.java 23451 2010-02-04 20:33:32Z 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.internal.compiler.adaptor;
+
+import org.eclipse.core.internal.resources.Project;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.core.ExternalJavaProject;
+import org.eclipse.objectteams.otdt.core.ext.OTJavaNature;
+
+@SuppressWarnings("restriction")
+public class ProjectUtil {
+
+	static final String PLUGIN_ID = "org.eclipse.objectteams.otdt.internal.compiler.adaptor";  //$NON-NLS-1$
+	
+	// Don't use API from from PDE, to reduce dependencies.
+	static final String PLUGIN_NATURE = "org.eclipse.pde.PluginNature"; //$NON-NLS-1$
+	
+	public static Project safeGetOTPluginProject(ICompilationUnit unitElem) {
+		IJavaProject project= unitElem.getJavaProject();
+		if (ProjectUtil.isOTPluginProject(project.getProject()))
+			return (Project)project.getProject();
+		return null;
+	}
+
+	public static boolean isOTPluginProject(IProject project)  {
+		if (project == null) return false;
+		try {
+			return    project.hasNature(PLUGIN_NATURE)
+			       && OTJavaNature.hasOTJavaNature(project);
+		} catch (CoreException e) {
+			if (!ExternalJavaProject.EXTERNAL_PROJECT_NAME.equals(project.getName())) // see JavaProject.hasJavaNature()
+				JavaCore.getJavaCore().getLog().log(new Status(IStatus.ERROR, 
+															   PLUGIN_ID, 
+															   "Error reading project natures",          //$NON-NLS-1$
+															   e));
+			return false;
+		}
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/ResourceProjectAdaptor.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/ResourceProjectAdaptor.java
new file mode 100644
index 0000000..333aa95
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/ResourceProjectAdaptor.java
@@ -0,0 +1,86 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2008, 2010 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: ResourceProjectAdaptor.java 23451 2010-02-04 20:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.compiler.adaptor;
+
+import org.objectteams.LiftingVetoException;
+import org.objectteams.Team;
+
+import base org.eclipse.core.internal.resources.Project;
+
+/**
+ * Simple decoration of class Project from org.eclipse.core.resources.
+ *  
+ * @author stephan
+ * @since 1.1.8
+ */
+@SuppressWarnings("restriction")
+public team class ResourceProjectAdaptor 
+{
+	private static ResourceProjectAdaptor instance;
+	public ResourceProjectAdaptor() {
+		instance= this;
+	}
+	public static ResourceProjectAdaptor getDefault() { return instance; }
+	
+	/** Associate an AspectBindingReader and a BaseImportChecker to each OT Plugin project. */
+	protected class OTEquinoxProject playedBy Project
+	{
+		protected AspectBindingReader aspectBindingReader;
+		protected BaseImportChecker checker;
+
+		/** 
+		 * Lifting constructor which refuses lifting for non OT-plugin projects,
+		 * or if the project is not yet ready for reading plugin.xml. 
+		 */
+		public OTEquinoxProject(Project baseProject) {
+			try {
+				if (!ProjectUtil.isOTPluginProject(baseProject))
+					throw new org.objectteams.LiftingVetoException();
+				this.aspectBindingReader = new AspectBindingReader(baseProject); // may also throw LVE.
+				this.checker= new BaseImportChecker(this.aspectBindingReader);
+			} catch (LiftingVetoException lve) {
+				// no success: unregister this useless role
+				ResourceProjectAdaptor.this.unregisterRole(this, OTEquinoxProject.class);
+				throw lve; // will be caught in several clients within AdaptorActivator
+			}
+		}
+		/** ask for changes to determine if classpath has to be recomputed: */
+		protected boolean hasAspectDataChanged () {
+			return this.aspectBindingReader != null
+				&& this.aspectBindingReader.fetchHasChanges();
+		}
+	}
+
+	// ======== API: =========
+	
+	public Team getChecker(Project as OTEquinoxProject project) 
+			throws LiftingVetoException 
+	{
+		return project.checker;
+	}
+	public AspectBindingReader getAspectBindingReader(Project as OTEquinoxProject project) 
+			throws LiftingVetoException 
+	{
+		return project.aspectBindingReader;
+	}
+	public boolean hasAspectDataChanged(Project as OTEquinoxProject project)  
+			throws LiftingVetoException 
+	{
+		return project.hasAspectDataChanged();
+	}
+
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/RoleReuseGuard.java b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/RoleReuseGuard.java
new file mode 100644
index 0000000..6345187
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.compiler.adaptor/src/org/eclipse/objectteams/otdt/internal/compiler/adaptor/RoleReuseGuard.java
@@ -0,0 +1,197 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2006, 2010 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: RoleReuseGuard.java 23451 2010-02-04 20:33:32Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.compiler.adaptor;
+
+import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.internal.compiler.classfmt.ClassFileStruct;
+import org.eclipse.jdt.internal.compiler.env.AccessRestriction;
+import org.eclipse.jdt.internal.compiler.env.IBinaryType;
+import org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
+import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
+
+import base org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding;
+import base org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment;
+import base org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
+import base org.eclipse.objectteams.otdt.internal.core.compiler.ast.RoleFileCache;
+import base org.eclipse.objectteams.otdt.internal.core.compiler.bytecode.AbstractAttribute;
+import base org.eclipse.objectteams.otdt.internal.core.compiler.bytecode.WordValueAttribute;
+
+/**
+ * This team avoids the situation that a source team when loading its RoFi cache
+ * loads a binary role which is neither purely copied nor a role file.
+ * Such roles are either stale (no longer present in the team) or in some other
+ * way conflict with a role currently being translated.
+ * 
+ * By intervening in classfile lookup we prevent conflicting binaries to be 
+ * stored by the LookupEnvironment.
+ * 
+ * @author stephan
+ */
+@SuppressWarnings("restriction")
+public team class RoleReuseGuard 
+{
+	public static int DEBUG = 2; // levels: 0 nothing, 1 some, 2 more.
+
+	// ==== the following roles communicate a cflow-dependency via this field:  ====
+	static ThreadLocal<Object> isLoadingRolesOfSourceType = new ThreadLocal<Object>();
+
+	/** Reflect base super-class by a corresponding role super-class. */
+	protected class AbstractAttribute playedBy AbstractAttribute {
+		protected boolean nameEquals(char[] name) -> boolean nameEquals(char[] name);
+	}
+	
+	/** This role is a trigger in UseCase A. */
+	protected class WordValueAttribute 
+			extends AbstractAttribute 
+			playedBy WordValueAttribute 
+	{
+		void checkClassFlags(WordValueAttribute attr) 
+		<- after WordValueAttribute readClassFlags(ClassFileStruct reader, 
+												   int             readOffset,
+												   int[]           constantPoolOffsets)
+		with { attr <- result }
+		
+		static void checkClassFlags(WordValueAttribute attr) {
+			if (RoleReuseGuard.isLoadingRolesOfSourceType.get() != null)
+				checkNonReusableRole(attr.getValue());
+		}
+		@SuppressWarnings("decapsulation")
+		protected
+		int getValue() -> get int _value;
+		toString => toString;
+	}
+	
+	/** A pure cflow-guard. */
+	protected class RoFiTracker
+			playedBy RoleFileCache 
+	{
+		@SuppressWarnings("decapsulation")
+		cflow <- replace readBinary;
+		@SuppressWarnings("basecall")
+		callin void cflow() {
+			Object save = isLoadingRolesOfSourceType.get();
+			isLoadingRolesOfSourceType.set(new Object());
+			try {
+				base.cflow();
+			} catch (IllegalReusedBinaryRoleException irbre) {
+				// do nothing. role could simply not be re-used.
+			} finally {
+				isLoadingRolesOfSourceType.set(save);
+			}
+		}		
+	}
+	
+	protected class SourceTypeBinding playedBy SourceTypeBinding 
+	{
+		getMemberType <- replace getMemberType;
+		@SuppressWarnings("basecall")
+		callin ReferenceBinding getMemberType(char[] name) {
+			Object save = isLoadingRolesOfSourceType.get();
+			isLoadingRolesOfSourceType.set(new Object());
+			try {
+				return base.getMemberType(name);
+			} catch (IllegalReusedBinaryRoleException ex) {
+				if (DEBUG>0)
+					System.out.println("refused reusing type "+new String(name)); //$NON-NLS-1$
+				return null; // pretend type was not found.
+			} finally {
+				isLoadingRolesOfSourceType.set(save);
+			}
+		}		
+		ReferenceBinding[] getSuperInterfaces() 			  -> get ReferenceBinding[] superInterfaces;
+		void setSuperInterfaces(ReferenceBinding[] superIfcs) -> set ReferenceBinding[] superInterfaces; 
+	}
+	
+	protected class SafeEnvironment playedBy LookupEnvironment {
+		ReferenceBinding askForType(char[][] typeName) 
+			<- replace ReferenceBinding askForType(char[][] typeName);
+		@SuppressWarnings("basecall")
+		callin ReferenceBinding askForType(char[][] typeName) {
+			try {
+				return base.askForType(typeName);
+			} catch (IllegalReusedBinaryRoleException irbre) {
+				if (DEBUG>0) {
+					String rn = new String(CharOperation.concatWith(typeName, '.'));
+					System.out.println("rejected binary role "+rn); //$NON-NLS-1$
+				}
+				return null;
+			}
+		}
+
+		void checkEnclosing(ReferenceBinding created) 
+			<- after BinaryTypeBinding createBinaryTypeFrom(IBinaryType       binaryType, 
+															PackageBinding    packageBinding, 
+															boolean 		  needFieldsAndMethods, 
+															AccessRestriction accessRestriction)
+			with { created <- result }
+		
+		/**
+		 * When reading a binary type as a member of a source type,
+		 * check whether this is OK or whether the binary member
+		 * should be discarded.
+		 */		
+		void checkEnclosing(ReferenceBinding type) {
+			ReferenceBinding enclosing = type.enclosingType();
+			if (enclosing != null && !enclosing.isBinaryBinding() && type.isRole()) {
+				int flags = type.roleModel.getExtraRoleFlags();
+				checkNonReusableRole(flags);
+			}
+		}
+	}
+	
+	
+	protected class BinaryType playedBy BinaryTypeBinding 
+	{	
+		
+		// reverse the effect from SourceTypeBinding in case of nested lookup.
+		getMemberType <- replace getMemberType;
+		callin ReferenceBinding getMemberType(char[] name) {
+			Object save = isLoadingRolesOfSourceType.get();
+			isLoadingRolesOfSourceType.remove();
+			try {
+				return base.getMemberType(name);
+			} finally {
+				isLoadingRolesOfSourceType.set(save);
+			}
+		}		
+		
+		// ==== Callouts: ==== 
+		
+		// DEBUGGING:
+		String internalName() -> char[] internalName() 
+			with { result <- new String(result) }
+	}
+
+	
+	/** Trigger of UseCase A. */
+	static void checkNonReusableRole(int otClassFlags)
+		throws IllegalReusedBinaryRoleException
+	{
+		if ((otClassFlags & IOTConstants.OT_CLASS_ROLE) == 0) 
+			return;
+		int specialRoleFlags = IOTConstants.OT_CLASS_PURELY_COPIED|IOTConstants.OT_CLASS_ROLE_FILE;
+		if ((otClassFlags & specialRoleFlags) == 0)
+		{ 
+			if (DEBUG>0)
+				System.out.println("throwing!!! "+otClassFlags); //$NON-NLS-1$
+			RuntimeException t = new IllegalReusedBinaryRoleException("don't reuse explicit inline role"); //$NON-NLS-1$
+			//t.printStackTrace();
+			throw t;
+		}
+	}
+}