diff --git a/plugins/org.eclipse.objectteams.otredyn/META-INF/MANIFEST.MF b/plugins/org.eclipse.objectteams.otredyn/META-INF/MANIFEST.MF
index 4fcd432..6f240a3 100644
--- a/plugins/org.eclipse.objectteams.otredyn/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.objectteams.otredyn/META-INF/MANIFEST.MF
@@ -5,8 +5,7 @@
 Bundle-Version: 0.8.0.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
-Export-Package: org.objectteams,
- org.eclipse.objectteams.otredyn.bytecode,
+Export-Package: org.eclipse.objectteams.otredyn.bytecode,
  org.eclipse.objectteams.otredyn.bytecode.asm,
  org.eclipse.objectteams.otredyn.runtime,
  org.eclipse.objectteams.otredyn.transformer,
@@ -15,6 +14,7 @@
  org.eclipse.objectteams.otredyn.util
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ClassPath: .
-Require-Bundle: org.objectweb.asm;bundle-version="5.0.1",
+Require-Bundle: org.eclipse.objectteams.runtime;bundle-version="[2.3.0,3.0.0)",
+ org.objectweb.asm;bundle-version="5.0.1",
  org.objectweb.asm.tree;bundle-version="5.0.1",
  org.objectweb.asm.commons;bundle-version="5.0.1"
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/AbstractBoundClass.java b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/AbstractBoundClass.java
index 3c38a7f..9938322 100644
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/AbstractBoundClass.java
+++ b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/AbstractBoundClass.java
@@ -374,7 +374,7 @@
 	/**
 	 * This method parses the bytecode, if that has not already been done 
 	 */
-	protected abstract void parseBytecode();
+	public abstract void parseBytecode();
 	
 	/**
 	 * Returns the internal name of the super class of this class
@@ -1012,6 +1012,8 @@
 
 	public void dump(byte[] classfileBuffer, String postfix) {}
 
+	public Collection<String> getBoundBaseClasses() { return null; }
+
 	public abstract int compare(String callinLabel1, String callinLabel2);
 
 	public void addWiringTask(ISubclassWiringTask wiringTask) {
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmBoundClass.java b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmBoundClass.java
index 3bebdf6..de20cb6 100644
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmBoundClass.java
+++ b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmBoundClass.java
@@ -16,6 +16,9 @@
  **********************************************************************/
 package org.eclipse.objectteams.otredyn.bytecode.asm;
 
+import java.util.Collection;
+import java.util.Set;
+
 import org.eclipse.objectteams.otredyn.bytecode.AbstractBoundClass;
 import org.eclipse.objectteams.otredyn.bytecode.AbstractTeam;
 import org.eclipse.objectteams.otredyn.bytecode.IBytecodeProvider;
@@ -44,6 +47,12 @@
 	 */
 	public String[] precedences;
 
+	/**
+	 * Set of base classes to which the current class or one of its roles as playedBy bindings.
+	 * Qualified class names are '.' separated.
+	 */
+	public Set<String> boundBaseClasses;
+
 	protected AsmBoundClass(String name, String id, IBytecodeProvider bytecodeProvider, ClassLoader loader) {
 		super(name, id, loader);
 		this.bytecodeProvider = bytecodeProvider;
@@ -54,7 +63,7 @@
 	 * of {@link AbstractBoundClass} to set the information
 	 */
 	@Override
-	protected synchronized void parseBytecode() {
+	public synchronized void parseBytecode() {
 		if (parsed) {
 			// Already parsed, nothing to do
 			return;
@@ -78,6 +87,11 @@
 		bytecode = null;
 	}
 	
+	@Override
+	public Collection<String> getBoundBaseClasses() {
+		return this.boundBaseClasses;
+	}
+
 	/**
 	 * Returns the bytecode of this class and cache it temporary.
 	 * This method is only needed, if getBytecode of the {@link IBytecodeProvider}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmClassVisitor.java b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmClassVisitor.java
index 15ac4c6..0d58abf 100644
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmClassVisitor.java
+++ b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/bytecode/asm/AsmClassVisitor.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Dynamic Runtime Environment"
  * 
- * Copyright 2009, 2012 Oliver Frank and others.
+ * Copyright 2009, 2014 Oliver Frank and others.
  * 
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
@@ -16,8 +16,9 @@
  **********************************************************************/
 package org.eclipse.objectteams.otredyn.bytecode.asm;
 
+import java.util.HashSet;
+
 import org.eclipse.objectteams.otredyn.bytecode.Binding;
-import org.eclipse.objectteams.otredyn.bytecode.Types;
 import org.eclipse.objectteams.otredyn.bytecode.asm.Attributes.CallinBindingsAttribute;
 import org.eclipse.objectteams.otredyn.bytecode.asm.Attributes.OTClassFlagsAttribute;
 import org.eclipse.objectteams.otredyn.bytecode.asm.Attributes.CallinBindingsAttribute.MultiBinding;
@@ -89,6 +90,8 @@
 	 */
 	@Override
 	public void visitAttribute(Attribute attribute) {
+		if (clazz.boundBaseClasses == null)
+			clazz.boundBaseClasses = new HashSet<String>();
 		if (attribute.type.equals(Attributes.ATTRIBUTE_OT_DYN_CALLIN_BINDINGS)) {
 			CallinBindingsAttribute attr = (CallinBindingsAttribute) attribute;
 			MultiBinding[] multiBindings = attr.getBindings();
@@ -96,6 +99,7 @@
 				String roleClassName = multiBindings[i].getRoleClassName();
 				String callinLabel = multiBindings[i].getCallinLabel();
 				String baseClassName = multiBindings[i].getBaseClassName();
+				clazz.boundBaseClasses.add(baseClassName.replace('/', '.'));
 				String[] baseMethodNames = multiBindings[i].getBaseMethodNames();
 				String[] baseMethodSignatures = multiBindings[i].getBaseMethodSignatures();
 				String[] declaringBaseClassNames = multiBindings[i].getDeclaringBaseClassName();
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/runtime/TeamManager.java b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/runtime/TeamManager.java
index 8cdfb2d..122fb08 100644
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/runtime/TeamManager.java
+++ b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/runtime/TeamManager.java
@@ -23,6 +23,8 @@
 
 import org.eclipse.objectteams.otredyn.bytecode.AbstractBoundClass;
 import org.objectteams.ITeam;
+import org.objectteams.ITeamManager;
+import org.objectteams.Team;
 
 /**
  * This class administrates the the active teams and their
@@ -34,12 +36,8 @@
  * @author Oliver Frank
  *
  */
-public class TeamManager {
-	
-	public static enum TeamStateChange {
-			REGISTER,
-			UNREGISTER
-		}
+public class TeamManager implements ITeamManager {
+
 	//	void handleTeamStateChange(ITeam t, TeamStateChange stateChange) ;
 	private static List<List<ITeam>> _teams = new ArrayList<List<ITeam>>();
 	private static List<List<Integer>> _callinIds = new ArrayList<List<Integer>>();
@@ -53,6 +51,7 @@
 
 	public static void setup(IClassRepository repo) {
 		classRepository = repo;
+		Team.registerTeamManager(new TeamManager()); // install callback
 	}
 
 	/**
@@ -160,7 +159,7 @@
 	 * @param t
 	 * @param stateChange
 	 */
-	public static void handleTeamStateChange(ITeam t, TeamManager.TeamStateChange stateChange) {
+	public void handleTeamStateChange(ITeam t, ITeamManager.TeamStateChange stateChange) {
 		IClassIdentifierProvider provider = ClassIdentifierProviderFactory.getClassIdentifierProvider();
 		Class<? extends ITeam> teamClass = t.getClass();
 		String teamId = provider.getClassIdentifier(teamClass);
@@ -184,12 +183,37 @@
 						for (Integer subJoinpoint : subJoinpoints)
 							changeTeamsForJoinpoint(t, binding.getPerTeamId(), subJoinpoint, stateChange);
 				}
-				boundClass.handleAddingOfBinding(binding); // TODO(SH): more lazy
+				boundClass.handleAddingOfBinding(binding); // TODO: do we want/need to group all bindings into one action?
 				break;
 			}
-			
 		}
 	}
+	
+	/**
+	 * When a team is about to be activated propagate its bindings to all base classes,
+	 * but don't yet register any join points, we aren't activating yet. 
+	 */
+	public static void prepareTeamActivation(Class<? extends ITeam> teamClass) {
+		String teamName = teamClass.getName();
+		ClassLoader teamClassLoader = teamClass.getClassLoader();
+		IClassIdentifierProvider provider = ClassIdentifierProviderFactory.getClassIdentifierProvider();
+		String teamId = provider.getClassIdentifier(teamClass);
+		IBoundTeam teem = classRepository.getTeam(teamName, teamId, teamClassLoader);
+
+		for (IBinding binding : teem.getBindings()) {
+			String boundClassName = binding.getBoundClass();
+			String boundClassIdentifier = provider.getBoundClassIdentifier(teamClass, boundClassName);
+			// FIXME(SH): the following may need adaptation for OT/Equinox or other multi-classloader settings:
+			IBoundClass boundClass = classRepository.getBoundClass(boundClassName.replace('/', '.'), boundClassIdentifier, teamClass.getClassLoader());
+			// FIXME(SH): if boundClass is a role we need to find tsub roles, too!
+			switch (binding.getType()) {
+			case CALLIN_BINDING:
+				boundClass.handleAddingOfBinding(binding);
+				break;
+			}
+		}		
+	}
+
 	public static void handleTeamLoaded(Class<? extends ITeam> teamClass) {
 		if (teamClass != null)
 			handleDecapsulation(teamClass);
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/transformer/jplis/ObjectTeamsTransformer.java b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/transformer/jplis/ObjectTeamsTransformer.java
index f091510..9fd100e 100644
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/transformer/jplis/ObjectTeamsTransformer.java
+++ b/plugins/org.eclipse.objectteams.otredyn/src/org/eclipse/objectteams/otredyn/transformer/jplis/ObjectTeamsTransformer.java
@@ -15,8 +15,13 @@
  **********************************************************************/
 package org.eclipse.objectteams.otredyn.transformer.jplis;
 
+import java.io.IOException;
+import java.io.InputStream;
 import java.lang.instrument.ClassFileTransformer;
 import java.security.ProtectionDomain;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.eclipse.objectteams.otredyn.bytecode.AbstractBoundClass;
 import org.eclipse.objectteams.otredyn.bytecode.ClassRepository;
@@ -26,16 +31,16 @@
  * This class does all needed transformations at load time.
  * @author  Christine Hundt
  */
-
 public class ObjectTeamsTransformer implements ClassFileTransformer {
+
+	private Set<String> boundBaseClassNames = new HashSet<String>();
+
 	/* (non-Javadoc)
 	 * @see java.lang.instrument.ClassFileTransformer#transform(java.lang.ClassLoader, java.lang.String, java.lang.Class, java.security.ProtectionDomain, byte[])
 	 */
-
 	public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined,
-            ProtectionDomain protectionDomain, byte[] classfileBuffer) {
-			
-			
+            ProtectionDomain protectionDomain, byte[] classfileBuffer)
+	{
 		return transform(loader, className, className, classBeingRedefined, classfileBuffer);
 	}
 	
@@ -66,6 +71,8 @@
 			t.printStackTrace();
 		}
 		
+		this.boundBaseClassNames.addAll(clazz.getBoundBaseClasses());
+
 		return classfileBuffer;
 	}
 
@@ -105,4 +112,39 @@
 		}
 		return true;
 	}
+	
+	/** Parse the bytecode of the given class, so we are able to answer {@link #fetchAdaptedBases()} afterwards. */
+	public void readOTAttributes(String className, String classId, InputStream inputStream, ClassLoader loader) throws ClassFormatError, IOException {		
+		AbstractBoundClass clazz = ClassRepository.getInstance().getBoundClass(
+				className.replace('/','.'), classId, loader);
+		if (!clazz.isFirstTransformation()) {
+			return; // FIXME: re-loading existing class?? Investigate classloader, check classId strategy etc.pp.
+		}
+		try {
+			if (clazz.isTransformationActive()) {
+				return;
+			}
+			int available = inputStream.available();
+			byte[] bytes = new byte[available];
+			inputStream.read(bytes);
+			clazz = ClassRepository.getInstance().getBoundClass(
+					className, classId, bytes, loader);
+			if (!clazz.isInterface())
+				ClassRepository.getInstance().linkClassWithSuperclass(clazz);
+			if (!clazz.isInterface() || clazz.isRole())
+				clazz.parseBytecode();
+		} catch(Throwable t) {
+			t.printStackTrace();
+		}
+		
+		this.boundBaseClassNames.addAll(clazz.getBoundBaseClasses());
+	}
+	
+	/**
+	 * After {@link #transform(ClassLoader, String, Class, ProtectionDomain, byte[])} or {@link #readOTAttributes(String, String, InputStream, ClassLoader)}
+	 * this method will answer the qualified names (dot-separated) of all base classes adapated by the current team and its roles.
+	 */
+	public Collection<String> fetchAdaptedBases() {
+		return this.boundBaseClassNames;
+	}
 }
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/DoublyWeakHashMap.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/DoublyWeakHashMap.java
deleted file mode 100644
index faa3da8..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/DoublyWeakHashMap.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/**********************************************************************
- * This file is part of the "Object Teams Runtime Environment"
- *
- * Copyright 2010 Stephan Herrmann.
- *
- * 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
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- * 		Stephan Herrmann - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Set;
-import java.util.WeakHashMap;
-
-/**
- * This class defines hash maps where both key and value are weak references.
- * It is implemented by delegating to a WeakHashMap and additionally
- * wrapping the value in a WeakReference.
- *
- * @author stephan
- * @since 0.7.0
- * @param <K> type of keys: a base class
- * @param <V> type of values: a role class
- */
-public class DoublyWeakHashMap<K,V> implements Map<K,V> {
-
-	private WeakHashMap<K, WeakReference<V>> map;
-
-	public DoublyWeakHashMap() {
-		this.map = new WeakHashMap<K, WeakReference<V>>();
-	}
-
-	public int size() {
-		return this.map.size();
-	}
-
-	public boolean isEmpty() {
-		return this.map.isEmpty();
-	}
-
-	// used from hasRole() and lifting (duplicate role check)
-	public boolean containsKey(Object key) {
-		return this.map.containsKey(key);
-	}
-
-	public boolean containsValue(Object value) {
-		throw new UnsupportedFeatureException("Method containsValue is not implemented for internal class DoublyWeakHashMap.");
-	}
-
-	// used from getRole()
-	public V get(Object key) {
-		WeakReference<V> valRef = this.map.get(key);
-		return valRef == null ? null : valRef.get();
-	}
-
-	// used from migrateToBase() and lifting constructor
-	public synchronized V put(K key, V value) {
-		this.map.put(key, new WeakReference<V>(value));
-		return value;
-	}
-
-	// used from unregisterRole(), migrateToBase()
-	public synchronized V remove(Object key) {
-		WeakReference<V> value = this.map.remove(key);
-		return (value == null) ? null : value.get();
-	}
-
-	public void putAll(Map<? extends K, ? extends V> t) {
-		for (Entry<? extends K, ? extends V> entry : t.entrySet())
-			this.map.put(entry.getKey(), new WeakReference<V>(entry.getValue()));
-	}
-
-	public void clear() {
-		this.map.clear();
-	}
-
-	public Set<K> keySet() {
-		return this.map.keySet();
-	}
-
-	// used from getAllRoles() et al.
-	public synchronized Collection<V> values() {
-		ArrayList<V> result = new ArrayList<V>(this.map.size());
-		for (WeakReference<V> valRef : this.map.values()) {
-			V value = valRef.get();
-			if (value != null)
-				result.add(value);
-		}
-		return result;
-	}
-
-	public Set<java.util.Map.Entry<K, V>> entrySet() {
-		throw new UnsupportedFeatureException("Method entrySet is not implemented for internal class DoublyWeakHashMap.");
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/DuplicateRoleException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/DuplicateRoleException.java
deleted file mode 100644
index 9d5c069..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/DuplicateRoleException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2004, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * Signal a violation of OTJLD 2.4.1(c).
- * Also Team.getRole(Object) may throw a DuplicateRoleException if
- * more than one role is found for the given base object
- * (in that case those roles are found in different role-caches).
- *
- *
- * @author stephan
- */
-public class DuplicateRoleException extends RuntimeException {
-
-	/**
-	 *
-	 */
-	private static final long serialVersionUID = 1L;
-
-	/**
-	 * @param message
-	 */
-	public DuplicateRoleException(String roleClassName) {
-		super("Failed to create a role instance of type "+roleClassName+"\n"+
-			  "A role for the given base object already exists (OTJLD 2.4.1(c)).");
-	}
-
-	public DuplicateRoleException(String roleName1, String roleName2) {
-		super("Ambiguous role instances: found a role in hierarchies "+
-				roleName1+" and "+roleName2);
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IBaseMigratable.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IBaseMigratable.java
deleted file mode 100644
index fa49611..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IBaseMigratable.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2008, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * Marker interface: if a role declares to implement this interface
- * the compiler will generate the method defined herein, and prepare
- * the role so that the migration will indeed be possible.
- *
- * @author stephan
- * @since 1.2.5
- */
-public interface IBaseMigratable {
-	/**
-	 * Migrate the current role to the otherBase.
-	 *
-	 * @param otherBase new base that this role should adapt, must
-	 *        be of a valid base type for the current role.
-	 */
-	<B> void migrateToBase(B otherBase);
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IBoundBase.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IBoundBase.java
deleted file mode 100644
index afc892a..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IBoundBase.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2007, 2012 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- * 		Oliver Frank - Initial API and Implementation
- **********************************************************************/
-package org.objectteams;
-
-/** Super type for all bound base classes. Purely internal class, not intended for client use. */
-public interface IBoundBase {
-
-	/**
-	 * Call a bound base method identified by its ID.
-	 * @param boundMethod_id globally unique ID of a bound base method
-	 * @param args           packed arguments (incl. boxing)
-	 * @return               (possibly boxed) result of the bound base method.
-	 */
-	Object _OT$callOrig(int boundMethod_id, Object[] args);
-
-	/**
-	 * Provides access to fields and methods of a base class
-	 * that have package, protected or private visbility
-	 * @param accessId Unique identifier in the class for the field or method
-	 * @param opKind 0 for read access, 1 for write access. only used for fields
-	 * @param args arguments for a method
-	 * @return
-	 */
-	Object _OT$access(int accessId, int opKind, Object[] args, Team caller);
-
-	/** Method to be used by generated code, only (lifting constructor & unregisterRole()). */
-	void _OT$addOrRemoveRole(Object aRole, boolean adding);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IConfined.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IConfined.java
deleted file mode 100644
index ca13bbc..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IConfined.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2004, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * Special interface that does not extend Object
- *
- * @author stephan
- */
-public interface IConfined {}
\ No newline at end of file
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ILiftingParticipant.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ILiftingParticipant.java
deleted file mode 100644
index 725cd19..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ILiftingParticipant.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**********************************************************************
- * This file is part of the "Object Teams Runtime Environment"
- *
- * Copyright 2009 Stephan Herrmann
- *
- * 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
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- * 	Stephan Herrmann - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * A lifting participant hooks into the lifting process.
- *
- * @author stephan
- * @since 1.3.1
- */
-public interface ILiftingParticipant {
-	/**
-	 * This method is called when lifting does not find a suitable role within the
-	 * team's internal role cache. If this method returns a non-null value,
-	 * this value is considered by the runtime as being the desired role
-	 * (i.e., it must be castable to that role type), and no new role is created.
-	 * If this method returns null, lifting proceeds as normal, i.e.,
-	 * a fresh role is created using the default lifting constructor.
-	 *
-	 * @param teamInstance
-	 * @param baseInstance
-	 * @param roleClassName
-	 * @return either null or an instance of the class specified by roleClassName
-	 */
-	Object createRole(ITeam teamInstance, Object baseInstance, String roleClassName);
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ITeam.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ITeam.java
deleted file mode 100644
index ba6083c..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ITeam.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/**********************************************************************
- * This file is part of the "Object Teams Runtime Environment"
- *
- * Copyright 2010, 2012 Stephan Herrmann.
- *
- * 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
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- * 		Stephan Herrmann - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * Public interface of all team classes.
- */
-public interface ITeam {
-
-    /**
-     *  Interface for all role classes that should allow explicit lowering.
-     *  The interface provides a phantom method <pre>&lt;B&gt; B lower()</pre>
-     *  where B is the bound base class of the implementing role class.
-     *  There is no need to implement the method lower, since this is done by the compiler.
-     */
-    public interface ILowerable {
-		// internal method needed for cast and instanceof
-    	ITeam _OT$getTeam();
-    }
-
-	/**
-	 *  This role interface has no properties not even those of java.lang.Object.
-	 */
-	public interface IConfined extends org.objectteams.IConfined {
-		// internal method needed for cast and instanceof
-		ITeam _OT$getTeam();
-	}
-
-
-	/**
-	 * Activates the team and therefore all of its callin bindings.
-	 * This activation applies to the current thread only.
-	 */
-	public abstract void activate();
-
-	/**
-	 * Deactivates the team and therefore all of its callin bindings.
-	 * This deactivation applies to the current thread only.
-	 */
-	public abstract void deactivate();
-
-	/**
-	 * Activates the team and therefore all of its callin bindings for passed thread.
-	 * If the constant 'Team.ALL_THREADS' is passed, this activation globally applies to all threads.
-	 */
-	public abstract void activate(Thread thread);
-
-	/**
-	 * Deactivates the team and therefore all of its callin bindings for passed thread.
-	 * If the constant 'Team.ALL_THREADS' is passed, this deactivation globally applies to all threads.
-	 */
-	public abstract void deactivate(Thread thread);
-
-	/**
-	 * Checks, if the team instance is active for the current thread.
-	 * @return true, if the team is active, false else.
-	 */
-	public abstract boolean isActive();
-
-	/**
-	 * Checks, if the team instance is active for the 'thread'.
-	 * @param thread	The thread for which to check activity.
-	 * @return	true, if the team is active for 'thread', false else.
-	 */
-	public abstract boolean isActive(Thread thread);
-
-	/** NOT API */
-	public void _OT$implicitlyActivate();
-	/** NOT API */
-	public void _OT$implicitlyDeactivate();
-
-	/**
-	 * Does given base object have a role in this team?
-	 * This method will consider roles of any type.
-	 *
-	 * @param aBase any object, i.e., no checks are performed whether the base object's
-	 * 		class is bound by any role class in this team.
-	 * @return
-	 */
-	public abstract boolean hasRole(Object aBase);
-
-	/**
-	 * Does given base object have a role in this team?
-	 * The role must be an instance of the specified role type.
-	 *
-	 * @param aBase any object, i.e., no checks are performed whether the base object's
-	 * 		class is bound by any role class in this team.
-	 * @param roleType Class instance specifying the required role type.
-	 *      TODO (SH): is it legal to pass an unbound role class?
-	 * @throws IllegalArgumentException if <code>roleType</code> does not represent a member type of this team.
-	 * @return
-	 */
-	public abstract boolean hasRole(Object aBase, Class<?> roleType) throws IllegalArgumentException;
-
-	/**
-	 * Retrieve a role for a given base object.
-	 * If more than one role exists, a DuplicateRoleException is thrown.
-	 *
-	 * @param aBase
-	 * @return
-	 */
-	public abstract Object getRole(Object aBase);
-
-	/**
-	 * Retrieve a role for a given base object.
-	 * The role must be an instance of the specified role type.
-	 *
-	 * @param aBase any object, i.e., no checks are performed whether the base object's
-	 * 		class is bound by any role class in this team.
-	 * @param roleType Class instance specifying the required role type.
-	 * @return
-	 * @throws IllegalArgumentException if <code>roleType</code> does not represent a member type of this team.
-	 */
-	public abstract <T> T getRole(Object aBase, Class<T> roleType) throws IllegalArgumentException;
-
-	/**
-	 * Retrieve all bound roles registered in the current team.
-	 *
-	 * This method uses internal structures of weak references.
-	 * For that reason it may return role instances which were about to be reclaimed
-	 * by the garbage collector.
-	 * If performance permits, it is thus advisable to always call System.gc()
-	 * prior to calling getAllRoles() in order to achieve deterministic results
-	 *
-	 * @return a non-null array.
-	 */
-	public abstract Object[] getAllRoles();
-
-	/**
-	 * Retrieve all bound roles registered in the current team that
-	 * are instance of roleType or a subtype thereof.
-	 *
-	 * This method uses internal structures of weak references.
-	 * For that reason it may return role instances which were about to be reclaimed
-	 * by the garbage collector.
-	 * If performance permits, it is thus advisable to always call System.gc()
-	 * prior to calling getAllRoles() in order to achieve deterministic results
-	 *
-	 * @param roleType must be a top-most bound role of this team.
-	 * @return a non-null array.
-	 * @throws IllegalArgumentException if <code>roleType</code> does not represent a member type of this team.
-	 */
-	public abstract <T> T[] getAllRoles(Class<T> roleType) throws IllegalArgumentException;
-
-	/**
-	 * Query whether any role instance of this team instance is currently executing a
-	 * method due to a callin binding.
-	 * @return
-	 */
-	public abstract boolean isExecutingCallin();
-
-	/**
-	 * Remove a role from the internal registry, which means that the role will no longer be
-	 * considered during lifting.
-	 *
-	 * @param aRole
-	 */
-	public abstract void unregisterRole(Object aRole);
-
-	/**
-	 * Remove a role from the internal registry, which means that the role will no longer be
-	 * considered during lifting.
-	 *
-	 * @param aRole
-	 * @param roleType
-	 * @throws IllegalArgumentException if <code>roleType</code> does not represent a member type of this team.
-	 */
-	public abstract void unregisterRole(Object aRole, Class<?> roleType) throws IllegalArgumentException;
-
-	/**
-	 * Not API.
-	 * This method saves the activation state of the team  for the current thread.
-	 * If active, it also saves, if the activation was explicit or implicit.
-	 * This method has to be called by the generated code when entering a within block,
-	 * before the activation.
-	 */
-	public int _OT$saveActivationState();
-
-	/**
-	 * Not API.
-	 * This method restores the former saved activation state of the team  for the current thread.
-	 * If active, it also restores, if the activation was explicit or implicit.
-	 * This method has to be called by the generated code when leaving a within block
-	 * (in the finally block).
-	 */
-	public void _OT$restoreActivationState(int old_state);
-
-	/**
-	 * Not API, for use by TeamThreadManager, only.
-	 */
-	public boolean internalIsActiveSpecificallyFor(Thread t);
-
-	/**
-	 * Not API, for use by TeamThreadManager, only.
-	 */
-	public void deactivateForEndedThread(Thread thread);
-
-	/** NOT API */
-	public Object _OT$callAllBindings(IBoundBase baze, ITeam[] teams,int idx,int[] callinIds, int boundMethodId, Object[] args);
-
-	/** NOT API */
-	public Object _OT$callOrigStatic(int callinId, int boundMethodId, Object[] args);
-
-	/** NOT API */
-	public Object _OT$callNext(IBoundBase baze, ITeam[] teams, int idx, int[] callinIds, int boundMethodId, Object[] args, Object[] baseCallArgs);
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ITeamMigratable.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ITeamMigratable.java
deleted file mode 100644
index e14750e..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ITeamMigratable.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2008, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * Marker interface: if a role declares to implement this interface
- * the compiler will generate the method defined herein, and prepare
- * the role so that the migration will indeed be possible.
- * Note, that a migratable role does not obey the family guarantee.
- *
- * @author stephan
- * @since 1.2.5
- */
-public interface ITeamMigratable {
-	/**
-	 * Migrate the current role to the otherTeam.
-	 *
-	 * @param otherTeam new team that should adopt this role
-	 * @return the migrated (and re-typed) role (actually of type R<@otherTeam>).  FIXME(SH)
-	 */
-	<R> R migrateToTeam(final ITeam otherTeam);
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IllegalRoleCreationException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IllegalRoleCreationException.java
deleted file mode 100644
index 0842268..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/IllegalRoleCreationException.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2007, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * Exception to be thrown when a bound role is being instantiated but
- * the constructor does not assign a base object.
- *
- * @author stephan
- */
-@SuppressWarnings("serial")
-public class IllegalRoleCreationException extends RuntimeException {
-	public IllegalRoleCreationException() {
-		super();
-	}
-
-	@Override
-	public String getMessage() {
-		return "Cannot instantiate a bound role using a default constructor of its tsuper class";
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ImplicitTeamActivation.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ImplicitTeamActivation.java
deleted file mode 100644
index 0415e4d..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ImplicitTeamActivation.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/**********************************************************************
- * This file is part of the "Object Teams Runtime Environment"
- *
- * Copyright 2009 Stephan Herrmann
- *
- * 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
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- * 			Stephan Herrmann - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This marker annotation enables implicit team activation for the annotated element:
- * <ul>
- * <li>If attached to a method the effect is that each call to this method implicitly
- *     activates the enclosing team.</li>
- * <li>If attached to a class it has the same effect as annotating all contained methods.</li>
- * </ul>
- * See <a href="http://www.objectteams.org/def/1.3/s5.html#s5.3">OTJLD § 5.3</a>.
- * <p>
- * This annotation is only evaluated if the property <code>ot.implicit.team.activation</code>
- * is set to the string <code>ANNOTATED</code>.
- * </p>
- * @author stephan
- * @since 1.4.0
- */
-@Documented
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface ImplicitTeamActivation {
-	/* no members, pure marker annotation. */
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/Instantiation.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/Instantiation.java
deleted file mode 100644
index 4392adc..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/Instantiation.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Development Tooling"-Software
- *
- * Copyright 2011 GK Software AG
- *
- * 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
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- * 	  Stephan Herrmann - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * This annotation influences the semantics of lifting in OT/J.
- * See {@link InstantiationPolicy} for possible values and their effects.
- * This annotation is valid only when applied to a role type.
- *
- * @author stephan
- */
-@Documented
-@Retention(RetentionPolicy.CLASS)
-@Target(ElementType.TYPE)
-public @interface Instantiation {
-	InstantiationPolicy value();
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/InstantiationPolicy.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/InstantiationPolicy.java
deleted file mode 100644
index 9cc189e..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/InstantiationPolicy.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Development Tooling"-Software
- *
- * Copyright 2011 GK Software AG
- *
- * 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
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- * 	  Stephan Herrmann - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * Possible values for the {@link Instantiation} annotation for role types:
- * {@link #NEVER}, {@link #ONDEMAND} (default), {@link #SINGLETON} and {@link #ALWAYS}.
- *
- * @author stephan
- */
-public enum InstantiationPolicy {
-	/**
-	 * Roles with the instantiation policy NEVER are not instantiated by lifting.
-	 * Such roles cannot have state.
-	 * The compiler still has to ensure that access to base instances still behaves
-	 * as if a role instance would exist.
-	 * Note: this is not yet supported by the OT/J compiler.
-	 */
-	NEVER,
-	/**
-	 * The constant ONDEMAND corresponds to the default behavior in OT/J
-	 * where lifting will create a role for a given base instance upon first access,
-	 * i.e., if no matching role is found in the team's internal cache.
-	 * Otherwise the existing role from the cache is re-used.
-	 */
-	ONDEMAND,
-	/**
-	 * For a role with instantiation policy SINGLETON at most one instance per team
-	 * will be created by lifting. Subsequent lifting operations will always return
-	 * the same role instance.
-	 * The compiler still has to ensure that access to base instances still behaves
-	 * as if a role instance would exist.
-	 * Note: this is not yet supported by the OT/J compiler.
-	 */
-	SINGLETON,
-	/**
-	 * The instantiation policy ALWAYS advises the compiler to omit generating an
-	 * internal cache for the given role type. Instead of first consulting the
-	 * cache (as it is done in the default ONDEMAND policy) each lifting operation
-	 * creates a new role instance.
-	 */
-	ALWAYS;
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/LiftingFailedException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/LiftingFailedException.java
deleted file mode 100644
index cc77105..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/LiftingFailedException.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2003, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * This exception signals that lifting failed due to unresolved
- * binding ambiguity.
- */
-public class LiftingFailedException extends Exception {
-	/**
-	 *
-	 */
-	private static final long serialVersionUID = 1L;
-	private Object base;
-	private String roleType;
-
-	/**
-	 * @param base the object that should be lifted
-	 * @param roleType the name of the role type for which
-	 *                 lifting was attempted.
-	 */
-	public LiftingFailedException(Object base, String roleType) {
-		this.base = base;
-		this.roleType = roleType;
-	}
-
-	@Override
-	public String getMessage() {
-		return "\nFailed to lift '" + base + "' of " + base.getClass()
-				+ " to type '" + roleType
-				+ "'\n(See OT/J definition para. 2.3.4(c)).";
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/LiftingVetoException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/LiftingVetoException.java
deleted file mode 100644
index 2d1315d..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/LiftingVetoException.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2003, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- *  This exception is used by the language implementation
- *  to signal a failed lifting due to a guard predicate that evaluated to false.
- *  @author Stephan Herrmann
- */
-public class LiftingVetoException extends RuntimeException {
-	/**
-	 *
-	 */
-	private static final long serialVersionUID = 1L;
-	ITeam aTeam = null;
-	Object base = null;
-
-	public LiftingVetoException(ITeam aTeam, Object base) {
-		this.aTeam = aTeam;
-		this.base = base;
-	}
-
-    public LiftingVetoException() {
-		super("");
-    }
-
-	@Override
-	public String toString() {
-		return "Team " + aTeam + " refuses to lift " + base
-				+ "\n(this exception should not be seen in applications).";
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/NoSuchMethodError.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/NoSuchMethodError.java
deleted file mode 100644
index fbc2800..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/NoSuchMethodError.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2011 GK Software AG.
- *
- * 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
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Stephan Herrmann - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * This error is thrown when some generated code falls through a switch
- * without finding a requested target method.
- *
- * @author stephan
- */
-public class NoSuchMethodError extends java.lang.NoSuchMethodError {
-	private static final long serialVersionUID = 8166812526610195056L;
-
-	public NoSuchMethodError(int accessId, String className, String accessReason) {
-		super("Method with internal id "+accessId+" cannot be found in "+className+" for "+accessReason);
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ResultNotProvidedException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ResultNotProvidedException.java
deleted file mode 100644
index b36870d..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/ResultNotProvidedException.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2004, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * @author resix
- */
-public class ResultNotProvidedException extends RuntimeException {
-
-		/**
-	 *
-	 */
-	private static final long serialVersionUID = 1L;
-		private static final String _bugmsg =
-		"\nNo base call executed! Result value was uninitialized!\n(see OT/J language definition para. 4.3(e)).";
-
-		/**
-		 *
-		 */
-		public ResultNotProvidedException() {
-			super(_bugmsg);
-		}
-
-		/**
-		 * @param message
-		 */
-		public ResultNotProvidedException(String message) {
-			super(_bugmsg + "\n" + message);
-			StackTraceElement[] ste = new StackTraceElement[0];
-			setStackTrace(ste);
-		}
-
-		/**
-		 * @param cause
-		 */
-		public ResultNotProvidedException(Throwable cause) {
-			super(_bugmsg + cause.toString());
-		}
-
-		/**
-		 * @param message
-		 * @param cause
-		 */
-		public ResultNotProvidedException(String message, Throwable cause) {
-			super(_bugmsg + message/* +cause.toString() */);
-		}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/RoleCastException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/RoleCastException.java
deleted file mode 100644
index da03385..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/RoleCastException.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2004, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * This exception is thrown if a cast to a role class fails due to
- * different enclosing team instances.
- * @author Stephan Herrmann
- */
-public class RoleCastException extends ClassCastException {
-
-	/**
-	 *
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final String MSG =
-		"Different enclosing team instances (see OT/J language definition para. 1.2.4(b)).";
-
-	/* (non-Javadoc)
-	 * @see java.lang.Throwable#getMessage()
-	 */
-	@Override
-	public String getMessage() {
-		return MSG;
-	}
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/SneakyException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/SneakyException.java
deleted file mode 100644
index 28fad1a..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/SneakyException.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**********************************************************************
- * This file is part of the "Object Teams Runtime Environment"
- *
- * Copyright 2012 GK Software AG
- *
- * 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
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- * 		Stephan Herrmann - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-import java.io.PrintStream;
-
-/**
- * Exception class used for tunneling checked exception through generic dispatch
- * code without matching throws declaration.
- * 
- * An original exception raised in a role method is wrapped during any of 
- * <code>_OT$callReplace</code>, <code>_OT$callBefore</code> and <code>_OT$callAfter</code>
- * and unwrapped in the initial wrapper of any base method.
- * 
- * Note that the opposite direction needs no wrapping: exceptions raised in
- * the base method are thrown as normal, because this happens inside _OT$callOrig
- * of the base class, which is created dynamically by OTREDyn and never checked
- * by any compiler.
- */
-@SuppressWarnings("serial")
-public class SneakyException extends RuntimeException {
-	private Exception cause;
-
-	/** Wrap a given exception in an unchecked SneakyException. */
-	public SneakyException(Exception cause) {
-		this.cause = cause;
-	}
-
-	/** Re-throw the nested exception but hide it from the compiler. */
-	public void rethrow() {
-		SneakyException.<RuntimeException>sneakyThrow0(this.cause);
-	}
-
-	@SuppressWarnings("unchecked")
-    private static <T extends Exception> void sneakyThrow0(Exception t) throws T {
-	    throw (T)t;
-    }
-	
-	@Override
-	public String getMessage() {
-		return this.cause.getMessage();
-	}
-	
-	@Override
-	public void printStackTrace(PrintStream s) {
-		this.cause.printStackTrace(s);
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/SoftLiftingFailedException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/SoftLiftingFailedException.java
deleted file mode 100644
index 0458cc7..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/SoftLiftingFailedException.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**********************************************************************
- * This file is part of the "Object Teams Runtime Environment"
- *
- * Copyright 2011 GK Software AG
- *
- * 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
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- * 		Stephan Herrmann - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * This exception signals that lifting failed due to unresolved
- * binding ambiguity. This variant is used when static analysis
- * could not find reason for such failure just in case the class
- * files have changed since.
- */
-public class SoftLiftingFailedException extends RuntimeException {
-	/**
-	 *
-	 */
-	private static final long serialVersionUID = 1L;
-	private Object base;
-	private String roleType;
-
-	/**
-	 * @param base the object that should be lifted
-	 * @param roleType the name of the role type for which
-	 *                 lifting was attempted.
-	 */
-	public SoftLiftingFailedException(Object base, String roleType) {
-		this.base = base;
-		this.roleType = roleType;
-	}
-
-	@Override
-	public String getMessage() {
-		return "\nFailed to lift '" + base + "' of " + base.getClass()
-				+ " to type '" + roleType
-				+ "'\nPerhaps some class files have changed since the enclosing team has been compiler? (See OT/J definition para. 2.3.4(c)).";
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/Team.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/Team.java
deleted file mode 100644
index b59aaea..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/Team.java
+++ /dev/null
@@ -1,655 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2002, 2012 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- * 		Oliver Frank - Initial API and Implementation
- **********************************************************************/
-package org.objectteams;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.WeakHashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.objectteams.otredyn.runtime.TeamManager;
-
-
-/**
- *  This is the root class of all team definitions.
- *  Any class with the <tt>team</tt> modifier implicitly
- *  inherits from this class.
- *
- */
-public /* team */ class Team implements ITeam {
-	// Technical note: comments starting with //$Debug are intended
-	// for a standalone tool that generates an interface
-	// which the debugger needs in order to know about line numbers in this class.
-
-	/*
-	 *  Synchronization: This class supports two levels of synchronization:
-	 *  <ul>
-	 *  <li>Fields of <code>Team</code> are synchronized
-	 *      using <code>this</code> as the monitor.
-	 *  <li>Those calls that (un)register a team at its base classes are synchronized
-	 *      via <code>registrationLock</code>
-	 *  </ul>
-	 *  This allows releasing the lock on <code>this</code> before calling to the base class.
-	 *  Note, that the synchronized portion of each initial-wrapper is also synchronized
-	 *  (against <code>_OT$addTeam/_OT$removeTeam</code>) and that it calls back to
-	 *  the registered teams (method <code>isActive()</code>).
-	 *  Without <code>registrationLock</code> this situation could easily deadlock:
-	 *  Thread1: <pre>t.activate() -> Base._OT$addTeam()</pre>: owns t, waits for Base.
-	 *  Thread2: <pre>b.bm() (initial wrapper) -> t.isActive()</pre>: owns Base, waits for t.
-	 */
-
-	/**
-	 * Internal field used by the runtime to install a lifting participant if one is configured.
-	 */
-	public static ILiftingParticipant _OT$liftingParticipant = null;
-
-	/**
-	 * Default constructor for debugging purpose.
-	 */
-	public Team() {} //$Debug(TeamConstructor)
-
-	/*
-	 * manual copy-inheritance of a role interface from ITeam.
-	 */
-	public interface ILowerable extends ITeam.ILowerable {}
-
-	/*
-	 * manual copy-inheritance of a role interface from ITeam.
-	 */
-	public interface IConfined extends ITeam.IConfined {}
-
-	/**
-	 *  Special role type that<ul>
-	 * <li> does not extend java.lang.Object
-	 * <li> may not leak references outside the team.
-	 * </ul>
-	 */
-	protected interface Confined {
-		/* internal method needed for cast and instanceof
-		 * (this method will be generated for role classes) */
-		ITeam _OT$getTeam();
-	}
-
-    /**
-     * This class would have been generated by the OT-compiler.
-     * Don't explicitly use it in client code!
-     */
-    protected class __OT__Confined implements Confined {
-		// internal method needed for cast and instanceof
-    	public ITeam _OT$getTeam() {
-    		return Team.this; //$Debug(ConfinedGetTeam)
-    	}
-    }
-
-	/**
-	 *  Internal function for identifying a Team.
-	 *  Should not be called by client code.
-	 */
-	public int _OT$getID () {return -1;}
-
-    /**
-	 * The constant <code>ALL_THREADS</code> is used for global team (de-)activation.
-	 */
-	public static final Thread ALL_THREADS = new Thread();
-
-	private static final int _OT$UNREGISTERED = 0;
-	private static final int _OT$REGISTERED = 1;
-	private  int _OT$registrationState = _OT$UNREGISTERED;
-
-	private boolean _OT$globalActive = false;
-
-	private ThreadLocal<Integer> _OT$implicitActivationsPerThread = new ThreadLocal<Integer>() {
-		@Override
-		protected synchronized Integer initialValue() {
-			return Integer.valueOf(0);
-		}
-	};
-
-	private boolean _OT$lazyGlobalActiveFlag = false;
-
-	/**
-	 * <code>_OT$activatedThreads</code> contains all threads for which this team instance is active.
-	 * key		= activated thread
-	 * value 	= Boolean(true) for explicit activation | Boolean(false) for implicit activation.
-	 */
-	private WeakHashMap<Thread, Boolean> _OT$activatedThreads = new WeakHashMap<Thread, Boolean>();
-
-	/** This lock is used to protect activate/deactivate methods <strong>including</strong>
-	 *  the calls to doRegistration/doUnregistration.
-	 */
-	private Object _OT$registrationLock= new Object();
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void activate() {
-		activate(Thread.currentThread());
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void deactivate() {
-		deactivate(Thread.currentThread());
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void activate(Thread thread) {
-		// acquire both locks to avoid incomplete execution:
-		synchronized (this._OT$registrationLock) {
-			synchronized (this) {
-				if (thread.equals(ALL_THREADS)) {
-					_OT$globalActive = true;
-					_OT$lazyGlobalActiveFlag = true;
-					TeamThreadManager.addGlobalActiveTeam(this);
-				} else { // activation only for 'thread':
-					// register 'thread' as active:
-					_OT$activatedThreads.put(thread, Boolean.TRUE);
-				}
-			} // release this before calling synchronized base class methods
-			doRegistration(); //$Debug(ActivateMethod)
-		}
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void deactivate(Thread thread) {
-		// acquire both locks to avoid incomplete execution:
-		synchronized (this._OT$registrationLock) {
-			boolean shouldUnregister= false;
-			synchronized(this) {
-				if (thread.equals(ALL_THREADS)) {
-					_OT$globalActive = false;
-					TeamThreadManager.removeGlobalActiveTeam(this);
-					// unregister all threads:
-					_OT$activatedThreads.clear();
-					shouldUnregister= true;
-				} else { // deactivation only for 'thread':
-					if (_OT$lazyGlobalActiveFlag) {
-						// be eager now: activate for all (other) threads:
-						_OT$activateForAllThreads();
-					}
-					// deactivate for 'thread', no longer active:
-					_OT$activatedThreads.remove(thread);
-					if (!_OT$lazyGlobalActiveFlag  && _OT$activatedThreads.isEmpty()) {
-						shouldUnregister= true;
-					}
-				}
-				_OT$lazyGlobalActiveFlag = false;
-			} // release this before calling synchronized base class methods
-			if (shouldUnregister) 		//$Debug(DeactivateMethod)
-				doUnregistration();
-		}
-	}
-
-	public void deactivateForEndedThread(Thread thread) {
-		synchronized (_OT$registrationLock) {
-			boolean shouldUnregister= false;
-			synchronized (this) {
-				_OT$activatedThreads.remove(thread);
-				if (!_OT$lazyGlobalActiveFlag  && _OT$activatedThreads.isEmpty())
-					shouldUnregister= true;
-			}
-			if (shouldUnregister)
-				doUnregistration();
-		}
-	}
-
-	private void _OT$activateForAllThreads() {
-		HashSet threads = TeamThreadManager.getExistingThreads();
-		Iterator it = threads.iterator();
-		while (it.hasNext()) {
-			Thread a_thread = (Thread) it.next();
-			activate(a_thread); // use smaller activate version (no ALL_THREADS, no registerAtBases,...
-		}
-	}
-
-	/**
-	 * This method is used for implicit activation in team-level methods.
-	 * Implicit activation only applies to the current thread.
-	 * Don't call it from client code.
-	 */
-	public void _OT$implicitlyActivate() {
-		synchronized (this._OT$registrationLock) {
-			boolean shouldRegister= false;
-			synchronized (this) {
-				// this method is used for debugging purpose (team monitor)
-				Thread currentThread = Thread.currentThread();
-				if (!_OT$activatedThreads.containsKey(currentThread)) {
-					// register 'thread' as active:
-					_OT$activatedThreads.put(currentThread, Boolean.FALSE);
-					shouldRegister= true;
-				}
-				//	increment thread local implicit activation counter:
-				int implActCount = (_OT$implicitActivationsPerThread.get()).intValue();
-				_OT$implicitActivationsPerThread.set(Integer.valueOf(implActCount + 1 ));
-			}
-			if (shouldRegister) //$Debug(ImplicitActivateMethod)
-				doRegistration();
-		}
-	}
-
-	/**
-	 * This method is used for implicitly deactivation in team-level methods.
-	 * It respects explicit activation changes and nested calls to team-level methods.
-	 * Implicit deactivation only applies to the current thread.
-	 * Don't call it from client code.
-	 */
-	public void _OT$implicitlyDeactivate() {
-		synchronized (this._OT$registrationLock) {
-			boolean shouldUnregister= false;
-			synchronized(this) {
-				// this method is used for debugging purpose (team monitor)
-				Thread currentThread = Thread.currentThread();
-				boolean explicitlyActivated = false;
-				if (_OT$activatedThreads.containsKey(currentThread)) {
-					explicitlyActivated = ((Boolean) _OT$activatedThreads.get(currentThread)).booleanValue();
-				}
-				if (!explicitlyActivated
-						&& !_OT$lazyGlobalActiveFlag // no explicit activation overriding the implicit one
-						&& ((_OT$implicitActivationsPerThread.get()).intValue() == 1))  // this is the last implicit activation
-				{
-					_OT$activatedThreads.remove(currentThread);
-					if (_OT$activatedThreads.isEmpty()) // there are not other threads for which this theam is active
-					{
-						shouldUnregister= true;
-					}
-				}
-				// decrement thread local implicit activaion counter:
-				int implActCount = (_OT$implicitActivationsPerThread.get()).intValue();
-				_OT$implicitActivationsPerThread.set(Integer.valueOf(implActCount - 1));
-			}
-			if (shouldUnregister) //$Debug(ImplicitDeactivateMethod)
-				doUnregistration();
-		}
-	}
-
-	/**
-	 * Define whether per-thread activation of this team should be inheritable
-	 * such that the team will be activated automatically for any new threads
-	 * that are spawned from a thread for which the team is already active at that time.
-	 *
-	 * @param inheritable whether or not activation should be inheritable to new threads
-	 */
-	public void setInheritableActivation(boolean inheritable) {
-		if (inheritable)
-			TeamThreadManager.registerTeamForActivationInheritance(this);
-		else
-			TeamThreadManager.unRegisterTeamForActivationInheritance(this);
-	}
-
-	// not API (for use by the TeamThreadManager)
-	public boolean internalIsActiveSpecificallyFor(Thread t) {
-		return this._OT$activatedThreads.containsKey(t);
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public final boolean isActive() {
-		return isActive(Thread.currentThread());
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public final boolean isActive(Thread thread) {
-		if (thread.equals(ALL_THREADS)) {
-			return _OT$globalActive;
-		}
-		if (_OT$lazyGlobalActiveFlag) {
-				return true;
-		} else {
-			//if (!TeamThreadManager.getExistingThreads().contains(thread)) { // this thread is already finished!
-			if (!thread.isAlive()) { // this thread is already finished!
-				throw new IllegalThreadStateException("Called 'isActive(...)' for a thread which is no longer running!");
-			}
-			return _OT$activatedThreads.containsKey(thread);
-		}
-	}
-
-// ***** for restoring the activation state after a within block:	---->*****
-	private static final int _OT$INACTIVE = 0;
-	private static final int _OT$IMPLICIT_ACTIVE = 1;
-	private static final int _OT$EXPLICIT_ACTIVE = 2;
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public synchronized int _OT$saveActivationState() {
-		int old_state = _OT$INACTIVE;
-		if (_OT$lazyGlobalActiveFlag) {
-			old_state = _OT$EXPLICIT_ACTIVE;
-		} else {
-			Thread current_thread = Thread.currentThread();
-			if (_OT$activatedThreads.containsKey(current_thread)) {
-				old_state = _OT$IMPLICIT_ACTIVE;
-				if (((Boolean)_OT$activatedThreads.get(current_thread)).booleanValue()) {
-					old_state = _OT$EXPLICIT_ACTIVE;
-				}
-			}
-		}
-		return old_state;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void _OT$restoreActivationState(int old_state) {
-		synchronized (_OT$registrationLock) {
-			if (old_state == _OT$INACTIVE) // team was inactive before:
-				deactivate();
-			else { // team was active before: has to be reactivated:
-				boolean explicit = (old_state == _OT$EXPLICIT_ACTIVE);
-				synchronized (this) {
-					_OT$activatedThreads.put(Thread.currentThread(), Boolean.valueOf(explicit));
-				}
-				doRegistration();
-			}
-		}
-	}
-//	 ***** <----for restoring the activation state after a within block.	*****
-
-
-	private void doRegistration() {
-		if (_OT$registrationState == _OT$UNREGISTERED) {
-			// register the team at the TeamManager
-			TeamManager.handleTeamStateChange(this, TeamManager.TeamStateChange.REGISTER);
-			_OT$registrationState = _OT$REGISTERED;
-		}
-	}
-
-	private void doUnregistration() {
-		if (_OT$registrationState == _OT$REGISTERED) {
-			// unregister the team at the TeamManager
-			TeamManager.handleTeamStateChange(this, TeamManager.TeamStateChange.UNREGISTER);
-			_OT$registrationState = _OT$UNREGISTERED;
-		}
-	}
-
-	/**
-	 * This method will be implemented by generated code in subteams.
-	 * It registers the team at every base playing one of its roles.
-	 * Don't call it from client code.
-	 */
-	public void _OT$registerAtBases() {}
-
-	/**
-	 * This method will be implemented by generated code in subteams.
-	 * It unregisters the team from every base playing one of its roles.
-	 * Don't call it from client code.
-	 */
-	public void _OT$unregisterFromBases() {}
-
-	//public int _OT$activationState = -1; // TODO: remove usage of  this from generated code
-
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public boolean hasRole(Object aBase) {
-		// overriding method to be generated by the compiler for each team with bound roles.
-		return false;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public boolean hasRole(Object aBase, Class<?> roleType) throws IllegalArgumentException {
-		// overriding method to be generated by the compiler for each team with bound roles.
-		throw new IllegalArgumentException("No such bound role type in this team: "+roleType.getName());
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object getRole(Object aBase) {
-		// overriding method to be generated by the compiler for each team with bound roles.
-		return null;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public <T> T getRole(Object aBase, Class<T> roleType) throws IllegalArgumentException {
-		// overriding method to be generated by the compiler for each team with bound roles.
-		return null;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public Object[] getAllRoles() {
-		// overriding method to be generated by the compiler for each team with bound roles.
-		return new Object[0];
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public <T> T[] getAllRoles(Class<T> roleType) throws IllegalArgumentException {
-		// overriding method to be generated by the compiler for each team with bound roles.
-		throw new IllegalArgumentException("Class org.objectteams.Team has no bound roles.");
-	}
-
-	/** Internal variable to be set from generated code. */
-	private boolean _OT$isExecutingCallin = false;
-
-	/**
-	 * Method only for internal use by generated code.
-	 */
-	public boolean _OT$setExecutingCallin(boolean newFlag) {
-		boolean oldVal = _OT$isExecutingCallin;
-		_OT$isExecutingCallin = newFlag;
-		return oldVal;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public boolean isExecutingCallin() {
-		return _OT$isExecutingCallin;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void unregisterRole(Object aRole) {
-		// overriding method to be generated by the compiler for each team with bound roles.
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public void unregisterRole(Object aRole, Class<?> roleType) throws IllegalArgumentException {
-		// overriding method to be generated by the compiler for each team with bound roles.
-	}
-
-	@Override
-	protected void finalize() throws Throwable {
-		// nop, hook for the debugger
-		@SuppressWarnings("unused")
-		int i= 2+3; // Note: body must not be empty for debuggger to be able to stop.
-	} // $Debug(FinalizeMethod)
-
-	/**
-	 * If a serializable team wishes to persist its global activation status it must
-	 * call this method from its writeObject() method and correspondingly call
-	 * {@link #readGlobalActivationState(ObjectInputStream)} from its readObject().
-	 */
-	protected void writeGlobalActivationState(ObjectOutputStream out) throws IOException {
-		out.writeBoolean(this._OT$globalActive);
-	}
-	/**
-	 * If a serializable team wishes to persist its global activation status it must
-	 * call this method from its readObject() method and correspondingly call
-	 * {@link #writeGlobalActivationState(ObjectOutputStream)} from its writeObject().
-	 * If a team is restored that was globally active when serialized, it will be activated
-	 * correspondingly during deserialization when this method is called.
-	 */
-	protected void readGlobalActivationState(ObjectInputStream in) throws IOException {
-		this._OT$globalActive = in.readBoolean();
-		if (this._OT$globalActive) {
-			this._OT$lazyGlobalActiveFlag = true;
-			this.doRegistration();
-		}
-	}
-	/**
-	 * Serializable teams must invoke this method once from their readObject() method
-	 * in order to re-initialize internal data structures.
-	 */
-	protected void restore() { /* empty; implementation will be generated for each serializable sub-class. */ }
-	/**
-	 * Serializable teams must invoke this method from their readObject() method
-	 * for each role that has been retrieved and shall be re-registered for this team.
-	 */
-	protected void restoreRole(Class<?> clazz, Object role) { /* empty; implementation will be generated for each serializable sub-class. */ }
-
-	/**
-	 * This method is the first part of the new chaining wrapper.
-	 * It should be called from the generated client code.
-	 *
-	 * @param baze the current base object
-	 * @param teams the current team objects
-	 * @param idx the index of the current team in teams
-	 * @param callinIds an array of ids, that are unique in the team
-	 *                  for a base method in a base class
-	 * @param boundMethodId an unique id for a base method in the base class.
-	 *                      This id is needed for a base call.
-	 * @param args packed arguments.
-	 * @return possibly boxed result
-	 */
-	public Object _OT$callAllBindings(IBoundBase baze, ITeam[] teams,int idx,int[] callinIds, int boundMethodId, Object[] args)
-	{
-
-
-		this._OT$callBefore(baze, callinIds[idx], boundMethodId, args);
-
-		Object res = this._OT$callReplace(baze, teams, idx, callinIds, boundMethodId, args);
-
-		this._OT$callAfter(baze, callinIds[idx], boundMethodId, args, res); // make result available to param mappings!
-
-		return res;
-	}
-
-	/**
-	 * This method calls the next team or a base method,
-	 * if there are no more active teams for a joinpoint
-	 *
-	 * @param baze the current base object
-	 * @param teams the current base object
-	 * @param idx the index of the current team in teams, also points into callinIds, i.e., both lists run synchroneously.
-	 * @param callinIds an array of ids, that are unique in the team
-	 *                  for a base method in a base class
-	 * @param boundMethodId an unique id for a base method in the base class.
-	 *                      This id is needed for a base call.
-	 * @param args original packed arguments.
-	 * @param baseCallArgs packed arguments as provided to the base call.
-	 * @return possibly boxed result
-	 */
-	public Object _OT$callNext(IBoundBase baze, ITeam[] teams, int idx, int[] callinIds, int boundMethodId, Object[] args, Object[] baseCallArgs)
-	{
-//System.out.println("callNext idx="+idx);
-//for (Team t : teams)
-//	System.out.println("team="+t);
-		// Are there still active teams?
-		if (idx+1 < teams.length) {
-			// Yes, so call the next team/callin
-			return teams[idx+1]._OT$callAllBindings(baze, teams, idx+1, callinIds, boundMethodId, args);
-		} else {
-			//No, call the base method
-			if (baze == null) {
-				//handle base call to a static base method
-				return teams[idx]._OT$callOrigStatic(callinIds[idx], boundMethodId, args);
-			} else {
-//System.out.println("callOrig: "+boundMethodId);
-				return baze._OT$callOrig(boundMethodId, args);
-//Object result = baze.callOrig(boundMethodId, args);
-//System.out.println("->"+result);
-//return result;
-			}
-		}
-	}
-
-	/**
-	 * Executes all before callins for a given callin id.
-	 * Must be overridden by a team, if the team gets replace callins.
-	 *
-	 * @param baze the current base object
-	 * @param callinId the current callin id
-	 * @param boundMethodId an unique id for a base method in the base class.
-	 *                      This id is needed for a base call.
-	 * @param args packed arguments.
-	 * @return possibly boxed result
-	 */
-	public void _OT$callBefore(IBoundBase baze, int callinId, int boundMethodId, Object[] args) {
-		// nop; override with code from before callin bindings.
-	}
-
-	/**
-	 * Executes all after callins for a given callin id.
-	 * Must be overridden by a team, if the team gets replace callins.
-	 *
-	 * @param baze the current base object
-	 * @param callinId the current callin id
-	 * @param boundMethodId an unique id for a base method in the base class.
-	 *                      This id is needed for a base call.
-	 * @param args packed arguments.
-	 * @param result the result of the base method. Could be used by after callins
-	 */
-	public void _OT$callAfter(IBoundBase baze, int callinId, int boundMethodId, Object[] args, Object result) {
-		// nop; override with code from after callin bindings.
-	}
-
-	/**
-	 * Execute replace callins of the team for the current callin id.
-	 * Must be overridden by a team, if the team has got replace callins.
-	 *
-	 * @param baze the current base object
-	 * @param teams the current base object
-	 * @param idx the index of the current team in teams
-	 * @param callinIds an array of ids, that are unique in the team
-	 *                  for a base method in a base class
-	 * @param boundMethodId an unique id for a base method in the base class.
-	 *                      This id is needed for a base call.
-	 * @param args packed arguments.
-	 * @return possibly boxed result
-	 */
-	public Object _OT$callReplace(IBoundBase baze, ITeam[] teams, int idx, int[] callinIds, int boundMethodId, Object[] args) {
-		// default; override with code from replace callin bindings.
-		return _OT$callNext(baze, teams, idx, callinIds, boundMethodId, args, null);
-	}
-
-	/**
-	 * Calls the method callOrigStatic of a concrete class dependend on the
-	 * given callin id.
-	 * Must be overridden in a team, if the team has got base calls
-	 * to static base methods
-	 * @param callinId
-	 * @param boundMethodId
-	 * @param args
-	 * @return
-	 */
-	public Object _OT$callOrigStatic(int callinId, int boundMethodId, Object[] args) {
-		return null;
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/TeamThreadManager.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/TeamThreadManager.java
deleted file mode 100644
index e6bc9db..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/TeamThreadManager.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2006-2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-import java.util.HashSet;
-import java.util.WeakHashMap;
-
-
-/**
- * This class is for internal use, only.
- *
- * Maintain information about existing threads as to manage
- * team activation per thread vs. globally.
- *
- * @author Chistine Hundt
- * @author Stephan Herrmann
- */
-public class TeamThreadManager {
-
-	private static Object token = new Object();
-
-	private static HashSet<ITeam> globalActiveTeams = new HashSet<ITeam>();
-	private static WeakHashMap<ITeam,Object> teamsWithActivationInheritance = new WeakHashMap<ITeam,Object>();
-	private static HashSet<Thread> existingThreads = new HashSet<Thread>();
-
-	public static boolean newThreadStarted(boolean isMain, Thread parent) {
-		Thread currentThread = Thread.currentThread();
-		// already registered?
-		if (existingThreads.contains(currentThread))
-			return false;
-		// workaround for application hang on Mac OS with Apple JVM:
-		if (System.getProperty("os.name").startsWith("Mac"))
-			if (currentThread.getName().equals("AWT-Shutdown"))
-				return false;
-
-		ITeam[] globalTeams;
-		ITeam[] inheritableTeams;
-		synchronized (TeamThreadManager.class) {
-			boolean isFirst = existingThreads.isEmpty();
-			existingThreads.add(currentThread);
-			if (isMain || isFirst) {
-				for (Thread thread : fetchSystemThreads(currentThread))
-					if (thread != null)
-						existingThreads.add(thread);
-			}
-
-			globalTeams = globalActiveTeams.toArray(new ITeam[globalActiveTeams.size()]);
-			inheritableTeams = teamsWithActivationInheritance.keySet().toArray(new ITeam[teamsWithActivationInheritance.size()]);
-		}
-		// activate teams outside synchronized block:
-		for (ITeam t : globalTeams)
-			t.activate(currentThread); // small version? global -> already registered...!
-		if (parent != null)
-			for (ITeam t : inheritableTeams)
-				if (t.internalIsActiveSpecificallyFor(parent))
-					t.activate(currentThread); // pass activation from parent to child thread
-		return true;
-	}
-
-	/* Fetch all existing threads existing at this point in time. Result array is padded with nulls. */
-	private static Thread[] fetchSystemThreads(Thread currentThread) {
-		ThreadGroup group = currentThread.getThreadGroup();
-		{
-			ThreadGroup parentGroup;
-			while ((parentGroup= group.getParent()) != null)
-				group = parentGroup;
-		}
-		int size = group.activeCount();
-		Thread[] allThreads;
-		do {
-			size += 2;
-			allThreads = new Thread[size];
-		} while (group.enumerate(allThreads) == size);
-		return allThreads;
-	}
-
-	public static void threadEnded() {
-		ITeam[] teamsToDeactivate = internalThreadEnded();
-		// + remove per thread activation:
-		for (ITeam t : teamsToDeactivate)
-			//t.deactivate(Thread.currentThread()); // small version?
-			t.deactivateForEndedThread(Thread.currentThread());
-	}
-	private synchronized static ITeam[] internalThreadEnded() {
-		existingThreads.remove(Thread.currentThread());
-		// fetch all global active teams for deactivation:
-		return globalActiveTeams.toArray(new ITeam[globalActiveTeams.size()]);
-	}
-
-	public synchronized static void addGlobalActiveTeam(ITeam t) {
-		globalActiveTeams.add(t);
-	}
-
-	public synchronized static void removeGlobalActiveTeam(ITeam t) {
-		globalActiveTeams.remove(t);
-	}
-
-	public static HashSet<Thread> getExistingThreads() {
-		return existingThreads;
-	}
-	public static void registerTeamForActivationInheritance(ITeam aTeam) {
-		teamsWithActivationInheritance.put(aTeam,token);
-	}
-	public static void unRegisterTeamForActivationInheritance(ITeam aTeam) {
-		teamsWithActivationInheritance.remove(aTeam);
-	}
-
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/UnsupportedFeatureException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/UnsupportedFeatureException.java
deleted file mode 100644
index 24dd1bf..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/UnsupportedFeatureException.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2004, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * @author resix
- */
-public class UnsupportedFeatureException extends RuntimeException {
-
-	/**
-	 *
-	 */
-	private static final long serialVersionUID = 1L;
-	private static final String _bugmsg = "\nThe program encountered an unsupported situation! ";
-
-	/**
-	 *
-	 */
-	public UnsupportedFeatureException() {
-		super(_bugmsg);
-	}
-
-	/**
-	 * @param message
-	 */
-	public UnsupportedFeatureException(String message) {
-		super(_bugmsg + "\n" + message);
-		StackTraceElement[] ste = new StackTraceElement[0];
-		setStackTrace(ste);
-	}
-
-	/**
-	 * @param cause
-	 */
-	public UnsupportedFeatureException(Throwable cause) {
-		super(_bugmsg + cause.toString());
-	}
-
-	/**
-	 * @param message
-	 * @param cause
-	 */
-	public UnsupportedFeatureException(String message, Throwable cause) {
-		super(_bugmsg + message/*+cause.toString()*/);
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/WrongRoleException.java b/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/WrongRoleException.java
deleted file mode 100644
index 467c4a0..0000000
--- a/plugins/org.eclipse.objectteams.otredyn/src/org/objectteams/WrongRoleException.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Dynamic Runtime Environment"
- *
- * Copyright 2003, 2010 Berlin Institute of Technology, Germany, and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- *
- * Contributors:
- *		Berlin Institute of Technology - Initial API and implementation
- **********************************************************************/
-package org.objectteams;
-
-/**
- * This exception is thrown by the OT/J infra structure if a role for a given base object
- * was requested during lifting, but a role with an incompatible type was already
- * registered for that base object. Can only happen if a compile time warning occurred.
- * @author Stephan Herrmann
- */
-public class WrongRoleException extends RuntimeException {
-	/**
-	 *
-	 */
-	private static final long serialVersionUID = 1L;
-	private Class<?> clazz;
-	private Object base;
-	private Object role;
-
-	/**
-	 * @param clazz
-	 * @param base
-	 * @param role
-	 */
-	public WrongRoleException (Class<?> clazz, Object base, Object role) {
-		this.clazz = clazz;
-		this.base = base;
-		this.role = role;
-	}
-
-	@Override
-	public String getMessage() {
-		String baseClazz = base.getClass().getName();
-		String roleClazz = role.getClass().getName();
-		return "The compiler has warned you about ambiguous role bindings.\n"
-				+ "Now lifting to " + clazz
-				+ " fails with the following objects\n"
-				+ "(see OT/J language definition para. 2.3.4(d)):\n"
-				+ "Provided:\n  Base object: " + base + "\n" + "  Base type:   "
-				+ baseClazz + "\n"
-				+ "Found in cache:\n  Role object: " + role + "\n"
-				+ "  Role type:   " + roleClazz;
-	}
-}
