New strategy for OTRE jars:
* revert fragment otequinox.runtime to a regular plugin with nested jars (otre & BCEL) (no equinox issues any more)
  - otequinox.hook accesses the OTRE now via a new service (IOTTransformer) provided by otequinox (new class TransformerServiceDelegate)
* let otequinox re-export objectteams.runtime for easy access to o.o.Team et al. (all OT-bundles depending on otequinox)
* objectteams.otdt now only hosts otre_min.jar and otre_agent.jar
* cleanup management of classpath variables and dependent paths
  - OTRUNTIME_LIBDIR now directly points to the lib dir containing the jars
  - all paths are now served from OTREContainer
  - use only one classpath variable initializer for both variables
diff --git a/plugins/org.eclipse.objectteams.otdt.debug.adaptor/src/org/eclipse/objectteams/otdt/internal/debug/adaptor/launching/JDTLaunchingAdaptor.java b/plugins/org.eclipse.objectteams.otdt.debug.adaptor/src/org/eclipse/objectteams/otdt/internal/debug/adaptor/launching/JDTLaunchingAdaptor.java
index 397e514..7290f2f 100644
--- a/plugins/org.eclipse.objectteams.otdt.debug.adaptor/src/org/eclipse/objectteams/otdt/internal/debug/adaptor/launching/JDTLaunchingAdaptor.java
+++ b/plugins/org.eclipse.objectteams.otdt.debug.adaptor/src/org/eclipse/objectteams/otdt/internal/debug/adaptor/launching/JDTLaunchingAdaptor.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2008 Technical University Berlin, Germany.
+ * 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
@@ -22,17 +22,13 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
 import org.eclipse.debug.core.ILaunch;
 import org.eclipse.debug.core.ILaunchConfiguration;
 import org.eclipse.debug.core.ILaunchManager;
 import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
 import org.eclipse.jdt.launching.JavaRuntime;
 import org.eclipse.objectteams.otdt.core.ext.OTREContainer;
-import org.eclipse.objectteams.otdt.core.ext.OTRuntimeClasspathProvider;
-import org.eclipse.objectteams.otdt.debug.IOTLaunchConstants;
 import org.eclipse.objectteams.otdt.debug.OTDebugPlugin;
 import org.eclipse.objectteams.otdt.debug.OTVMRunnerAdaptor;
 import org.eclipse.objectteams.otdt.debug.TeamBreakpointInstaller;
@@ -93,7 +89,7 @@
 			for (int i = 0; i < origEntries.length; i++)
 	        {
 	            IRuntimeClasspathEntry entry = origEntries[i];
-				if (OTRuntimeClasspathProvider.BCEL_JAR.equals(entry.getPath()))
+				if (OTREContainer.BCEL_JAR.equals(entry.getPath()))
 					hasBCEL = true;
 				else if (OTREContainer.OTRE_JAR_PATH.equals(entry.getPath().toString()))
 					hasOTRE_min = true;
@@ -103,7 +99,7 @@
 			IRuntimeClasspathEntry entry;
 	
 			if (!hasBCEL) {
-				entry = JavaRuntime.newArchiveRuntimeClasspathEntry(OTRuntimeClasspathProvider.BCEL_JAR);
+				entry = JavaRuntime.newArchiveRuntimeClasspathEntry(OTREContainer.BCEL_JAR);
 				entry.setClasspathProperty(IRuntimeClasspathEntry.BOOTSTRAP_CLASSES);
 				result.add(entry);			
 			}
@@ -117,7 +113,7 @@
 			}		    	
 			
 			if (!hasOTRE_min && !useJMangler) {
-				entry = JavaRuntime.newArchiveRuntimeClasspathEntry(JavaCore.getResolvedVariablePath(new Path(OTREContainer.OTRE_MIN_JAR_PATH)));
+				entry = JavaRuntime.newArchiveRuntimeClasspathEntry(OTREContainer.OTRE_MIN_JAR_PATH);
 				entry.setClasspathProperty(IRuntimeClasspathEntry.BOOTSTRAP_CLASSES);
 				result.add(entry);
 			}
@@ -188,9 +184,10 @@
 	}
 	
 	static boolean isNormalOTJLaunch(ILaunchConfiguration config) {
+		// FIXME(SH): see https://bugs.eclipse.org/302976
 		try {
 			return    config.getAttribute(OTDebugPlugin.OT_LAUNCH, false)                               // OT/J ?
-				  && !config.getAttribute(IOTLaunchConstants.ATTR_USE_JPLIS, false)					    // not JPLIS ?
+				  && false//&& !config.getAttribute(IOTLaunchConstants.ATTR_USE_JPLIS, false)					    // not JPLIS ?
 				  && (config.getAttribute(IPDEUIConstants.LAUNCHER_PDE_VERSION, (String)null) == null); // not PDE ?
 		} catch (CoreException e) {
 			return false; // don't apply adaptations to bogus config
@@ -200,7 +197,7 @@
 	static boolean isJPLISOTJLaunch(ILaunchConfiguration config) {
 		try {
 			return    config.getAttribute(OTDebugPlugin.OT_LAUNCH, false)                               // OT/J ?
-				  &&  config.getAttribute(IOTLaunchConstants.ATTR_USE_JPLIS, false)					    // JPLIS ?
+				  //&&  config.getAttribute(IOTLaunchConstants.ATTR_USE_JPLIS, false)					    // JPLIS ?
 				  && (config.getAttribute(IPDEUIConstants.LAUNCHER_PDE_VERSION, (String)null) == null); // not PDE ?
 		} catch (CoreException e) {
 			return false; // don't apply adaptations to bogus config
diff --git a/plugins/org.eclipse.objectteams.otdt.debug/src/org/eclipse/objectteams/otdt/debug/OTVMRunnerAdaptor.java b/plugins/org.eclipse.objectteams.otdt.debug/src/org/eclipse/objectteams/otdt/debug/OTVMRunnerAdaptor.java
index cc48eb6..ff48969 100644
--- a/plugins/org.eclipse.objectteams.otdt.debug/src/org/eclipse/objectteams/otdt/debug/OTVMRunnerAdaptor.java
+++ b/plugins/org.eclipse.objectteams.otdt.debug/src/org/eclipse/objectteams/otdt/debug/OTVMRunnerAdaptor.java
@@ -37,6 +37,7 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.launching.VMRunnerConfiguration;
 import org.eclipse.objectteams.otdt.core.ext.OTDTPlugin;
+import org.eclipse.objectteams.otdt.core.ext.OTREContainer;
 import org.eclipse.objectteams.otdt.debug.internal.TempFileManager;
 
 
@@ -54,7 +55,7 @@
 	static {
 		JPLIS_VMARGS = new ArrayList<String>();
 		JPLIS_VMARGS.add("-Dot.otdt");
-		JPLIS_VMARGS.add("-javaagent:" + OTDTPlugin.calculateAbsoluteRuntimePath("/lib/otre_agent.jar"));
+		JPLIS_VMARGS.add("-javaagent:" + "\""+OTREContainer.OTRE_AGENT_JAR_PATH.toOSString()+'"'); // support blanks in path
 	}
 
 	final static private boolean _useJPLIS = true;
diff --git a/plugins/org.eclipse.objectteams.otdt/plugin.xml b/plugins/org.eclipse.objectteams.otdt/plugin.xml
index 4c37444..e2cd84c 100644
--- a/plugins/org.eclipse.objectteams.otdt/plugin.xml
+++ b/plugins/org.eclipse.objectteams.otdt/plugin.xml
@@ -41,6 +41,9 @@
       <classpathVariableInitializer 
          	variable="OTDT_INSTALLDIR" 
          	class="org.eclipse.objectteams.otdt.core.ext.OTVariableInitializer"/> 
+      <classpathVariableInitializer 
+         	variable="OTRUNTIME_LIBDIR" 
+         	class="org.eclipse.objectteams.otdt.core.ext.OTVariableInitializer"/> 
    </extension>
    
    <extension 
@@ -51,14 +54,6 @@
             class="org.eclipse.objectteams.otdt.core.ext.OTREContainerInitializer"/>
    </extension>
    
-   <extension
-         point="org.eclipse.jdt.core.classpathVariableInitializer">
-      <classpathVariableInitializer
-            variable="OTRUNTIME_INSTALLDIR"
-            class="org.eclipse.objectteams.otdt.core.ext.OTRuntimeVariableInitializer">
-      </classpathVariableInitializer>
-   </extension>
-
    <extension point="org.eclipse.jdt.launching.classpathProviders">
 	   <classpathProvider 
 	      id="org.eclipse.objectteams.otdt.OTRuntimeClasspathProvider"
diff --git a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTDTPlugin.java b/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTDTPlugin.java
index 36dcf9a..198a628 100644
--- a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTDTPlugin.java
+++ b/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTDTPlugin.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2003, 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2003, 2010 Fraunhofer Gesellschaft, Munich, Germany,
  * for its Fraunhofer Institute for Computer Architecture and Software
  * Technology (FIRST), Berlin, Germany and Technical University Berlin,
  * Germany.
@@ -22,6 +22,7 @@
 
 import org.eclipse.core.resources.ICommand;
 import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Plugin;
@@ -40,6 +41,7 @@
 	public static final String PLUGIN_ID = JavaCore.OTDT_PLUGIN_ID;
 
 	public static final String OTDT_INSTALLDIR = "OTDT_INSTALLDIR"; //$NON-NLS-1$
+	public static final String OTRUNTIME_LIBDIR = "OTRUNTIME_LIBDIR" ; //$NON-NLS-1$
 	
 	// === IDs for configurable options for the compiler : ===
 	public static final String OT_COMPILER_BASE_CALL =
@@ -92,9 +94,6 @@
 	public static final String OT_COMPILER_DEPRECATED_PATH_SYNTAX = 
 		PLUGIN_ID + ".compiler.problem.deprecated_path_syntax"; //$NON-NLS-1$;
 
-
-	public static String OTRUNTIME_INSTALLDIR = "OTRUNTIME_INSTALLDIR"; //$NON-NLS-1$
-
     private static OTDTPlugin _singleton = null;
 
 
@@ -143,13 +142,12 @@
 	    return new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, message, exception);
 	}
 	
-    /** 
-     * Take relativeFileName relative to OTRUNTIME_INSTALLDIR and make an absolute path from that.
-     * The returned string is enclosed in double-quotes so it is safe to have blanks within.
+	/** 
+     * Take relativeFileName relative to a given classpath variable and make an absolute path from that.
      */
-	public static String calculateAbsoluteRuntimePath(String relativeFileName)
+	public static IPath getResolvedVariablePath(String variableName, String relativeFilename)
 	{
-		Path path = new Path(OTDTPlugin.OTRUNTIME_INSTALLDIR + relativeFileName);
-		return "\""+JavaCore.getResolvedVariablePath( path ).toOSString()+'"'; //$NON-NLS-1$
+		Path path = new Path(variableName + '/'+ relativeFilename);
+		return JavaCore.getResolvedVariablePath(path);
 	}
 }
diff --git a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTREContainer.java b/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTREContainer.java
index 921b82b..eb8e03f 100644
--- a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTREContainer.java
+++ b/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTREContainer.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2003, 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2003, 2010 Fraunhofer Gesellschaft, Munich, Germany,
  * for its Fraunhofer Institute for Computer Architecture and Software
  * Technology (FIRST), Berlin, Germany and Technical University Berlin,
  * Germany.
@@ -33,17 +33,25 @@
 import org.eclipse.jdt.core.JavaModelException;
 
 /**
+ * This class serves the "OTRE" classpath container.
+ * It also provides access to resolved paths for all OTRE-related jars.
  * @author gis
  */
 public class OTREContainer implements IClasspathContainer
 {
-    public static final String OTRE_CONTAINER_NAME   = "OTRE"; //$NON-NLS-1$
-    public static final String OTRE_JAR_FILENAME     = "otre.jar"; //$NON-NLS-1$
-    public static final String OTRE_MIN_JAR_FILENAME = "otre_min.jar"; //$NON-NLS-1$
+    public static final String OTRE_CONTAINER_NAME     = "OTRE"; //$NON-NLS-1$
+    public static final String OTRE_JAR_FILENAME       = "otre.jar"; //$NON-NLS-1$
+    public static final String BCEL_JAR_FILENAME       = "BCEL.jar"; //$NON-NLS-1$
+    public static final String OTRE_MIN_JAR_FILENAME   = "otre_min.jar"; //$NON-NLS-1$
+    public static final String OTRE_AGENT_JAR_FILENAME = "otre_agent.jar"; //$NON-NLS-1$
     
     public static final IPath  OTRE_CONTAINER_PATH = new Path(OTRE_CONTAINER_NAME);
-    public static final String OTRE_JAR_PATH  	   = OTDTPlugin.OTDT_INSTALLDIR + "/lib/" + OTRE_JAR_FILENAME; //$NON-NLS-1$
-    public static final String OTRE_MIN_JAR_PATH   = OTDTPlugin.OTDT_INSTALLDIR + "/lib/" + OTRE_MIN_JAR_FILENAME; //$NON-NLS-1$
+    // these are served from the current plugin:
+    public static final IPath  OTRE_MIN_JAR_PATH   = OTDTPlugin.getResolvedVariablePath(OTDTPlugin.OTDT_INSTALLDIR, "lib/"+OTRE_MIN_JAR_FILENAME); //$NON-NLS-1$
+    public static final IPath  OTRE_AGENT_JAR_PATH = OTDTPlugin.getResolvedVariablePath(OTDTPlugin.OTDT_INSTALLDIR, "lib/"+OTRE_AGENT_JAR_FILENAME); //$NON-NLS-1$
+    // these are served from org.eclipse.objectteams.runtime/lib:
+    public static final String OTRE_JAR_PATH  	   = OTDTPlugin.OTRUNTIME_LIBDIR + '/' + OTRE_JAR_FILENAME; //$NON-NLS-1$
+    public static final IPath  BCEL_JAR            = OTDTPlugin.getResolvedVariablePath(OTDTPlugin.OTRUNTIME_LIBDIR, BCEL_JAR_FILENAME); //$NON-NLS-1$
 
     private IClasspathEntry[] _cpEntries;
 
diff --git a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTRuntimeClasspathProvider.java b/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTRuntimeClasspathProvider.java
index e90bfe4..faf6a56 100644
--- a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTRuntimeClasspathProvider.java
+++ b/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTRuntimeClasspathProvider.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2003, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2003, 2010 Fraunhofer Gesellschaft, Munich, Germany,
  * for its Fraunhofer Institute for Computer Architecture and Software
  * Technology (FIRST), Berlin, Germany and Technical University Berlin,
  * Germany.
@@ -24,10 +24,7 @@
 import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
 import org.eclipse.debug.core.ILaunchConfiguration;
-import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.launching.IRuntimeClasspathEntry;
 import org.eclipse.jdt.launching.JavaRuntime;
 import org.eclipse.jdt.launching.StandardClasspathProvider;
@@ -41,9 +38,7 @@
 {
 	public static final String PROVIDER_ID = "org.eclipse.objectteams.otdt.OTRuntimeClasspathProvider"; //$NON-NLS-1$
 
-	public static IPath BCEL_JAR = getVariablePath("/lib/BCEL.jar"); //$NON-NLS-1$
-
-    public IRuntimeClasspathEntry[] computeUnresolvedClasspath(ILaunchConfiguration configuration) throws CoreException
+	public IRuntimeClasspathEntry[] computeUnresolvedClasspath(ILaunchConfiguration configuration) throws CoreException
     {
     	// add BCEL, JMangler-core and JMangler-start (classpath / bootclasspath)
     	IRuntimeClasspathEntry[] origEntries = super.computeUnresolvedClasspath(configuration);
@@ -75,7 +70,7 @@
 		for (int i = 0; i < origEntries.length; i++)
         {
             IRuntimeClasspathEntry entry = origEntries[i];
-			if (BCEL_JAR.equals(entry.getPath()))
+			if (OTREContainer.BCEL_JAR.equals(entry.getPath()))
 				hasBCEL = true;
         }
 
@@ -86,7 +81,7 @@
 // Also fix getVariablePath() then.
 		if (!hasBCEL)
 		{
-			entry = JavaRuntime.newArchiveRuntimeClasspathEntry(BCEL_JAR);
+			entry = JavaRuntime.newArchiveRuntimeClasspathEntry(OTREContainer.BCEL_JAR);
 			entry.setClasspathProperty(IRuntimeClasspathEntry.BOOTSTRAP_CLASSES);
 			result.add(entry);			
 		}
@@ -104,13 +99,6 @@
 		return result.toArray(new IRuntimeClasspathEntry[result.size()]);
 	}
 
-    private static IPath getVariablePath(String filename)
-    {
-		Path path = new Path(OTDTPlugin.OTRUNTIME_INSTALLDIR + filename);
-		//return path;
-		return JavaCore.getResolvedVariablePath(path);
-    }
-
     public IRuntimeClasspathEntry[] resolveClasspath(
         IRuntimeClasspathEntry[] entries,
         ILaunchConfiguration configuration)
diff --git a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTRuntimeVariableInitializer.java b/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTRuntimeVariableInitializer.java
deleted file mode 100644
index c81ca43..0000000
--- a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTRuntimeVariableInitializer.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**********************************************************************
- * This file is part of "Object Teams Development Tooling"-Software
- * 
- * Copyright 2003, 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: OTRuntimeVariableInitializer.java 23419 2010-02-03 20:43:26Z stephan $
- * 
- * Please visit http://www.eclipse.org/objectteams for updates and contact.
- * 
- * Contributors:
- * Fraunhofer FIRST - Initial API and implementation
- * Technical University Berlin - Initial API and implementation
- **********************************************************************/
-package org.eclipse.objectteams.otdt.core.ext;
-
-import org.eclipse.jdt.core.ClasspathVariableInitializer;
-
-/**
- * FIXME(SH): try if this VARIABLE can be removed altogether.
- * @author gis
- * @version $Id: OTRuntimeVariableInitializer.java 23419 2010-02-03 20:43:26Z stephan $
- */
-public class OTRuntimeVariableInitializer extends ClasspathVariableInitializer
-{
-	public void initialize(String variable)
-	{
-		if (OTDTPlugin.OTRUNTIME_INSTALLDIR.equals(variable))
-		{
-			OTVariableInitializer.setPluginInstallationPathVariable(OTDTPlugin.getDefault(), variable);
-		}
-	}
-}
diff --git a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTVariableInitializer.java b/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTVariableInitializer.java
index e7d07da..8f820bb 100644
--- a/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTVariableInitializer.java
+++ b/plugins/org.eclipse.objectteams.otdt/src/org/eclipse/objectteams/otdt/core/ext/OTVariableInitializer.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2003, 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2003, 2010 Fraunhofer Gesellschaft, Munich, Germany,
  * for its Fraunhofer Institute for Computer Architecture and Software
  * Technology (FIRST), Berlin, Germany and Technical University Berlin,
  * Germany.
@@ -29,6 +29,7 @@
 import org.eclipse.core.runtime.Plugin;
 import org.eclipse.jdt.core.ClasspathVariableInitializer;
 import org.eclipse.jdt.core.JavaCore;
+import org.osgi.framework.Bundle;
 
 
 /**
@@ -48,21 +49,33 @@
     {
     	if (OTDTPlugin.OTDT_INSTALLDIR.equals(variable))
     	{
-			setPluginInstallationPathVariable(OTDTPlugin.getDefault(), variable);
+			setPluginInstallationPathVariable(OTDTPlugin.getDefault(), null, null, variable);
 		}
+    	else if (OTDTPlugin.OTRUNTIME_LIBDIR.equals(variable))
+		{
+			setPluginInstallationPathVariable(OTDTPlugin.getDefault(), "org.eclipse.objectteams.runtime", "lib", variable);
+		}
+
     }
 
-	public static void setPluginInstallationPathVariable(Plugin relativePlugin, String variable)
+	public static void setPluginInstallationPathVariable(Plugin relativePlugin, String bundleName, String relativeDir, String variable)
 	{
 		try 
 		{
-			URL installDirectory = relativePlugin.getBundle().getEntry("/"); //$NON-NLS-1$
+			URL installDirectory;
+			if (bundleName == null)
+				installDirectory = relativePlugin.getBundle().getEntry("/"); //$NON-NLS-1$
+			else
+				installDirectory = getBundle(bundleName).getEntry("/"); //$NON-NLS-1$
+			
 
 			// On Windows, the next line leads to something like "/C:/Programme/Eclipse/plugins/my.plugin
 			// If we simply make an org.eclipse.core.runtime.Path out of it, the leading '/' makes the
 			// parsing fail (device, e.g. 'C:' is not detected). We must use java.io.File to parse it
 			// properly.
 			String path = FileLocator.toFileURL(installDirectory).getPath();
+			if (relativeDir != null)
+				path += relativeDir;
 			String fixedPath = new File(path).getPath();
 			JavaCore.setClasspathVariable(variable, new Path(fixedPath), new NullProgressMonitor());
 		}
@@ -71,4 +84,11 @@
 			OTDTPlugin.getExceptionHandler().logException(ex);
 		}
 	}
+	
+	private static Bundle getBundle(String symbolicName) {
+		for (Bundle bundle : OTDTPlugin.getDefault().getBundle().getBundleContext().getBundles())
+			if (bundle.getSymbolicName().equals(symbolicName))
+				return bundle;
+		return null;
+	}
 }
diff --git a/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/hook/ClassScanner.java b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/hook/ClassScanner.java
index 0627ee6..9671c74 100644
--- a/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/hook/ClassScanner.java
+++ b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/hook/ClassScanner.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2008 Technical University Berlin, Germany.
+ * 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
@@ -24,8 +24,6 @@
 import java.util.List;
 
 import org.eclipse.objectteams.otequinox.internal.hook.Util;
-import org.eclipse.objectteams.otre.jplis.ObjectTeamsTransformer;
-import org.eclipse.objectteams.otre.util.CallinBindingManager;
 import org.osgi.framework.Bundle;
 
 /**
@@ -41,7 +39,8 @@
 	// default is "on", leave this switch for trouble shooting and profiling:
 	public static final boolean REPOSITORY_USE_RESOURCE_LOADER = !"off".equals(System.getProperty("otequinox.repository.hook"));
 
-	ObjectTeamsTransformer transformer = new ObjectTeamsTransformer();
+	// access to the OTRE
+	IOTTransformer transformerService;
 	
 	// collect class names recorded by readOTAttributes:
 	
@@ -52,6 +51,10 @@
 	ArrayList<String> roleClassNames = new ArrayList<String>();
 
 
+	public ClassScanner(IOTTransformer transformerService) {
+		this.transformerService = transformerService;
+	}
+
 	/** 
 	 * Read all OT byte code attributes for the specified class.
 	 * While doing so the names of roles and adapted base classes are collected.
@@ -71,8 +74,8 @@
 		URL classFile = bundle.getResource(className.replace('.', '/')+".class");
 		if (classFile == null) 
 			throw new ClassNotFoundException(className);
-		this.transformer.readOTAttributes(classFile.openStream(), classFile.getFile(), loader);
-		Collection<String> currentBaseNames = this.transformer.fetchAdaptedBases(); // destructive read
+		Object token = this.transformerService.readOTAttributes(classFile.openStream(), classFile.getFile(), loader);
+		Collection<String> currentBaseNames = this.transformerService.fetchAdaptedBases(token); // destructive read
 		if (currentBaseNames != null) {
 			// store per team:
 			ArrayList<String> basesPerTeam = this.baseClassNamesByTeam.get(className);
@@ -123,7 +126,7 @@
 										  String                 className, 
 										  ClassLoader			 resourceLoader)
 	{
-		List<String> roles = CallinBindingManager.getRolePerTeam(className);
+		List<String> roles = this.transformerService.getRolesPerTeam(className);
 		if (roles != null) {
 			ILogger logger = HookConfigurator.getLogger();
 			for (String roleName: roles) {
diff --git a/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/hook/IOTTransformer.java b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/hook/IOTTransformer.java
new file mode 100644
index 0000000..d7f9407
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/hook/IOTTransformer.java
@@ -0,0 +1,57 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * 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
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 		Stephan Herrmann - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otequinox.hook;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.instrument.ClassFileTransformer;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Service interface for access to the OTRE.
+ * @author stephan
+ * @since 0.7.0
+ */
+public interface IOTTransformer {
+	
+	/** Create a new instance of the OTRE transformer (of class org.eclipse.objectteams.otre.jplis.ObjectTeamsTransformer). */
+	ClassFileTransformer getNewTransformer();
+
+	/**
+	 * Read all OT-relevant bytecode attributes for a class.
+	 * @param openStream an opened input stream providing the class bytes
+	 * @param file       file name of the class file
+	 * @param loader	 class loader to use for subsequent class lookup
+	 * @return returns as a token the transformer which can be passed back to {@link #fetchAdaptedBases(Object)} for retrieving information found during scanning.
+	 */
+	Object readOTAttributes(InputStream openStream, String file, ClassLoader loader) throws ClassFormatError, IOException;
+
+	/**
+	 * Get all adapted base classes that were recorded during a prior call to {@link #readOTAttributes(InputStream, String, ClassLoader)}. 
+	 * @param token  the result return from the call to {@link #readOTAttributes(InputStream, String, ClassLoader)}
+	 * @return a collection of fully qualified names of bound base classes.
+	 */
+	Collection<String> fetchAdaptedBases(Object token);
+
+	/**
+	 * Retrieve the list of all roles from a given team 
+	 * @param teamClassName name of the team class
+	 * @return list of fully qualified role names (in attribute syntax using '.' and '$' delimiters)
+	 */
+	List<String> getRolesPerTeam(String teamClassName);
+}
diff --git a/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/OTEquinoxServiceWatcher.java b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/OTEquinoxServiceWatcher.java
index 0dc137b..295aedf 100644
--- a/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/OTEquinoxServiceWatcher.java
+++ b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/OTEquinoxServiceWatcher.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2007 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2007, 2010 Fraunhofer Gesellschaft, Munich, Germany,
  * for its Fraunhofer Institute for Computer Architecture and Software
  * Technology (FIRST), Berlin, Germany and Technical University Berlin,
  * Germany.
@@ -25,6 +25,7 @@
 import java.util.Properties;
 
 import org.eclipse.objectteams.otequinox.hook.IOTEquinoxService;
+import org.eclipse.objectteams.otequinox.hook.IOTTransformer;
 import org.eclipse.osgi.baseadaptor.BaseAdaptor;
 import org.eclipse.osgi.baseadaptor.hooks.AdaptorHook;
 import org.eclipse.osgi.framework.log.FrameworkLog;
@@ -67,6 +68,20 @@
 		catch (Exception ex) {
 			ex.printStackTrace();
 		}
+		transformerFilter = "(objectclass="+IOTTransformer.class.getName()+")";  //$NON-NLS-1$ //$NON-NLS-2$
+		//Add listener to listen for the registration of the OTRE service:
+		transformerListener = new ServiceListener() {
+			public void serviceChanged(ServiceEvent event) {
+				if(event.getType() == ServiceEvent.REGISTERED)
+					connectOTTransformerService(context);
+			}
+		};
+		try {
+			context.addServiceListener(transformerListener,transformerFilter);
+		}
+		catch (Exception ex) {
+			ex.printStackTrace();
+		}
 		ServiceReference ref= context.getServiceReference(PackageAdmin.class.getName());
 		if (ref!=null)
 			this.hook.connectPackageAdmin((PackageAdmin)context.getService(ref));
@@ -77,9 +92,14 @@
 		ServiceReference ref= context.getServiceReference(IOTEquinoxService.class.getName());
 		if (ref!=null)
 			this.hook.connectOTEquinoxService((IOTEquinoxService)context.getService(ref));
+	}	
+
+	private void connectOTTransformerService (BundleContext context) {
+		ServiceReference ref= context.getServiceReference(IOTTransformer.class.getName());
+		if (ref!=null)
+			this.hook.connectOTTransformerService((IOTTransformer)context.getService(ref));
 	}
 	
-	
 	/** 
 	 * Capture the system bundle at start-up:
 	 * (see {@link AdaptorHook#frameworkStart(BundleContext)}
diff --git a/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/TransformerHook.java b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/TransformerHook.java
index 87e86e9..aac5fe1 100644
--- a/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/TransformerHook.java
+++ b/plugins/org.eclipse.objectteams.otequinox.hook/src/org/eclipse/objectteams/otequinox/internal/hook/TransformerHook.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2004, 2009 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
  * for its Fraunhofer Institute for Computer Architecture and Software
  * Technology (FIRST), Berlin, Germany and Technical University Berlin,
  * Germany.
@@ -21,6 +21,7 @@
 package org.eclipse.objectteams.otequinox.internal.hook;
 
 import java.io.InputStream;
+import java.lang.instrument.ClassFileTransformer;
 import java.lang.instrument.IllegalClassFormatException;
 import java.net.URL;
 import java.security.ProtectionDomain;
@@ -51,9 +52,9 @@
 import org.eclipse.objectteams.otequinox.hook.IByteCodeAnalyzer;
 import org.eclipse.objectteams.otequinox.hook.ILogger;
 import org.eclipse.objectteams.otequinox.hook.IOTEquinoxService;
+import org.eclipse.objectteams.otequinox.hook.IOTTransformer;
 import org.eclipse.objectteams.otequinox.hook.ITeamLoader;
 import org.eclipse.objectteams.otequinox.internal.hook.Util.ProfileKind;
-import org.eclipse.objectteams.otre.jplis.ObjectTeamsTransformer;
 import org.osgi.framework.Bundle;
 import org.osgi.service.packageadmin.PackageAdmin;
 
@@ -179,6 +180,9 @@
 	// logging (console or via FrameworkLog):
 	final private ILogger logger;
 
+	// gateway to the OTRE proper:
+	private IOTTransformer transformerService;
+
 	final private HashSet<Bundle> uninstalling = new HashSet<Bundle>();
 	
 	// Class loaders for which initializedClassLoader is currently executing (usable, but not yet registered):
@@ -205,6 +209,11 @@
 		this.logger.log(Util.INFO, "OT/Equinox: connected the transformer service");
 	}
 	
+	/** Invoked when the TransformerPlugin has registered the OTRE as a service. */
+	void connectOTTransformerService(IOTTransformer transformerService) {
+		this.transformerService = transformerService;
+	}
+	
 	void connectPackageAdmin(PackageAdmin packageAdmin) {
 		this.packageAdmin = packageAdmin;
 	}
@@ -241,7 +250,7 @@
 			// on each invocation because the OTRE is _not_ thread safe, 
 			// specifically the field ObjectTeamsTransformation.factory 
 			// MUST NOT be accessed or even assigned concurrently.
-			ObjectTeamsTransformer objectTeamsTransformer= null;
+			ClassFileTransformer objectTeamsTransformer= null;
 
 			ClassLoader resourceLoader = null;
 			if (ClassScanner.REPOSITORY_USE_RESOURCE_LOADER)
@@ -253,13 +262,13 @@
 			ClassKind classKind= fetchTransformationKind(classbytes, name, resourceLoader, bundle);
 			if (Util.PROFILE) Util.profile(time, ProfileKind.SuperClassFetching, "", this.logger);
 			if (classKind == ClassKind.BASE) {
-				objectTeamsTransformer= new ObjectTeamsTransformer();
+				objectTeamsTransformer= this.transformerService.getNewTransformer();
 				classbytes= transformClass(objectTeamsTransformer, resourceLoader,
 										   name, classbytes, domain, 
 								           "potential base", ProfileKind.BaseTransformation);
 			// ==== loading a role class? 
 			} else if (classKind == ClassKind.ROLE) {
-				objectTeamsTransformer= new ObjectTeamsTransformer();
+				objectTeamsTransformer= this.transformerService.getNewTransformer();
 				classbytes= transformClass(objectTeamsTransformer, resourceLoader,
 										   name, classbytes, domain, 
 										   "role", ProfileKind.AspectTransformation); //$NON-NLS-1$
@@ -277,7 +286,7 @@
 						}
 						AspectBundleRole.markLoadingTeams(bundleRegistry, bundle.getSymbolicName(), true);
 						// transform the aspect:
-						objectTeamsTransformer= new ObjectTeamsTransformer();
+						objectTeamsTransformer= this.transformerService.getNewTransformer();
 						classbytes= transformClass(objectTeamsTransformer, resourceLoader,
 												   name, classbytes, domain, 
 												   "team", ProfileKind.AspectTransformation);				 //$NON-NLS-1$
@@ -289,7 +298,7 @@
 						   && WEAVE_BUNDLES.contains(bundle.getSymbolicName())
 						   && this.aspectRegistry.isAdaptedBasePlugin(bundle.getSymbolicName()))
 				{
-					objectTeamsTransformer= new ObjectTeamsTransformer();
+					objectTeamsTransformer= this.transformerService.getNewTransformer();
 					classbytes= transformClass(objectTeamsTransformer, resourceLoader,
 											   name, classbytes, domain, 
 									           "ordinary class (could be sub base class)", ProfileKind.BaseTransformation);
@@ -306,7 +315,7 @@
 	}
 
 	// transform, log and profile:
-	private byte[] transformClass(ObjectTeamsTransformer objectTeamsTransformer, ClassLoader resourceLoader,
+	private byte[] transformClass(ClassFileTransformer objectTeamsTransformer, ClassLoader resourceLoader,
 								  String name, byte[] classbytes, ProtectionDomain domain, 
 								  String kind, ProfileKind profileKind)
 			throws IllegalClassFormatException 
@@ -320,7 +329,7 @@
 	}
 	
 	// hook method, no specific action
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings("rawtypes")
 	public boolean addClassPathEntry(
 			ArrayList cpEntries, 
 			String cp,
@@ -452,7 +461,7 @@
 	private void checkLoadTeams(BaseClassLoader bundleClassLoader, Bundle bundle) 
 	{
 		this.pendingClassLoaders.put(bundle,bundleClassLoader);
-		ClassScanner scanner = new ClassScanner();
+		ClassScanner scanner = new ClassScanner(this.transformerService);
 		this.bundleRegistry.checkLoadTeams(bundle, this.aspectRegistry, this.teamLoadingService, scanner);
 		recordRolesAndBases(scanner);
 		this.pendingClassLoaders.remove(bundle);
@@ -520,7 +529,7 @@
 			// aspectRole needed to record 'aspectRole.isLoading' from processClass().
 			this.bundleRegistry.createAspectRole(bundle.getSymbolicName());
 			this.logger.log(Util.OK, "Will load internal teams of "+bundle.getSymbolicName());
-			ClassScanner scanner = new ClassScanner();
+			ClassScanner scanner = new ClassScanner(this.transformerService);
 			if (this.teamLoadingService.loadInternalTeams(bundle, scanner)) {
 				recordRolesAndBases(scanner);
 				BaseBundleRole baseRole= BaseBundleRole.createBaseBundleRole(bundleRegistry, bundle, bundle); // self-adapting
@@ -636,7 +645,7 @@
 	public URL postFindResource(String name, BundleClassLoader classLoader, BundleData data) {
 		return null;
 	}
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings("rawtypes")
 	public Enumeration postFindResources(String name, BundleClassLoader classLoader, BundleData data) {
 		return null;
 	}
@@ -646,7 +655,7 @@
 	public URL preFindResource(String name, BundleClassLoader classLoader, BundleData data) {
 		return null;
 	}
-	@SuppressWarnings("unchecked")
+	@SuppressWarnings("rawtypes")
 	public Enumeration preFindResources(String name, BundleClassLoader classLoader, BundleData data) {
 		return null;
 	}
diff --git a/plugins/org.eclipse.objectteams.otequinox.runtime/.classpath b/plugins/org.eclipse.objectteams.otequinox.runtime/.classpath
index 7cec603..3826cef 100644
--- a/plugins/org.eclipse.objectteams.otequinox.runtime/.classpath
+++ b/plugins/org.eclipse.objectteams.otequinox.runtime/.classpath
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
-	<classpathentry kind="output" path="bin"/>
+	<classpathentry exported="true" kind="lib" path="lib/BCEL.jar" sourcepath="/bcel-5.2/src/java"/>
+	<classpathentry exported="true" kind="lib" path="lib/otre.jar"/>
 </classpath>
diff --git a/plugins/org.eclipse.objectteams.otequinox.runtime/.project b/plugins/org.eclipse.objectteams.otequinox.runtime/.project
index e016377..2b6494e 100644
--- a/plugins/org.eclipse.objectteams.otequinox.runtime/.project
+++ b/plugins/org.eclipse.objectteams.otequinox.runtime/.project
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
-	<name>org.eclipse.objectteams.otequinox.runtime</name>
+	<name>org.eclipse.objectteams.runtime</name>
 	<comment></comment>
 	<projects>
 	</projects>
diff --git a/plugins/org.eclipse.objectteams.otequinox.runtime/META-INF/MANIFEST.MF b/plugins/org.eclipse.objectteams.otequinox.runtime/META-INF/MANIFEST.MF
index 7ed7141..6762f33 100644
--- a/plugins/org.eclipse.objectteams.otequinox.runtime/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.objectteams.otequinox.runtime/META-INF/MANIFEST.MF
@@ -1,10 +1,17 @@
 Manifest-Version: 1.0
 Bundle-ManifestVersion: 2
 Bundle-Name: OTRE OSGI Extension Bundle
-Bundle-SymbolicName: org.eclipse.objectteams.otequinox.runtime
-Bundle-Version: 1.4.0.qualifier
-Bundle-Vendor: objectteams.org
-Fragment-Host: org.eclipse.osgi;bundle-version="[3.6.0.v20090928,4.0.0)"
+Bundle-SymbolicName: org.eclipse.objectteams.runtime
+Bundle-Version: 0.7.0.qualifier
+Bundle-Vendor: Eclipse Object Teams Project
 Export-Package: org.objectteams,
- org.eclipse.objectteams.otre
+ org.eclipse.objectteams.otre,
+ org.eclipse.objectteams.otre.jplis,
+ org.eclipse.objectteams.otre.util,
+ org.apache.bcel,
+ org.apache.bcel.classfile,
+ org.apache.bcel.generic,
+ org.apache.bcel.util
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ClassPath: lib/BCEL.jar,
+ lib/otre.jar
diff --git a/plugins/org.eclipse.objectteams.otequinox.runtime/README.txt b/plugins/org.eclipse.objectteams.otequinox.runtime/README.txt
deleted file mode 100644
index 1ce681d..0000000
--- a/plugins/org.eclipse.objectteams.otequinox.runtime/README.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-Libraries used in this transformer.hook OSGI extension bundle can not be
-packaged as inner jar files (e.g. otre.jar and BCEL.jar), as OSGI does not
-know how to deal with those.
-
-See https://bugs.eclipse.org/bugs/show_bug.cgi?id=143283
\ No newline at end of file
diff --git a/plugins/org.eclipse.objectteams.otequinox.runtime/build.properties b/plugins/org.eclipse.objectteams.otequinox.runtime/build.properties
index a647fe0..434d732 100644
--- a/plugins/org.eclipse.objectteams.otequinox.runtime/build.properties
+++ b/plugins/org.eclipse.objectteams.otequinox.runtime/build.properties
@@ -1,8 +1,7 @@
 bin.includes = META-INF/,\
-               de/,\
-               gnu/,\
-               org/
+               lib/BCEL.jar,\
+               lib/otre.jar
 src.includes = build.properties,\
                README.txt,\
                .project,\
-               .classpath
+               .classpath
\ No newline at end of file
diff --git a/plugins/org.eclipse.objectteams.otequinox/META-INF/MANIFEST.MF b/plugins/org.eclipse.objectteams.otequinox/META-INF/MANIFEST.MF
index 38e210e..fbcbac9 100644
--- a/plugins/org.eclipse.objectteams.otequinox/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.objectteams.otequinox/META-INF/MANIFEST.MF
@@ -7,10 +7,10 @@
 Require-Bundle: org.eclipse.equinox.common,
  org.eclipse.equinox.registry,
  org.eclipse.osgi;bundle-version="[3.6.0.v20090928,4.0.0)",
- org.objectweb.asm;bundle-version="[3.1.0,4.0.0)"
+ org.objectweb.asm;bundle-version="[3.1.0,4.0.0)",
+ org.eclipse.objectteams.runtime;bundle-version="[0.7.0,1.0.0)";visibility:=reexport
 Import-Package: org.eclipse.core.internal.runtime;resolution:=optional,
- org.eclipse.objectteams.otequinox.hook,
- org.eclipse.objectteams.otre
+ org.eclipse.objectteams.otequinox.hook
 Bundle-Activator: org.eclipse.objectteams.otequinox.TransformerPlugin
 Export-Package: org.eclipse.objectteams.otequinox
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/TransformerPlugin.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/TransformerPlugin.java
index a6f8193..b41d417 100644
--- a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/TransformerPlugin.java
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/TransformerPlugin.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  * 
- * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2004, 2010 Fraunhofer Gesellschaft, Munich, Germany,
  * for its Fraunhofer Institute for Computer Architecture and Software
  * Technology (FIRST), Berlin, Germany and Technical University Berlin,
  * Germany.
@@ -37,12 +37,14 @@
 import org.eclipse.objectteams.otequinox.internal.AspectBinding;
 import org.eclipse.objectteams.otequinox.internal.AspectPermissionManager;
 import org.eclipse.objectteams.otequinox.internal.MasterTeamLoader;
+import org.eclipse.objectteams.otequinox.internal.TransformerServiceDelegate;
 import org.eclipse.objectteams.otequinox.hook.ClassScanner;
 import org.eclipse.objectteams.otequinox.hook.HookConfigurator;
 import org.eclipse.objectteams.otequinox.hook.IAspectRegistry;
 import org.eclipse.objectteams.otequinox.hook.IByteCodeAnalyzer;
 import org.eclipse.objectteams.otequinox.hook.ILogger;
 import org.eclipse.objectteams.otequinox.hook.IOTEquinoxService;
+import org.eclipse.objectteams.otequinox.hook.IOTTransformer;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
@@ -87,7 +89,8 @@
 	
 	/** The instance that is created by the framework. */
 	private static TransformerPlugin instance;
-	private ServiceRegistration serviceRegistration;
+	private ServiceRegistration serviceRegistration;  // IOTEquinoxService
+	private ServiceRegistration serviceRegistration2; // IOTTransformer
 	private ILogger log;
 	
 	/** instances which may have pending team classes waiting for instantiation. */
@@ -125,11 +128,13 @@
 		this.permissionManager.loadAspectBindingNegotiators(context);
 		loadAspectBindings();
 		this.serviceRegistration = context.registerService(IOTEquinoxService.class.getName(), this, new Properties());		
+		this.serviceRegistration2 = context.registerService(IOTTransformer.class.getName(), new TransformerServiceDelegate(), new Properties());		
 	}
 		
 	/* be a good citizen: clean up. */
 	public void stop(BundleContext context) throws Exception {
 		serviceRegistration.unregister();
+		serviceRegistration2.unregister();
 	}
 
 	public static TransformerPlugin getDefault() {
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/internal/TransformerServiceDelegate.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/internal/TransformerServiceDelegate.java
new file mode 100644
index 0000000..7918543
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/otequinox/internal/TransformerServiceDelegate.java
@@ -0,0 +1,79 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * 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
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 		Stephan Herrmann - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otequinox.internal;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.instrument.ClassFileTransformer;
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.objectteams.otre.jplis.ObjectTeamsTransformer;
+import org.eclipse.objectteams.otre.util.CallinBindingManager;
+
+import org.eclipse.objectteams.otequinox.hook.IOTTransformer;
+
+/**
+ * Service implementation for providing org.eclipse.objectteams.otequinox.hook with an
+ * access to the OTRE.
+ * 
+ * @author stephan
+ * @since 0.7.0
+ */
+public class TransformerServiceDelegate implements IOTTransformer {
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.objectteams.otequinox.hook.IOTTransformer#getNewTransformer()
+	 */
+	public ClassFileTransformer getNewTransformer() {
+		return new ObjectTeamsTransformer();
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.objectteams.otequinox.hook.IOTTransformer#readOTAttributes(java.io.InputStream, java.lang.String, java.lang.ClassLoader)
+	 */
+	public Object readOTAttributes(InputStream openStream, String file, ClassLoader loader) 
+			throws ClassFormatError, IOException 
+	{
+		ObjectTeamsTransformer transformer = new ObjectTeamsTransformer();
+		transformer.readOTAttributes(openStream, file, loader);
+		return transformer;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.objectteams.otequinox.hook.IOTTransformer#fetchAdaptedBases(java.lang.Object)
+	 */
+	public Collection<String> fetchAdaptedBases(Object token) {
+		try {
+			return ((ObjectTeamsTransformer)token).fetchAdaptedBases();
+		} catch (ClassCastException cce) {
+			throw new IllegalArgumentException("Provided token is not an ObjectTeamsTransformer");
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.objectteams.otequinox.hook.IOTTransformer#getRolesPerTeam(java.lang.String)
+	 */
+	public List<String> getRolesPerTeam(String teamClassName) {
+		return CallinBindingManager.getRolePerTeam(teamClassName);
+	}
+
+}