initial commit in accordance with CQ 3784
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/.classpath b/plugins/org.eclipse.objectteams.otdt.pde.ui/.classpath
new file mode 100644
index 0000000..987380a
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="OTRE"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/.project b/plugins/org.eclipse.objectteams.otdt.pde.ui/.project
new file mode 100644
index 0000000..e948e68
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/.project
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.objectteams.otdt.pde.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.objectteams.otdt.builder.OTJBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>org.objectteams.otdt.OTJavaNature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.objectteams.otdt.pde.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..14f0b6f
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,21 @@
+#Tue Sep 18 18:30:43 CEST 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.objectteams.otdt.compiler.option.joinpoint_queries=disabled
+org.objectteams.otdt.compiler.option.scoped_keywords=enabled
+org.objectteams.otdt.compiler.problem.abstract_potential_relevant_role=warning
+org.objectteams.otdt.compiler.problem.basecall=warning
+org.objectteams.otdt.compiler.problem.binding_conventions=error
+org.objectteams.otdt.compiler.problem.decapsulation=warning
+org.objectteams.otdt.compiler.problem.deprecated_path_syntax=warning
+org.objectteams.otdt.compiler.problem.effectless_fieldaccess=warning
+org.objectteams.otdt.compiler.problem.fragile_callin=warning
+org.objectteams.otdt.compiler.problem.incomplete_build=error
+org.objectteams.otdt.compiler.problem.inferred_callout=error
+org.objectteams.otdt.compiler.problem.potential_ambiguous_playedby=warning
+org.objectteams.otdt.compiler.problem.unsafe_liftctor=warning
+org.objectteams.otdt.compiler.problem.unused_parammap=warning
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.objectteams.otdt.pde.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..51c2222
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: OTPDEUI Plug-in
+Bundle-SymbolicName: org.eclipse.objectteams.otdt.pde.ui;singleton:=true
+Bundle-Version: 1.4.0.qualifier
+Bundle-Activator: org.eclipse.objectteams.otdt.internal.pde.ui.OTPDEUIPlugin
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.pde.ui,
+ org.eclipse.ui.ide,
+ org.eclipse.debug.core,
+ org.eclipse.debug.ui,
+ org.eclipse.jdt.core,
+ org.eclipse.objectteams.otdt,
+ org.eclipse.objectteams.otdt.debug,
+ org.eclipse.objectteams.otequinox,
+ org.eclipse.objectteams.otdt.ui,
+ org.eclipse.ui.forms,
+ org.eclipse.jdt.ui,
+ org.eclipse.search,
+ org.eclipse.pde.api.tools.ui;bundle-version="1.0.200"
+Bundle-ActivationPolicy: lazy
+Bundle-Localization: plugin
+Bundle-Vendor: The TOPPrax consortium
+Export-Package: org.eclipse.objectteams.otdt.internal.pde.ui
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/build.properties b/plugins/org.eclipse.objectteams.otdt.pde.ui/build.properties
new file mode 100644
index 0000000..cff4459
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/build.properties
@@ -0,0 +1,11 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               plugin.xml,\
+               icons/,\
+               .,\
+               plugin.properties
+src.includes = .classpath,\
+               .project,\
+               build.properties,\
+               plugin.properties
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/icons/ot/newotpprj_obj.gif b/plugins/org.eclipse.objectteams.otdt.pde.ui/icons/ot/newotpprj_obj.gif
new file mode 100644
index 0000000..98fb8a0
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/icons/ot/newotpprj_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/icons/ot/plugin_forcedExports.png b/plugins/org.eclipse.objectteams.otdt.pde.ui/icons/ot/plugin_forcedExports.png
new file mode 100644
index 0000000..677e9b4
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/icons/ot/plugin_forcedExports.png
Binary files differ
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/icons/ot/wizard/newotpprj_wiz.png b/plugins/org.eclipse.objectteams.otdt.pde.ui/icons/ot/wizard/newotpprj_wiz.png
new file mode 100644
index 0000000..a4cdb81
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/icons/ot/wizard/newotpprj_wiz.png
Binary files differ
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/plugin.properties b/plugins/org.eclipse.objectteams.otdt.pde.ui/plugin.properties
new file mode 100644
index 0000000..b3162b8
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/plugin.properties
@@ -0,0 +1,5 @@
+# wizard:
+new.OTPluginProject.description=Create an Object Teams Plug-in Project
+
+# context menu:
+menu.addOTSupport.label=Add Object Teams support
\ No newline at end of file
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/plugin.xml b/plugins/org.eclipse.objectteams.otdt.pde.ui/plugin.xml
new file mode 100644
index 0000000..cc0b0d5
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/plugin.xml
@@ -0,0 +1,122 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.2"?>
+<plugin>
+   
+   <!-- === Wizard: === --> 
+   <extension
+         point="org.eclipse.ui.newWizards">
+      <wizard
+            category="org.eclipse.objectteams.otdt.ui.wizards"
+            class="org.eclipse.objectteams.otdt.internal.pde.ui.OTNewPluginProjectWizard"
+            finalPerspective="org.eclipse.objectteams.otdt.ui.OTJavaPerspective"
+            icon="icons/ot/newotpprj_obj.gif"
+            id="org.eclipse.objectteams.otdt.pde.ui.wizards.OTNewPluginProjectWizard"
+            name="Object Teams Plug-in Project "
+            preferredPerspectives="org.eclipse.objectteams.otdt.ui.OTJavaPerspective"
+            project="true">
+          <description>
+          	%new.OTPluginProject.description
+          </description>
+      </wizard>
+   </extension>
+   
+   <!-- === Aspects: === -->
+   <extension
+         point="org.eclipse.objectteams.otequinox.aspectBindings">
+      <aspectBinding
+            icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/calloutbinding_obj.gif">
+         <basePlugin id="org.eclipse.pde.ui"
+               icon="platform:/plugin/org.eclipse.pde.ui/icons/obj16/plugin_obj.gif"/>
+         <team
+               activation="NONE"
+               class="org.eclipse.objectteams.otdt.internal.pde.ui.OTPluginDependenciesAdapter"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif"/>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.pde.ui.ExtensionEditorAdaptor"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.pde.validation.BundleValidation"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+      </aspectBinding>
+      <aspectBinding
+            icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/calloutbinding_obj.gif">
+         <basePlugin
+               icon="platform:/plugin/org.eclipse.pde.ui/icons/obj16/plugin_obj.gif"
+               id="org.eclipse.pde.core">
+         </basePlugin>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.pde.ui.ClasspathComputerAdapter"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.pde.validation.BundleValidation"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.pde.ui.PackageExplorerAdaptor"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+      </aspectBinding>
+      <aspectBinding
+            icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/calloutbinding_obj.gif">
+         <basePlugin
+               icon="platform:/plugin/org.eclipse.pde.ui/icons/obj16/plugin_obj.gif"
+               id="org.eclipse.jdt.ui">
+         </basePlugin>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.pde.ui.PackageExplorerAdaptor"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+      </aspectBinding>
+      <aspectBinding
+            icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/calloutbinding_obj.gif">
+         <basePlugin
+               icon="platform:/plugin/org.eclipse.pde.ui/icons/obj16/plugin_obj.gif"
+               id="org.eclipse.pde.api.tools.ui">
+         </basePlugin>
+         <team
+               activation="ALL_THREADS"
+               class="org.eclipse.objectteams.otdt.internal.pde.ui.ApiToolsAdapter"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
+      </aspectBinding>
+   </extension>
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            adaptable="true"
+            id="org.eclipse.objectteams.otdt.pde.ui.objectContribution1"
+            nameFilter="*"
+            objectClass="org.eclipse.core.resources.IProject">
+         <action
+               class="org.eclipse.objectteams.otdt.internal.pde.ui.ToggleOTSupportAction"
+               enablesFor="+"
+               id="org.eclipse.objectteams.otdt.pde.ui.toggleOTSupportAction"
+               label="%menu.addOTSupport.label"
+               menubarPath="org.eclipse.ui.projectConfigure/additions">
+         </action>
+         <visibility>
+            <and>
+               <objectState
+                     name="projectNature"
+                     value="org.eclipse.jdt.core.javanature">
+               </objectState>
+               <not>
+                  <objectState
+                        name="projectNature"
+                        value="org.eclipse.objectteams.otdt.OTJavaNature">
+                  </objectState>
+               </not>
+            </and>
+         </visibility>
+      </objectContribution>
+   </extension>
+</plugin>
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ApiToolsAdapter.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ApiToolsAdapter.java
new file mode 100644
index 0000000..a24b78c
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ApiToolsAdapter.java
@@ -0,0 +1,38 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * 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
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * 	Stephan Herrmann - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import org.eclipse.objectteams.otdt.core.IOTJavaElement;
+
+import base org.eclipse.pde.api.tools.ui.internal.JavaElementActionFilter;
+
+@SuppressWarnings("restriction")
+public team class ApiToolsAdapter {
+	
+	/** Protect one more hard coded switch-case against unexpected OT elements. */
+	protected class FilterAdaptor playedBy JavaElementActionFilter {
+
+		testAttribute <- replace testAttribute;
+
+		callin boolean testAttribute(Object target) {
+			if (target instanceof IOTJavaElement)
+				// treat OT elements via their java correspondence:
+				target = ((IOTJavaElement)target).getCorrespondingJavaElement();
+			return base.testAttribute(target);
+		}
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/AspectBindingsTreeNode.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/AspectBindingsTreeNode.java
new file mode 100644
index 0000000..a4fdb54
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/AspectBindingsTreeNode.java
@@ -0,0 +1,128 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * 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
+ * $Id: AspectBindingsTreeNode.java 23470 2010-02-05 19:13:24Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Stephan Herrmann - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.objectteams.otequinox.Constants;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.core.plugin.IPluginObject;
+import org.eclipse.pde.internal.core.plugin.PluginElement;
+
+/** 
+ * Nodes for representing aspect bindings in the package explorer.
+ * @author stephan
+ * @since 1.3.2
+ */
+@SuppressWarnings("restriction")
+public abstract class AspectBindingsTreeNode {
+	IJavaProject javaProject;
+}
+
+// ========== follows: concrete subclasses ==========
+
+	class AspectBindingsRootNode extends AspectBindingsTreeNode
+	{
+		static final String ASPECT_BINDINGS_NAME = "OT/Equinox Aspect Bindings";
+		protected IPluginModelBase pluginModel;
+		public AspectBindingsRootNode(IJavaProject javaProject, IPluginModelBase pluginModel) {
+			this.javaProject = javaProject;
+			this.pluginModel = pluginModel;
+		}
+		@Override
+		public String toString() {
+			return "~"+ASPECT_BINDINGS_NAME; // prepend "~" to make sorting a bit more deterministic, should we encounter CUDs at toplevel
+		}
+	}
+	
+	/** Represents the aspect bindings for one base plugin. */
+	@SuppressWarnings("restriction")
+	class BasePluginNode extends AspectBindingsTreeNode
+	{
+		protected String basePlugin;
+		boolean hasForcedExports = false; 
+		PluginElement element;
+		Object[] teams = null;
+		
+		public BasePluginNode(IJavaProject javaProject, PluginElement element) {
+			this.javaProject = javaProject;
+			this.element = element;
+			for (IPluginObject child : element.getChildren()) {
+				if (child instanceof PluginElement) {
+					if (Constants.BASE_PLUGIN.equals(child.getName())) {
+						this.basePlugin = ((PluginElement)child).getAttribute("id").getValue();
+						for (IPluginObject subChild : ((PluginElement)child).getChildren())
+							if (Constants.FORCED_EXPORTS_ELEMENT.equals(((PluginElement)subChild).getName()))
+								this.hasForcedExports = true;
+						break;
+					}
+				}
+			}
+		}
+		/** Add the teams of other to this node. */
+		protected void merge(BasePluginNode other) {
+			Object[] myTeams = getTeams();
+			Object[] otherTeams = other.getTeams();
+			int l1=myTeams.length, l2=otherTeams.length;
+			teams = new Object[l1+l2];
+			System.arraycopy(myTeams, 0, this.teams, 0, l1);
+			System.arraycopy(otherTeams, 0, this.teams, l1, l2);
+		}
+		/** Get all teams adapting the base plugin represented by this node. */
+		protected Object[] getTeams() {
+			if (this.teams != null)
+				return this.teams;
+			List<Object> teams = new ArrayList<Object>();
+			for (IPluginObject child : element.getChildren())
+				if (child instanceof PluginElement)
+					if (Constants.TEAM.equals(child.getName()))
+						teams.add(new TeamNode(this.javaProject, 
+											   ((PluginElement)child).getAttribute("class").getValue()));
+			return this.teams = teams.toArray();
+		}
+		protected Object getPluginXml() {
+			return this.javaProject.getProject().findMember("plugin.xml");
+		}
+	}
+	/**
+	 * Handle to a team referenced in an aspect binding, 
+	 * supports on demand resolving to an IType.
+	 */
+	class TeamNode extends AspectBindingsTreeNode
+	{
+		protected String teamName;
+	
+		protected TeamNode(IJavaProject javaProject, String teamName) {
+			this.javaProject = javaProject;
+			this.teamName = teamName;
+		}
+
+		protected IType getTeamType() {
+			try {
+				return this.javaProject.findType(this.teamName);
+			} catch (JavaModelException e) {
+				OTPDEUIPlugin.getDefault().getLog().log(
+					OTPDEUIPlugin.createErrorStatus("OpenAction: Cannot resolve team type '"+this.teamName+"'", e));
+				return null;
+			}
+		}
+	}
+
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ClasspathComputerAdapter.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ClasspathComputerAdapter.java
new file mode 100644
index 0000000..ca63f70
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ClasspathComputerAdapter.java
@@ -0,0 +1,89 @@
+/**********************************************************************

+ * This file is part of "Object Teams Development Tooling"-Software

+ * 

+ * Copyright 2008 Technical University Berlin, Germany.

+ * 

+ * All rights reserved. This program and the accompanying materials

+ * are made available under the terms of the Eclipse Public License v1.0

+ * which accompanies this distribution, and is available at

+ * http://www.eclipse.org/legal/epl-v10.html

+ * $Id$

+ * 

+ * Please visit http://www.eclipse.org/objectteams for updates and contact.

+ * 

+ * Contributors:

+ * Technical University Berlin - Initial API and implementation

+ **********************************************************************/

+package org.eclipse.objectteams.otdt.internal.pde.ui;

+

+import org.eclipse.core.resources.IProject;

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IPath;

+import org.eclipse.core.runtime.NullProgressMonitor;

+import org.eclipse.jdt.core.IClasspathEntry;

+import org.eclipse.jdt.core.IJavaProject;

+import org.eclipse.jdt.core.JavaCore;

+import org.eclipse.objectteams.otdt.core.ext.OTJavaNature;

+import org.eclipse.objectteams.otdt.core.ext.OTREContainer;

+import org.eclipse.pde.core.plugin.IPluginModelBase;

+import org.eclipse.pde.internal.core.PDECore;

+

+import base org.eclipse.pde.internal.core.ClasspathComputer;

+

+/**

+ * This team handles classpath updating issues

+ * @author mosconi

+ * @since 1.2.4

+ */

+@SuppressWarnings("restriction")

+public team class ClasspathComputerAdapter {

+	protected class ClasspathComputer playedBy ClasspathComputer {

+		

+		// re-add OTRE container for OT plug-in projects:

+		static void updateOTClasspath(IProject project) throws CoreException {

+			OTREContainer.initializeOTJProject(project);

+			sortClasspathEntries(project);

+		}

+		void updateOTClasspath(IProject project) <- after void setClasspath(IProject project, IPluginModelBase model)

+			when (OTJavaNature.hasOTJavaNature(project));		

+	}

+	

+	/** 

+	 * Make sure OTRE comes before requiredPlugins on the project's classpath.

+	 * This is needed to ensure that org.objectteams.Team is accessible.

+	 * When a project finds a dependent plugin which depends on otequinox,

+	 * Team will be found via that project leading to an error because Team is

+	 * not re-exported from an OT plugin project.

+	 * @throws CoreException 

+	 */

+	public static void sortClasspathEntries(IProject project) throws CoreException {

+		IJavaProject javaProject= (IJavaProject) project.getNature(JavaCore.NATURE_ID);

+		IClasspathEntry[] entries= javaProject.getRawClasspath();

+		IClasspathEntry[] newEntries= new IClasspathEntry[entries.length];

+		IClasspathEntry requiredPlugins= null;

+		int newOTREPos= -1;

+		int j=0; // index into newEntries

+		for (int i = 0; i < entries.length; i++) {

+			if (entries[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER) {

+				IPath containerPath= entries[i].getPath();

+				if (containerPath.equals(PDECore.REQUIRED_PLUGINS_CONTAINER_PATH)) {

+					requiredPlugins= entries[i];// store intermediate

+					newOTREPos= j++; // leave empty slot in newEntries

+					continue;

+				} else if (containerPath.segment(0).equals(OTREContainer.OTRE_CONTAINER_NAME)) {

+					if (newOTREPos>-1)

+						newEntries[newOTREPos]= entries[i];

+					else 

+						return; // requiredPlugins was not found before OTRE

+					continue;

+				}

+			}

+			newEntries[j++]= entries[i];

+		}

+		if (newOTREPos > -1 && requiredPlugins != null && j<newEntries.length) {

+			newEntries[j]= requiredPlugins;

+			javaProject.setRawClasspath(newEntries, new NullProgressMonitor());

+		}

+	}

+

+}

diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ExtensionEditorAdaptor.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ExtensionEditorAdaptor.java
new file mode 100644
index 0000000..dd9896e
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ExtensionEditorAdaptor.java
@@ -0,0 +1,354 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007, 2009 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: ExtensionEditorAdaptor.java 23470 2010-02-05 19:13:24Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaConventions;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.SearchEngine;
+import org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner;
+import org.eclipse.jdt.internal.core.search.HierarchyScope;
+import org.eclipse.jdt.ui.IJavaElementSearchConstants;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jdt.ui.wizards.NewTypeWizardPage;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.pde.core.plugin.IPluginAttribute;
+import org.eclipse.pde.core.plugin.IPluginBase;
+import org.eclipse.pde.core.plugin.IPluginElement;
+import org.eclipse.pde.core.plugin.IPluginExtension;
+import org.eclipse.pde.internal.core.ischema.IMetaAttribute;
+import org.eclipse.pde.internal.core.ischema.ISchema;
+import org.eclipse.pde.internal.core.ischema.ISchemaAttribute;
+import org.eclipse.pde.internal.core.ischema.ISchemaElement;
+import org.eclipse.pde.internal.core.plugin.PluginAttribute;
+import org.eclipse.pde.internal.core.schema.SchemaRegistry;
+import org.eclipse.pde.internal.core.util.IdUtil;
+import org.eclipse.pde.internal.core.util.PDEJavaHelper;
+import org.eclipse.pde.internal.ui.PDEPlugin;
+import org.eclipse.pde.internal.ui.PDEUIMessages;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.SelectionDialog;
+import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
+import org.eclipse.objectteams.otdt.internal.ui.wizards.NewTeamWizardPage;
+import org.eclipse.objectteams.otdt.internal.ui.wizards.OTNewWizardMessages;
+import org.eclipse.objectteams.otdt.ui.ImageManager;
+import org.eclipse.objectteams.otdt.ui.OTDTUIPlugin;
+import org.eclipse.objectteams.otequinox.Constants;
+
+import base org.eclipse.pde.internal.ui.editor.plugin.ExtensionsSection;
+import base org.eclipse.pde.internal.ui.editor.plugin.JavaAttributeWizard;
+import base org.eclipse.pde.internal.ui.editor.plugin.rows.ClassAttributeRow;
+import base org.eclipse.pde.internal.ui.editor.text.XMLUtil;
+
+/**
+ * This team anticipates some fixes regarding the extension editor.
+ * 
+ * @author stephan
+ */
+@SuppressWarnings({"restriction","decapsulation"})
+public team class ExtensionEditorAdaptor 
+{
+	// role for XMLInsertionComputer obsoleted by patch in https://bugs.eclipse.org/bugs/show_bug.cgi?id=195763
+	
+	/* avoid to use the icon attribute for the label, too. */
+	protected class ExtensionsSection playedBy ExtensionsSection 
+	{
+		String resolveObjectName(SchemaRegistry schemaRegistry, Object obj) <- replace String resolveObjectName(SchemaRegistry schemaRegistry, Object obj);
+		@SuppressWarnings("basecall")
+		callin static String resolveObjectName(SchemaRegistry schemaRegistry, Object obj) {
+			boolean fullNames = PDEPlugin.isFullNameModeEnabled();
+			if (obj instanceof IPluginExtension) {
+				IPluginExtension extension = (IPluginExtension) obj;
+				if (!fullNames) {
+					return extension.getPoint();
+				}
+				if (extension.getName() != null)
+					return extension.getTranslatedName();
+				ISchema schema = schemaRegistry.getSchema(extension.getPoint());
+				// try extension point schema definition
+				if (schema != null) {
+					// exists
+					return schema.getName();
+				}
+				return extension.getPoint();		
+			} else if (obj instanceof IPluginElement) {
+				IPluginElement element = (IPluginElement) obj;
+				String baseName = element.getName();			
+				String fullName = null;
+				ISchemaElement elementInfo = getSchemaElement(element);
+				IPluginAttribute labelAtt = null;
+				if (elementInfo != null && elementInfo.getLabelProperty() != null) {
+					labelAtt = element.getAttribute(elementInfo.getLabelProperty());
+				}
+				if (labelAtt == null) {
+					// try some hard-coded attributes that
+					// are used frequently
+					for (int i = 0; i < getCOMMON_LABEL_PROPERTIES().length; i++) {
+						labelAtt = element.getAttribute(getCOMMON_LABEL_PROPERTIES()[i]);
+						if (labelAtt != null)
+							break;
+					}
+					if (labelAtt == null) {
+						// Last try - if there is only one attribute,
+						// use that
+						if (element.getAttributeCount() == 1)
+							labelAtt = element.getAttributes()[0];
+//{ObjectTeams: not if it the icon property:
+						if (isIconAttribute(labelAtt))
+							labelAtt = null;
+// SH}
+					}
+				}
+				if (labelAtt != null && labelAtt.getValue() != null)
+					fullName = stripShortcuts(labelAtt.getValue());
+				fullName = element.getResourceString(fullName);
+				if (fullNames)
+					return fullName != null ? fullName : baseName;
+				return fullName != null
+				? (fullName + " (" + baseName + ")") //$NON-NLS-1$ //$NON-NLS-2$
+						: baseName;
+			}
+			return obj.toString();
+		}
+		private static boolean isIconAttribute(IPluginAttribute labelAtt) {
+			if (labelAtt == null || labelAtt.getName() == null)
+				return false;
+			if (!labelAtt.getName().equals("icon"))  //$NON-NLS-1$
+				return false;
+			if (labelAtt instanceof PluginAttribute) {
+				PluginAttribute attribute = (PluginAttribute) labelAtt;
+				ISchemaAttribute info = attribute.getAttributeInfo();
+				if (info != null)
+					return info.getKind() == IMetaAttribute.RESOURCE;
+			}
+			return true; 
+		}
+		String[] getCOMMON_LABEL_PROPERTIES() -> get String[] COMMON_LABEL_PROPERTIES;
+		ISchemaElement getSchemaElement(IPluginElement element) -> ISchemaElement getSchemaElement(IPluginElement element);
+		String stripShortcuts(String input) -> String stripShortcuts(String input);
+	}
+	/**
+	 * This role anticipates a fix to https://bugs.eclipse.org/bugs/show_bug.cgi?id=61185
+	 * Restricting type selection dialogs for extension details to the 'basedOn' type, if given.
+	 * Although bug 61185 is partly fixed, this role also covers bug 215139.
+	 */
+	protected class ClassAttributeRow playedBy ClassAttributeRow 
+	{
+		IPluginBase getPluginBase() -> IPluginBase getPluginBase();
+		Text getText() -> get Text text;
+		
+		doOpenSelectionDialog <- replace doOpenSelectionDialog;
+		@SuppressWarnings("basecall")
+		callin void doOpenSelectionDialog() {
+			String superType= null;
+			try {
+				ISchemaAttribute att= getAttribute();
+				superType= att.getBasedOn();
+			} catch (Throwable t) {
+				// e.g., a CCE in getAttribute()?
+			}
+			if (superType != null && superType.startsWith(":")) //$NON-NLS-1$
+				superType= superType.substring(1);
+			if (superType == null || "java.lang.Object".equals(superType)) { //$NON-NLS-1$
+				// if no useful super type was found do the normal thing:
+				base.doOpenSelectionDialog();
+				return;
+			}
+			IResource resource = getPluginBase().getModel().getUnderlyingResource();
+			String type = selectType(
+					resource, 
+					IJavaElementSearchConstants.CONSIDER_CLASSES_AND_INTERFACES, 
+					getText().getText(),
+					superType);
+			if (type != null)
+				getText().setText(type);
+		}
+		ISchemaAttribute getAttribute() -> get Object att
+			with { result <- (ISchemaAttribute)att }
+		
+		// from PDEJavaHelperUI, added param supertype
+		static String selectType(IResource resource, int scope, String filter, String superTypeName) 
+		{
+			if (resource == null) return null;
+			IProject project = resource.getProject();
+			try {
+				// create new scope (hierarchy):
+				IJavaSearchScope searchScope = null;
+				if (superTypeName != null && !superTypeName.equals("java.lang.Object")) { //$NON-NLS-1$
+					IJavaProject javaProject = JavaCore.create(project);
+					IType superType = javaProject.findType(superTypeName);
+					if (superType != null)
+						searchScope= SearchEngine.createHierarchyScope(javaProject, superType, true, true, DefaultWorkingCopyOwner.PRIMARY);
+					/* Eclipse version:
+						searchScope = SearchEngine.createHierarchyScope(superType);
+				     */
+				}
+				if (searchScope == null)
+					searchScope = PDEJavaHelper.getSearchScope(project);
+				
+				SelectionDialog dialog = JavaUI.createTypeDialog(
+						PDEPlugin.getActiveWorkbenchShell(),
+						PlatformUI.getWorkbench().getProgressService(),
+						searchScope,
+						//orig: PDEJavaHelper.getSearchScope(project),
+						scope, 
+						false, "**"/*filter*/);  //$NON-NLS-1$
+				dialog.setTitle(PDEUIMessages.ClassAttributeRow_dialogTitle); 
+				if (dialog.open() == Window.OK) {
+					IType type = (IType) dialog.getResult()[0];
+					return type.getFullyQualifiedName('$');
+				}
+			} catch (JavaModelException e) {
+			}
+			return null;
+		}
+	}
+
+	/**
+	 * This role adapts the PDE/UI's version of a NewTypeWizard as to use our
+	 * NewTeamWizardPage when appropriate.
+	 * 
+	 * @since 1.2.4
+	 */
+	protected class JavaAttributeWizard playedBy JavaAttributeWizard 
+			base when (base.fAttInfo != null && isBasedOnOOTeam(base.fAttInfo)) 
+	{
+		static boolean isBasedOnOOTeam(ISchemaAttribute attInfo) {
+			String basedOn = attInfo.getBasedOn();
+			if (basedOn == null)
+				return false;
+			return basedOn.equals(String.valueOf(IOTConstants.STR_ORG_OBJECTTEAMS_TEAM));
+		}
+
+		String getFClassName() 							-> get String fClassName;
+		IProject getFProject() 							-> get IProject fProject;
+		void setFMainPage(NewTypeWizardPage fMainPage)  -> set NewTypeWizardPage fMainPage;
+		void addPage(IWizardPage arg0) 				    -> void addPage(IWizardPage arg0);
+		
+		void addNewTeamWizardPage() <- replace void addPages();
+		
+		@SuppressWarnings("basecall")
+		callin void addNewTeamWizardPage() {
+			// use a new team wizard:
+			NewTeamWizardPage mainPage = new NewTeamWizardPage();
+			
+			// init similar to base method:
+			setFMainPage(mainPage);
+			addPage(mainPage);
+			mainPage.init(null);
+			
+			// since our wizard doesn't handle attribute info these inits are different:
+			initFields(mainPage, getFClassName(), getFProject());
+		}
+
+		void initFields(NewTeamWizardPage mainPage, String className, IProject project) 
+		{
+			// set package and class names:
+			int loc = className.lastIndexOf('.');
+			if (loc != -1) {
+				mainPage.setPackageFragmentName(className.substring(0, loc));
+				mainPage.setTypeName(className.substring(loc+1));
+			} else {
+				mainPage.setTypeName(className);
+			}
+			
+			// set source folder (in the vein of org.eclipse.pde.internal.ui.editor.plugin.JavaAttributeWizardPage):
+			IPackageFragmentRoot srcEntryDft = null;
+			IJavaProject javaProject = JavaCore.create(project);
+			IPackageFragmentRoot[] roots;
+			try {
+				roots = javaProject.getPackageFragmentRoots();
+				for (int i = 0; i < roots.length; i++) {
+					if (roots[i].getKind() == IPackageFragmentRoot.K_SOURCE) {
+						srcEntryDft = roots[i];
+						break;
+					}
+				}
+			} catch (JavaModelException e) {
+				// can't find source folder
+			}
+			if (srcEntryDft != null)
+				mainPage.setPackageFragmentRoot(srcEntryDft, true);
+			else
+				mainPage.setPackageFragmentRoot(javaProject.getPackageFragmentRoot(javaProject.getResource()), true);
+		}
+
+		// window title
+		void setWindowTitle(String newTitle) <- replace void setWindowTitle(String newTitle);
+
+		callin void setWindowTitle(String newTitle) {
+			base.setWindowTitle(OTNewWizardMessages.NewTeamCreationWizard_title);
+		}
+
+		// header image
+		void setDefaultPageImageDescriptor(ImageDescriptor imageDescriptor) 
+			<- replace void setDefaultPageImageDescriptor(ImageDescriptor imageDescriptor);
+		callin void setDefaultPageImageDescriptor(ImageDescriptor imageDescriptor) 
+		{
+			base.setDefaultPageImageDescriptor(OTDTUIPlugin.getDefault().getImageRegistry().getDescriptor(ImageManager.NEW_TEAM));
+		}		
+	}
+	
+	/** This role makes sure that the PDE UI does not invent names that are illegal in their respective context. */
+	protected class XMLUtil playedBy XMLUtil {
+
+		/**
+		 *  If the project name makes an illegal package name, 
+		 *  and if the lower-cased class name is not legal either,
+		 *  try appending 's' until it is legal.
+		 *  (this occurred when the project name contained '-' and 
+		 *  the class name was "Team" -> "team" is an illegal package name.
+		 */
+		String createDefaultPackageName(IProject project) <- replace String createDefaultPackageName(IProject project, String className);
+
+		static callin String createDefaultPackageName(IProject project) {
+			String result = base.createDefaultPackageName(project);
+			IJavaProject javaProject = JavaCore.create(project);
+			String optionSrc = javaProject.getOption(JavaCore.COMPILER_SOURCE,true);
+			String optionCompliance = javaProject.getOption(JavaCore.COMPILER_COMPLIANCE, true);
+			IStatus valid;
+			while (true) {
+				valid = JavaConventions.validatePackageName(result, optionSrc, optionCompliance);
+				if (valid.isOK())
+					return result;
+				result += 's';
+			}
+		}
+
+		/** 
+		 * When generating a value for "basePlugin":
+		 * if the project name contains illegal characters like '-' convert it to a valid bundle ID. 
+		 */
+		String createDefaultName() <- replace String createDefaultName(IProject project, ISchemaAttribute attInfo, int counter)
+			base when (Constants.BASE_PLUGIN.equals(attInfo.getParent().getName()));
+
+		static callin String createDefaultName() {
+			return IdUtil.getValidId(base.createDefaultName());
+		}		
+		
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ImageManager.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ImageManager.java
new file mode 100644
index 0000000..333c74b
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ImageManager.java
@@ -0,0 +1,59 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007 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: DebugUIDialogAdaptor2.java 18886 2008-08-17 14:37:14Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+
+
+/**
+ * Provide cached access to images of this plugin.
+ * 
+ * @author stephan
+ * @since 1.0.0
+ */
+public class ImageManager extends org.eclipse.objectteams.otdt.ui.ImageManager {
+
+	private static ImageManager _singleton;
+
+	/**
+	 * Avoid multiple instances
+	 */
+	protected ImageManager() {}
+
+	/**
+	 * The only way to access plugin images
+	 * @return PluginImages instance
+	 */
+	public static ImageManager getSharedInstance() {
+		if (_singleton == null)
+			_singleton = new ImageManager();
+		
+		return _singleton;
+	}
+	
+	// overriding causes paths to be resolved relative to this plug-in.
+	@Override
+	protected AbstractUIPlugin getPlugin() {
+		return OTPDEUIPlugin.getDefault();
+	}
+	
+	// specify which icons to register:
+	@Override
+	protected String[] pluginIcons() {
+		return new String[]{ OTNewPluginProjectWizard.NEW_OTPDE_PROJECT, PackageExplorerAdaptor.PLUGIN_FORCED_EXPORTS };
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTEquinoxCommonLaunching.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTEquinoxCommonLaunching.java
new file mode 100644
index 0000000..742981b
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTEquinoxCommonLaunching.java
@@ -0,0 +1,83 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: OTEquinoxCommonLaunching.java 23470 2010-02-05 19:13:24Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Fraunhofer FIRST - Initial API and implementation
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.debug.core.ILaunchManager;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.objectteams.otdt.debug.OTDebugPlugin;
+import org.eclipse.objectteams.otdt.debug.TeamBreakpointInstaller;
+
+/**
+ * Shared implementation of OTEclipseApplicationLaunchConfiguration and OTEquinoxLaunchConfiguration
+ * 
+ * @author stephan
+ * @since OTDT 1.1.3
+ */
+public class OTEquinoxCommonLaunching 
+{
+	static final String HOOK_CONFIGURATOR = "-Dosgi.hook.configurators.include=org.eclipse.objectteams.otequinox.hook.HookConfigurator";//$NON-NLS-1$
+	static final String CLASSLOADER_LOCKING = "-Dosgi.classloader.lock=classname"; //$NON-NLS-1$
+	static final String REPOSITORY_WORKAROUND = "-Dot.equinox"; //$NON-NLS-1$ // this causes the WORKAROUND_REPOSITORY flag being set to true in OTRE.
+	static final String OT_DEBUG_VMARG = "-Dot.debug"; //$NON-NLS-1$
+	static final String[] OT_VM_ARGS = { HOOK_CONFIGURATOR, CLASSLOADER_LOCKING, REPOSITORY_WORKAROUND };
+	static final String[] OT_VM_DEBUG_ARGS = { HOOK_CONFIGURATOR, CLASSLOADER_LOCKING, REPOSITORY_WORKAROUND, OT_DEBUG_VMARG };
+
+	static String[] extendVMArguments(String[] args, String mode) {
+		String[] otArgs = OT_VM_ARGS;
+		if (mode != null && mode.equals(ILaunchManager.DEBUG_MODE))
+			otArgs = OT_VM_DEBUG_ARGS;
+	
+		if (args == null || args.length == 0)
+			return otArgs;
+	
+		String[] combinedArgs = new String[args.length + otArgs.length];
+		System.arraycopy(args, 0, combinedArgs, 0, args.length);
+		System.arraycopy(otArgs, 0, combinedArgs, args.length, otArgs.length);
+		return combinedArgs;
+	}
+	
+	static void installOOTBreakpoints(IProject[] projects)
+			throws CoreException 
+	{
+		IJavaProject jp = null;
+		if (projects != null) {
+			for (IProject project : projects) {
+				// find org.objectteams.Team in any OT/J Project:
+				if (project.getNature(JavaCore.OTJ_NATURE_ID) != null) {
+					jp = JavaCore.create(project);
+					TeamBreakpointInstaller.installTeamBreakpoints(jp);
+					break;
+				}
+			}
+		}
+		if (jp == null)
+			OTDebugPlugin.getDefault().getLog().log(
+					new Status(Status.WARNING, 
+							   OTPDEUIPlugin.PLUGIN_ID, 
+							   0, 
+							   OTPDEUIMessages.NoOTJPluginProject, 
+							   null));
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTNewPluginProjectWizard.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTNewPluginProjectWizard.java
new file mode 100644
index 0000000..b4470b8
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTNewPluginProjectWizard.java
@@ -0,0 +1,88 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2009 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$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Fraunhofer FIRST - Initial API and implementation
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.pde.internal.ui.wizards.plugin.NewPluginProjectWizard;
+import org.eclipse.pde.internal.ui.wizards.plugin.NewProjectCreationPage;
+
+/**
+ * Wizard to create a plug-in project with OT/Equinox enabled (classpath, plugin dependency).
+ * @author resix
+ */
+@SuppressWarnings("restriction")
+public class OTNewPluginProjectWizard extends NewPluginProjectWizard {
+
+	static final String NEW_OTPDE_PROJECT = "wizard/newotpprj_wiz.png"; //$NON-NLS-1$
+
+	public OTNewPluginProjectWizard() {
+		super();
+        setDefaultPageImageDescriptor(OTPDEUIPlugin.getDefault().getImageRegistry().getDescriptor(NEW_OTPDE_PROJECT));
+		setWindowTitle(OTPDEUIMessages.NewOTPProjectWizard_title); 
+	}
+	
+	@Override
+	public void addPages() {
+		super.addPages();
+		IWizardPage mainPage= getPage("main"); //$NON-NLS-1$
+		if (mainPage != null)
+			mainPage.setTitle(OTPDEUIMessages.NewOTPProjectWizard_MainPage_title); 
+	}
+
+	public boolean performFinish()
+	{ 
+		within (new OTPluginDependenciesAdapter()) {
+			if (!super.performFinish()) {
+				return false;
+			}
+		}
+	
+		IWizardPage fMainPage = getPage("main");  //$NON-NLS-1$
+		if (fMainPage instanceof NewProjectCreationPage)
+		{
+			IProject project = ((NewProjectCreationPage)fMainPage).getProjectHandle();
+			
+			try
+			{
+				OTPluginProject.makeOTPlugin(project);
+				ClasspathComputerAdapter.sortClasspathEntries(project);
+				return true;
+			}
+			catch (CoreException ex)
+			{
+				ErrorDialog.openError(getShell(), 
+									  OTPDEUIMessages.OTNewPluginProjectWizard_ProjectCreationError, 
+									  OTPDEUIMessages.OTNewPluginProjectWizard_CantAddOTSpecifics, 
+									  ex.getStatus());
+				OTPDEUIPlugin.getDefault().getLog().log(OTPDEUIPlugin.createErrorStatus("Project creation error", ex));
+			}
+		}
+		else
+			assert(false); // something changed in superclass, we must adapt to
+    	  	
+    	
+		return false;
+	}
+
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPDEUIMessages.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPDEUIMessages.java
new file mode 100644
index 0000000..ae451e1
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPDEUIMessages.java
@@ -0,0 +1,40 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2007, 2009 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: OTPDEUIMessages.java 23470 2010-02-05 19:13:24Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class OTPDEUIMessages extends NLS 
+{
+	private static final String BUNDLE_NAME = OTPDEUIMessages.class.getName();
+
+
+	public static String NewOTPProjectWizard_title;
+	public static String NewOTPProjectWizard_MainPage_title;
+	
+	public static String NoOTJPluginProject;
+	
+	public static String OTNewPluginProjectWizard_CantAddOTSpecifics;
+	public static String OTNewPluginProjectWizard_ProjectCreationError;
+
+	public static String Validation_MissingActivationPolicy_error;
+	public static String Resolution_AddBundleActivationPolicy_label;
+	
+	static {
+		NLS.initializeMessages(BUNDLE_NAME, OTPDEUIMessages.class);
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPDEUIMessages.properties b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPDEUIMessages.properties
new file mode 100644
index 0000000..a6d72dc
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPDEUIMessages.properties
@@ -0,0 +1,10 @@
+NewOTPProjectWizard_title= New OT-Plugin Project Wizard
+NewOTPProjectWizard_MainPage_title= New Object Teams Plug-in Project
+
+NoOTJPluginProject=No OT/J plug-in project found, debug functionality not fully available.
+
+OTNewPluginProjectWizard_ProjectCreationError=Project creation errror
+OTNewPluginProjectWizard_CantAddOTSpecifics=Error adding Object Teams specifics to new project
+
+Validation_MissingActivationPolicy_error=Aspect bindings may only be effective if Bundle-ActivationPolicy is set
+Resolution_AddBundleActivationPolicy_label=Set header "Bundle-ActivationPolicy" to "lazy".
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPDEUIPlugin.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPDEUIPlugin.java
new file mode 100644
index 0000000..7b67b6c
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPDEUIPlugin.java
@@ -0,0 +1,88 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id$
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Fraunhofer FIRST - Initial API and implementation
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class OTPDEUIPlugin extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.objectteams.otdt.internal.pde.ui"; //$NON-NLS-1$
+
+	// The shared instance
+	private static OTPDEUIPlugin plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public OTPDEUIPlugin() {
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static OTPDEUIPlugin getDefault() {
+		return plugin;
+	}
+
+	public static IStatus createErrorStatus(String message, Throwable ex)
+	{
+		return new Status(IStatus.ERROR, PLUGIN_ID, IStatus.OK, message, ex);
+	}
+	
+
+    /**
+     * Add Object Teams flavoured images to the image registry.
+     */
+    protected void initializeImageRegistry(ImageRegistry reg)
+    {
+    	ImageManager.getSharedInstance().registerPluginImages(reg);    	
+    }
+
+
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPluginDependenciesAdapter.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPluginDependenciesAdapter.java
new file mode 100644
index 0000000..e1f87db
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPluginDependenciesAdapter.java
@@ -0,0 +1,69 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: OTPluginDependenciesAdapter.java 23470 2010-02-05 19:13:24Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Fraunhofer FIRST - Initial API and implementation
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import org.eclipse.objectteams.otequinox.Constants;
+import org.eclipse.pde.core.plugin.IPluginReference;
+import org.eclipse.pde.ui.templates.PluginReference;
+
+import base org.eclipse.pde.internal.ui.wizards.plugin.PluginClassCodeGenerator;
+
+/**
+ * Note that this team must be mentioned in plugin.xml (aspectBinding),
+ * although it is not instantiated/activated globally, but only
+ * temporarily during OTNewPluginProjectWizard.performFinish().
+ * 
+ * @author gis
+ */
+@SuppressWarnings("restriction")
+public team class OTPluginDependenciesAdapter
+{
+	public class PluginClassCodeGeneratorAdapter playedBy PluginClassCodeGenerator
+	{
+		private final IPluginReference TRANSFORMER = new PluginReference(Constants.TRANSFORMER_PLUGIN_ID, null, 0);
+
+		/**
+		 * Returns Object Teams specific plugin dependencies additionally to the default
+		 * plugin dependencies.
+		 */
+		callin IPluginReference[] getDependencies()
+		{
+			IPluginReference[] deps = base.getDependencies();
+			for (IPluginReference dependency : deps) {
+				if (dependency.equals(TRANSFORMER))
+					return deps; // already included				
+			}
+			IPluginReference[] extraDeps = new IPluginReference[] { TRANSFORMER };
+			return mergeArrays(deps, extraDeps);
+		}
+
+		IPluginReference[] mergeArrays(IPluginReference[] deps, IPluginReference[] extraDeps)
+		{
+			IPluginReference[] newDeps = new IPluginReference[deps.length + extraDeps.length];
+			System.arraycopy(deps, 0, newDeps, 0, deps.length);
+			System.arraycopy(extraDeps, 0, newDeps, deps.length, extraDeps.length);
+			
+			return newDeps;
+		}
+		
+		IPluginReference[] getDependencies() <- replace IPluginReference[] getDependencies();
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPluginProject.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPluginProject.java
new file mode 100644
index 0000000..0e53a16
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/OTPluginProject.java
@@ -0,0 +1,70 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * for its Fraunhofer Institute for Computer Architecture and Software
+ * Technology (FIRST), Berlin, Germany and Technical University Berlin,
+ * Germany.
+ * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * $Id: OTPluginProject.java 23470 2010-02-05 19:13:24Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Fraunhofer FIRST - Initial API and implementation
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.objectteams.otdt.core.ext.OTDTPlugin;
+import org.eclipse.objectteams.otdt.core.ext.OTREContainer;
+
+public class OTPluginProject
+{
+	public static void makeOTPlugin(IProject project) throws CoreException
+	{
+		addOTNatureAndBuilder(project);
+		OTREContainer.initializeOTJProject(project);
+		// require base-imports for base classes per default:
+		IJavaProject javaProject = JavaCore.create(project);
+		String value = javaProject.getOption(OTDTPlugin.OT_COMPILER_BINDING_CONVENTIONS, true);
+		if (!value.equals(JavaCore.ERROR))
+			javaProject.setOption(OTDTPlugin.OT_COMPILER_BINDING_CONVENTIONS, JavaCore.ERROR);
+	}
+
+	public static void addOTNatureAndBuilder(IProject project) throws CoreException
+	{
+		IProjectDescription prjDesc = project.getDescription();
+		prjDesc.setNatureIds(OTDTPlugin.createProjectNatures(prjDesc));
+		ICommand[] buildSpecs = prjDesc.getBuildSpec();
+		prjDesc.setBuildSpec(replaceOrAddOTBuilder(prjDesc, buildSpecs));
+		project.setDescription(prjDesc, null);
+	}
+
+	private static ICommand[] replaceOrAddOTBuilder(IProjectDescription prjDesc, ICommand[] buildSpecs) 
+	{
+		ICommand otBuildCmd = OTDTPlugin.createProjectBuildCommand(prjDesc);
+		// replace existing Java builder?
+		for(int i=0; i<buildSpecs.length; i++) {
+			if (buildSpecs[i].getBuilderName().equals(JavaCore.BUILDER_ID)) {
+				buildSpecs[i] = otBuildCmd;
+				return buildSpecs;
+			}
+		}
+		// not found, add to front:
+		int len = buildSpecs.length;
+		System.arraycopy(buildSpecs, 0, buildSpecs = new ICommand[len+1], 1, len);
+		buildSpecs[0] = otBuildCmd;
+		return buildSpecs;
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/PackageExplorerAdaptor.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/PackageExplorerAdaptor.java
new file mode 100644
index 0000000..6d4faaf
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/PackageExplorerAdaptor.java
@@ -0,0 +1,399 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * 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
+ * $Id: PackageExplorerAdaptor.java 23470 2010-02-05 19:13:24Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Stephan Herrmann - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.ui;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.StyledString;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.objectteams.otequinox.Constants;
+import org.eclipse.pde.core.plugin.IExtensions;
+import org.eclipse.pde.core.plugin.IPluginExtension;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.core.plugin.IPluginObject;
+import org.eclipse.pde.core.plugin.ISharedExtensionsModel;
+import org.eclipse.pde.core.plugin.ISharedPluginModel;
+import org.eclipse.pde.internal.core.PDECore;
+import org.eclipse.pde.internal.core.PluginModelManager;
+import org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase;
+import org.eclipse.pde.internal.core.plugin.PluginElement;
+import org.eclipse.pde.internal.core.text.IDocumentAttributeNode;
+import org.eclipse.pde.internal.ui.PDELabelProvider;
+import org.eclipse.pde.internal.ui.PDEPlugin;
+import org.eclipse.pde.internal.ui.PDEPluginImages;
+import org.eclipse.pde.internal.ui.editor.plugin.ExtensionsPage;
+import org.eclipse.pde.internal.ui.editor.plugin.ManifestEditor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IPartListener;
+import org.eclipse.ui.IPartService;
+import org.eclipse.ui.IWorkbenchPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+import base org.eclipse.jdt.internal.ui.packageview.PackageExplorerContentProvider;
+import base org.eclipse.jdt.internal.ui.packageview.PackageExplorerLabelProvider;
+import base org.eclipse.jdt.ui.JavaElementComparator;
+import base org.eclipse.jdt.ui.actions.OpenAction;
+import base org.eclipse.pde.internal.core.text.plugin.PluginElementNode;
+
+/**
+ * This team adds rendering for an "Aspect Bindings" subtree for each OT/Equinox project.
+ * @author stephan
+ * @since 1.3.2
+ */
+@SuppressWarnings("restriction")
+public team class PackageExplorerAdaptor 
+{
+	
+	/** Icon for base plugin with forced exports. */
+	static final String PLUGIN_FORCED_EXPORTS = "plugin_forcedExports.png"; //$NON-NLS-1$
+
+	protected class ContentProvider playedBy PackageExplorerContentProvider {
+
+		@SuppressWarnings("decapsulation")
+		TreeViewer getViewer() -> get TreeViewer fViewer;
+
+		Object[] getChildren(Object parentElement) <- replace Object[] getChildren(Object parentElement);
+
+		callin Object[] getChildren(Object parentElement) {
+			Object[] result = base.getChildren(parentElement);
+			if (parentElement instanceof IJavaProject) {
+				// may want to add an "OT/Equinox Aspect Bindings" node to the project:
+				PluginModelManager modelManager = PDECore.getDefault().getModelManager();
+				IJavaProject javaProject = (IJavaProject)parentElement;
+				IPluginModelBase pluginModel = modelManager.findModel(javaProject.getProject());
+				if (pluginModel != null) {
+					if (hasAspectBindings(pluginModel)) {
+						List<Object> combined = new ArrayList<Object>(Arrays.asList(result));
+						combined.add(createAspectBindingsNode(javaProject, pluginModel));
+						return combined.toArray();
+					}
+				}
+				// no plugin.xml or no aspect bindings, wait for changes re plugin.xml
+				ResourcesPlugin.getWorkspace().addResourceChangeListener(new AspectBindingsRefresher(javaProject, null, getViewer()));
+			}
+			if (parentElement instanceof AspectBindingsRootNode) {
+				// this is the "OT/Equinox Aspect Bindings" node, fill it with BasePluginNodes
+				AspectBindingsRootNode aspectBindingsNode = (AspectBindingsRootNode)parentElement;
+				IExtensions extensions = aspectBindingsNode.pluginModel.getExtensions();
+				if (extensions != null) {
+					List<Object> bases = new ArrayList<Object>();
+					Map<String, BasePluginNode> perBaseBindings = new HashMap<String, BasePluginNode>();
+					for (IPluginExtension extension : extensions.getExtensions())
+						if(extension.getPoint().equals(Constants.ASPECT_BINDING_FQEXTPOINT_ID))
+							for (IPluginObject element : extension.getChildren())
+								if (element instanceof PluginElement) {
+									PluginElement pluginElement = (PluginElement) element;
+									BasePluginNode node = new BasePluginNode(aspectBindingsNode.javaProject, pluginElement);
+									// collate multiple bindings for the same base plugin:
+									if (perBaseBindings.containsKey(node.basePlugin)) {
+										perBaseBindings.get(node.basePlugin).merge(node);
+									} else {
+										bases.add(node);
+										perBaseBindings.put(node.basePlugin, node);
+									}
+								}
+
+					return bases.toArray();
+				}
+			}
+			if (parentElement instanceof BasePluginNode) {
+				// fill the BasePluginNode with its adapting teams
+				return ((BasePluginNode)parentElement).getTeams();
+			}
+			return result;
+		}
+		
+		AspectBindingsRootNode createAspectBindingsNode (final IJavaProject javaProject, IPluginModelBase pluginModel) {
+			final AspectBindingsRootNode aspectBindings = new AspectBindingsRootNode(javaProject, pluginModel);
+			ResourcesPlugin.getWorkspace().addResourceChangeListener(new AspectBindingsRefresher(javaProject, aspectBindings, getViewer()));
+			return aspectBindings;
+		}		
+	}
+
+	/** Does the given plugin have an aspectBindings extension? */
+	boolean hasAspectBindings (IPluginModelBase pluginModel) {
+		IExtensions extensions = pluginModel.getExtensions();
+		for (IPluginExtension extension : extensions.getExtensions())
+			if(extension.getPoint().equals(Constants.ASPECT_BINDING_FQEXTPOINT_ID))
+				return true;
+		return false;
+	}
+
+	/** This class is responsible for any updates on aspectBindings in a project's plugin.xml. */
+	protected class AspectBindingsRefresher implements IResourceChangeListener {
+		IJavaProject javaProject;
+		AspectBindingsRootNode aspectBindings;
+		TreeViewer viewer;
+		
+		protected AspectBindingsRefresher(IJavaProject javaProject, AspectBindingsRootNode aspectBindings, TreeViewer viewer) {
+			this.javaProject = javaProject;
+			this.aspectBindings = aspectBindings;
+			this.viewer = viewer;
+		}
+		public void resourceChanged(IResourceChangeEvent event) {
+			if (aspectBindings != null)
+				refreshAspectBindings(event);
+			else 
+				detectPluginXmlChanges(event.getDelta());
+		}
+		/* Aspect bindings are present, may need to be refreshed or removed. */
+		void refreshAspectBindings(IResourceChangeEvent event) {
+			IResourceDelta delta = event.getDelta();
+			if (delta != null)
+				delta = delta.findMember(this.javaProject.getPath().append("plugin.xml"));
+			if (delta != null) {
+				if (this.viewer == null || this.viewer.getControl().isDisposed() || !this.javaProject.isOpen()) {
+					ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+					return;
+				}
+				final Object elementToRefresh;
+				if ((delta.getKind() & IResourceDelta.REMOVED) != 0) {
+					elementToRefresh = this.javaProject;
+				} else {
+					PluginModelManager modelManager = PDECore.getDefault().getModelManager();
+					if (hasAspectBindings(modelManager.findModel(javaProject.getProject())))
+						elementToRefresh = this.aspectBindings;
+					else
+						elementToRefresh = this.javaProject;
+				}
+				Display.getDefault().asyncExec(new Runnable() { public void run() {
+					AspectBindingsRefresher.this.viewer.refresh(elementToRefresh);
+				}});
+				// during project refresh, getChildren will create a new listener
+				if (elementToRefresh == this.javaProject)
+					ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+			} else if (event.getType() == IResourceChangeEvent.PRE_CLOSE) {
+				if (event.getResource().equals(javaProject.getProject()))
+					ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+			}			
+		}
+		/* Aspect bindings are not yet present, wait for an event that could signal addition of aspect bindings. */
+		void detectPluginXmlChanges(IResourceDelta delta) {
+			if (delta != null)
+				delta = delta.findMember(this.javaProject.getPath().append("plugin.xml"));
+			if (delta != null) {
+				// this listener is done:
+				ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+				
+				if (this.viewer == null || this.viewer.getControl().isDisposed() || !javaProject.isOpen())
+					return;
+
+				Display.getDefault().asyncExec(new Runnable() { public void run() {
+					AspectBindingsRefresher.this.viewer.refresh(AspectBindingsRefresher.this.javaProject);
+				}});
+			}
+		}
+	}
+
+	/** 
+	 * This role renders the elements of an "Aspect Bindings" subtree.
+	 */
+	protected class LabelProvider playedBy PackageExplorerLabelProvider {
+		
+		PDELabelProvider pdeLabelProvider;
+
+		// ---------- Lifecycle: ---------- 
+
+		// constructor:
+		@SuppressWarnings("ambiguouslowering")
+		LabelProvider(PackageExplorerLabelProvider baseLabelProvider) {
+			this.pdeLabelProvider = PDEPlugin.getDefault().getLabelProvider();
+			pdeLabelProvider.connect(this);
+		}
+		
+		// finalizer:
+		@Override
+		@SuppressWarnings("ambiguouslowering")
+		protected void finalize() {
+			if (this.pdeLabelProvider != null) {
+				this.pdeLabelProvider.disconnect(this);
+				this.pdeLabelProvider = null;
+			}
+		}
+		// second trigger for finalizer:
+		finalize <- after dispose;
+		
+		// ---------- Domain behavior: ----------
+		
+		StyledString getStyledText(Object element) 
+		<- replace StyledString getStyledText(Object element);
+
+		@SuppressWarnings("basecall")
+		callin StyledString getStyledText(Object element)
+		{
+			if (element instanceof AspectBindingsRootNode)
+				return new StyledString(AspectBindingsRootNode.ASPECT_BINDINGS_NAME);
+			
+			if (element instanceof BasePluginNode)
+				return new StyledString("Base Plugin "+((BasePluginNode)element).basePlugin);
+			
+			if (element instanceof TeamNode)
+				return new StyledString(((TeamNode)element).teamName);
+			
+			return base.getStyledText(element);
+		}
+
+		Image getImage(Object element) <- replace Image getImage(Object element);
+
+
+		@SuppressWarnings("basecall")
+		callin Image getImage(Object element) 
+		{
+			if (element instanceof AspectBindingsRootNode)
+				return org.eclipse.objectteams.otdt.ui.ImageManager.getSharedInstance().get(ImageManager.CALLOUTBINDING_IMG);
+			
+			if (element instanceof BasePluginNode) {
+				if (((BasePluginNode)element).hasForcedExports)
+					return ImageManager.getSharedInstance().get(PLUGIN_FORCED_EXPORTS);
+				return pdeLabelProvider.get(PDEPluginImages.DESC_PLUGIN_OBJ);
+			}
+			
+			if (element instanceof TeamNode)
+				return org.eclipse.objectteams.otdt.ui.ImageManager.getSharedInstance().get(ImageManager.TEAM_IMG);
+			
+			return base.getImage(element);
+		}
+	}
+	
+	/** 
+	 * sort the "Aspect Bindings" node below the list of package fragment roots,
+	 * by pretending it were a compilation unit
+	 */
+	protected class Comparator playedBy JavaElementComparator {
+
+		@SuppressWarnings("decapsulation")
+		int getCOMPILATIONUNITS() -> get int COMPILATIONUNITS;
+		
+		final int COMPILATIONUNITS;
+		Comparator(JavaElementComparator b) {
+			COMPILATIONUNITS = getCOMPILATIONUNITS();
+		}
+
+		int category(Object element) <- replace int category(Object element)
+			base when (element instanceof AspectBindingsRootNode);
+
+		@SuppressWarnings("basecall")
+		callin int category(Object element) {
+			return COMPILATIONUNITS;
+		}
+		
+	}
+	
+	protected class Open playedBy OpenAction {
+
+		@SuppressWarnings("decapsulation")
+		boolean checkEnabled(IStructuredSelection selection) <- replace boolean checkEnabled(IStructuredSelection selection);
+
+		@SuppressWarnings("unchecked") // selection.iterator() is raw type
+		callin boolean checkEnabled(IStructuredSelection selection) {
+			if (base.checkEnabled(selection))
+				return true;
+			// similar to base method:
+			if (selection.isEmpty())
+				return false;
+			for (Iterator iter= selection.iterator(); iter.hasNext();) {
+				Object element= iter.next();
+				if (element instanceof BasePluginNode)
+					continue;
+				if (element instanceof TeamNode)
+					continue;
+				return false;
+			}
+			return true;
+		}
+
+		Object getNodeToOpen(Object object) <- replace Object getElementToOpen(Object object) 
+			base when (object instanceof AspectBindingsTreeNode);
+
+		@SuppressWarnings("basecall")
+		callin Object getNodeToOpen(Object object) {
+			if (object instanceof BasePluginNode) {
+				registerListener(((BasePluginNode)object));
+				return ((BasePluginNode)object).getPluginXml();
+			}
+			if (object instanceof TeamNode)
+				return ((TeamNode)object).getTeamType();
+			return object;
+		}
+		/** register a listener for deferred selection of the current base plugin element within the extension editor. */
+		void registerListener (final BasePluginNode node) {
+			IWorkbenchWindow[] windows= PlatformUI.getWorkbench().getWorkbenchWindows();
+			for (int i= 0, length= windows.length; i < length; i++) {
+				final IPartService partService = windows[i].getPartService();
+				partService.addPartListener(new IPartListener() {
+					public void partOpened(IWorkbenchPart part) 		{ /* nop */ }
+					public void partDeactivated(IWorkbenchPart part) 	{ /* nop */ }
+					public void partClosed(IWorkbenchPart part) 		{ /* nop */ }
+					public void partBroughtToTop(IWorkbenchPart part) 	{ /* nop */ }
+					
+					public void partActivated(IWorkbenchPart part) {
+						selectBaseNode(node, part);
+						partService.removePartListener(this); // immediately remove: this is a one-shot listener
+					}
+				});
+			}
+		}
+		void selectBaseNode(BasePluginNode node, IWorkbenchPart part) {
+			if (part instanceof ManifestEditor) {
+				ManifestEditor editor = (ManifestEditor) part;
+				ExtensionsPage page = (ExtensionsPage) editor.setActivePage(ExtensionsPage.PAGE_ID);
+				ISharedExtensionsModel extensions = ((IBundlePluginModelBase)page.getModel()).getExtensionsModel();
+				for (BasePluginNodeInterceptor viewNode : getAllRoles(BasePluginNodeInterceptor.class))
+					if (   extensions == viewNode.getModel()		// only nodes of this editor's model
+					    && node.basePlugin.equals(viewNode.basePluginName))
+						page.selectReveal(viewNode.lower());
+			}
+		}
+	}
+	/** This role intercepts reading of PluginElementNodes that represent a basePlugin element of an aspect binding. */
+	protected class BasePluginNodeInterceptor implements ILowerable playedBy PluginElementNode 
+	{
+		ISharedPluginModel getModel() -> ISharedPluginModel getModel();
+
+		protected String basePluginName;
+
+		// this callin filters applicable base objects
+		void register(String tag) <- after void setXMLTagName(String tag)
+			base when ("basePlugin".equals(tag));
+
+		private void register(String tag) {
+			// nop, just registered this role
+		}
+
+		// this callin collects further information from registered base objects:
+		void setXMLAttribute(IDocumentAttributeNode attribute) <- after void setXMLAttribute(IDocumentAttributeNode attribute)
+			base when (hasRole(base, BasePluginNodeInterceptor.class));
+		
+		void setXMLAttribute(IDocumentAttributeNode attribute) {
+			if ("id".equals(attribute.getAttributeName()))
+				this.basePluginName = attribute.getAttributeValue();
+		}
+	}
+}
diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ToggleOTSupportAction.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ToggleOTSupportAction.java
new file mode 100644
index 0000000..ac5191b
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/ui/ToggleOTSupportAction.java
@@ -0,0 +1,136 @@
+/**********************************************************************

+ * This file is part of "Object Teams Development Tooling"-Software

+ * 

+ * Copyright 2009 Technical University Berlin.

+ * 

+ * 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:

+ * Marco Mosconi - Initial API and implementation

+ **********************************************************************/

+package org.eclipse.objectteams.otdt.internal.pde.ui;

+

+import org.eclipse.core.resources.IProject;

+import org.eclipse.core.resources.IProjectDescription;

+import org.eclipse.core.runtime.CoreException;

+import org.eclipse.core.runtime.IAdaptable;

+import org.eclipse.jdt.core.JavaCore;

+import org.eclipse.jface.action.IAction;

+import org.eclipse.jface.dialogs.ErrorDialog;

+import org.eclipse.jface.viewers.ISelection;

+import org.eclipse.jface.viewers.IStructuredSelection;

+import org.eclipse.objectteams.otdt.core.ext.OTREContainer;

+import org.eclipse.pde.core.plugin.IPluginBase;

+import org.eclipse.pde.core.plugin.IPluginImport;

+import org.eclipse.pde.core.plugin.IPluginReference;

+import org.eclipse.pde.internal.core.ICoreConstants;

+import org.eclipse.pde.internal.core.bundle.WorkspaceBundlePluginModel;

+import org.eclipse.pde.internal.core.natures.PDE;

+import org.eclipse.pde.internal.core.plugin.WorkspacePluginModelBase;

+import org.eclipse.pde.ui.templates.PluginReference;

+import org.eclipse.swt.widgets.Shell;

+import org.eclipse.ui.IObjectActionDelegate;

+import org.eclipse.ui.IWorkbenchPart;

+

+/**

+ * Action to add (TBD: or remove) OT support on projects.

+ * To be invoked via the "Configure" context-menu in Package Explorer.

+ * @author mosconi

+ * @since 1.3.2

+ */

+@SuppressWarnings("restriction")

+public class ToggleOTSupportAction implements IObjectActionDelegate {

+

+	private Shell shell;

+	private ISelection selection;

+	

+	/* (non-Javadoc)

+	 * @see org.eclipse.ui.IObjectActionDelegate#setActivePart(org.eclipse.jface.action.IAction, org.eclipse.ui.IWorkbenchPart)

+	 */

+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {

+		shell = targetPart.getSite().getShell();

+	}

+

+	/* (non-Javadoc)

+	 * @see org.eclipse.ui.IActionDelegate#selectionChanged(org.eclipse.jface.action.IAction, org.eclipse.jface.viewers.ISelection)

+	 */

+	public void selectionChanged(IAction action, ISelection selection) {

+		this.selection = selection;

+	}

+	

+	/* (non-Javadoc)

+	 * @see org.eclipse.ui.IActionDelegate#run(org.eclipse.jface.action.IAction)

+	 */

+	public void run(IAction action) {

+		if (!(selection instanceof IStructuredSelection))

+			return;

+		for (Object element : ((IStructuredSelection) selection).toArray()) {

+			IProject project = null;

+			if (element instanceof IProject) {

+				project = (IProject) element;

+			}

+			else if (element instanceof IAdaptable) {

+				project = (IProject) ((IAdaptable) element).getAdapter(IProject.class);

+			}

+			if (project != null) {

+				toggleOTSupport(project);

+			}

+		}

+	}

+

+	private void toggleOTSupport(IProject project)  {

+		try {

+			IProjectDescription description = project.getDescription();

+			if (description.hasNature(JavaCore.OTJ_NATURE_ID)) {

+				removeOTSupport(project);

+			}

+			else {

+				addOTSupport(project);

+			}

+		}

+		catch (CoreException e) {

+			ErrorDialog.openError(shell, "Project Configuration Error", "Error Configuring Project " + project.getName() + ".", e.getStatus());

+			OTPDEUIPlugin.getDefault().getLog().log(OTPDEUIPlugin.createErrorStatus("Project configuration error", e));

+		}

+	}

+

+	/**

+	 * Adds OT/J nature, builder, and dependencies to the given project

+	 */

+	private void addOTSupport(IProject project) throws CoreException {

+		OTPluginProject.addOTNatureAndBuilder(project);

+		if (PDE.hasPluginNature(project)) {

+			// add plug-in dependency to org.eclipse.objectteams.otequinox:

+			WorkspacePluginModelBase fModel = new WorkspaceBundlePluginModel(

+					project.getFile(ICoreConstants.BUNDLE_FILENAME_DESCRIPTOR),

+					project.getFile(ICoreConstants.PLUGIN_FILENAME_DESCRIPTOR));

+			IPluginBase pluginBase = fModel.getPluginBase();

+			IPluginReference ref = new PluginReference(

+					"org.eclipse.objectteams.otequinox", null, 0);

+			IPluginImport iimport = fModel.getPluginFactory().createImport();

+			iimport.setId(ref.getId());

+			iimport.setVersion(ref.getVersion());

+			iimport.setMatch(ref.getMatch());

+			pluginBase.add(iimport);

+			fModel.save();

+		}

+		OTREContainer.initializeOTJProject(project);

+		if (PDE.hasPluginNature(project)) {

+			ClasspathComputerAdapter.sortClasspathEntries(project);

+		}

+	}

+

+	/**

+	 * Removes OT/J nature, builder, and dependencies from the given project

+	 */

+	private void removeOTSupport(IProject project) throws CoreException {

+		//TODO: yet to be implemented (also needs additional hooking in plugin.xml)

+	}

+

+}

diff --git a/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/validation/BundleValidation.java b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/validation/BundleValidation.java
new file mode 100644
index 0000000..9eea644
--- /dev/null
+++ b/plugins/org.eclipse.objectteams.otdt.pde.ui/src/org/eclipse/objectteams/otdt/internal/pde/validation/BundleValidation.java
@@ -0,0 +1,202 @@
+/**********************************************************************
+ * This file is part of "Object Teams Development Tooling"-Software
+ * 
+ * Copyright 2009 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: BundleValidation.java 23470 2010-02-05 19:13:24Z stephan $
+ * 
+ * Please visit http://www.eclipse.org/objectteams for updates and contact.
+ * 
+ * Contributors:
+ * Technical University Berlin - Initial API and implementation
+ **********************************************************************/
+package org.eclipse.objectteams.otdt.internal.pde.validation;
+
+import static org.eclipse.objectteams.otequinox.Constants.*;
+
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.objectteams.otdt.internal.pde.ui.OTPDEUIMessages;
+import org.eclipse.objectteams.otequinox.ActivationKind;
+import org.eclipse.pde.internal.core.builders.CompilerFlags;
+import org.eclipse.pde.internal.core.builders.IHeader;
+import org.eclipse.pde.internal.core.builders.PDEMarkerFactory;
+import org.eclipse.pde.internal.core.ibundle.IManifestHeader;
+import org.eclipse.pde.internal.core.text.bundle.BundleActivationPolicyHeader;
+import org.eclipse.pde.internal.core.text.bundle.BundleModel;
+import org.eclipse.pde.internal.ui.correction.AbstractManifestMarkerResolution;
+import org.eclipse.pde.internal.ui.correction.AbstractPDEMarkerResolution;
+import org.eclipse.ui.IMarkerResolution;
+import org.osgi.framework.Constants;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import base org.eclipse.pde.internal.core.builders.BundleErrorReporter;
+import base org.eclipse.pde.internal.core.builders.ExtensionsErrorReporter;
+import base org.eclipse.pde.internal.core.builders.ManifestConsistencyChecker;
+import base org.eclipse.pde.internal.ui.correction.ResolutionGenerator;
+
+/**
+ * Enhanced validation of bundle manifests.
+ * <ul>
+ * <li>Check whether all bundles with aspectBindings have a proper activation policy set,<br>
+ *    Provide suitable quick assist if activation policy is wrong/missing.</li>
+ * </ul>
+ * 
+ * @author stephan
+ * @since 1.2.7
+ */
+@SuppressWarnings("restriction")
+public team class BundleValidation 
+{
+	/** Constant for a problem that can be resolved by adding an activation policy to the manifest. */
+	static final int ADD_ACTIVATION_POLICY = 0x1801; // must not overlap with any constant in org.eclipse.pde.internal.core.builders.PDEMarkerFactory. 
+	
+	ThreadLocal<BundleCheckingContext> bundleContext = new ThreadLocal<BundleCheckingContext>();
+	
+	/** 
+	 * Defines the context of validating one bundle. 
+	 * One instance of this role exists per control flow (= per thread) 
+	 * for retrieval in downstream callin bindings. 
+	 */
+	protected class BundleCheckingContext playedBy ManifestConsistencyChecker 
+	{
+		// flags set during validation of one bundle:
+		protected boolean isAspectBundle = false;
+		protected boolean hasTeamActivation = false;
+
+		@SuppressWarnings("decapsulation")
+		spanContext <- replace validateFiles;
+		
+		callin void spanContext() {
+			BundleValidation.this.bundleContext.set(this);
+			try {
+				base.spanContext();
+			} finally {
+				// withdraw role, is for one-time use only:
+				BundleValidation.this.bundleContext.set(null);
+				BundleValidation.this.unregisterRole(this, BundleCheckingContext.class);
+			}
+		}
+	}
+	
+	/**
+	 * Detects aspectBindings declared in plugin.xml and records information in the current {@link BundleCheckingContext}.
+	 */
+	protected class ExtensionAnalyzer playedBy ExtensionsErrorReporter 
+			base when (BundleValidation.this.bundleContext.get() != null)
+	{	
+		void checkAspectBinding(Element element) <- after void validateExtension(Element element);
+
+		protected void checkAspectBinding(Element element) 
+		{
+			Object pointID = element.getAttribute("point"); //$NON-NLS-1$
+			if (ASPECT_BINDING_FQEXTPOINT_ID.equals(pointID)) 
+			{
+				BundleCheckingContext context = BundleValidation.this.bundleContext.get();
+				// it's an aspect bundle
+				context.isAspectBundle = true;
+				
+				// does it have elements with relevant activation?
+				NodeList baseNodes = element.getElementsByTagName(BASE_PLUGIN);
+				if (baseNodes.getLength() > 0) { 
+					String baseId = ((Element)baseNodes.item(0)).getAttribute(ID);
+					if (baseId != null && baseId.toUpperCase().equals(SELF))
+						return; // missing bundle activation is not fatal in this case
+				}
+				
+				// check the teams for activation ALL_THREADS or THREAD:
+				NodeList teamNodes = element.getElementsByTagName(TEAM);
+				for (int t=0; t<teamNodes.getLength(); t++) {
+					Object activation = ((Element)teamNodes.item(t)).getAttribute(ACTIVATION);
+					if (ActivationKind.ALL_THREADS.toString().equals(activation)) {
+						context.hasTeamActivation = true;
+						break;
+					} else if (ActivationKind.THREAD.toString().equals(activation)) {
+						context.hasTeamActivation = true;
+						break;
+					}
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Validates whether activation policy is set if needed.
+     * This role is only active for bundles with one or more aspect bindings.
+	 */
+	protected class BundleErrorReporter playedBy BundleErrorReporter 
+			base when (BundleValidation.this.bundleContext.get().isAspectBundle)
+	{			
+		@SuppressWarnings("decapsulation")
+		IHeader getHeader(String key) -> IHeader getHeader(String key);
+		void report(String message, int line, int severity, int resolution, String category) 
+			-> IMarker report(String message, int line, int severity, int resolution, String category);
+		
+		void validateBundleActivatorPolicy() <- after void validateBundleActivatorPolicy();
+		
+		void validateBundleActivatorPolicy() 
+		{
+			IHeader header = getHeader(Constants.BUNDLE_ACTIVATIONPOLICY);
+			int lineNo = 1;
+			if (header != null) {
+				if (Constants.ACTIVATION_LAZY.equals(header.getValue()))
+					return; // OK!
+				lineNo = header.getLineNumber()+1;
+			}
+			boolean hasTeamActivation = BundleValidation.this.bundleContext.get().hasTeamActivation;
+			report(OTPDEUIMessages.Validation_MissingActivationPolicy_error, 
+				   lineNo, 
+				   hasTeamActivation ? CompilerFlags.ERROR : CompilerFlags.WARNING, 	// only severe if relevant team activation is requested. 
+				   ADD_ACTIVATION_POLICY, 
+				   PDEMarkerFactory.CAT_FATAL);
+		}		
+	}
+	
+	/** Unbound role: simple rewriting of the manifest to add or correct an activation policy header. */
+	protected class SetActivationPolicyResolution extends AbstractManifestMarkerResolution 
+	{	
+		public SetActivationPolicyResolution(int type) {
+			super(type);
+		}
+	
+		protected void createChange(BundleModel model) {
+	
+			IManifestHeader header = model.getBundle().getManifestHeader(Constants.BUNDLE_ACTIVATIONPOLICY);
+	
+			if (header != null && header instanceof BundleActivationPolicyHeader)
+				((BundleActivationPolicyHeader) header).setLazyStart(true);
+			else
+				model.getBundle().setHeader(Constants.BUNDLE_ACTIVATIONPOLICY, Constants.ACTIVATION_LAZY);
+		}
+	
+		public String getLabel() {
+			return OTPDEUIMessages.Resolution_AddBundleActivationPolicy_label;
+		}
+	}
+	
+	/**
+	 * Advise the base class for handling missing/incorrect activation policy 
+	 * (code {@link BundleValidation#ADD_ACTIVATION_POLICY}).
+	 */
+	protected class ResolutionGenerator playedBy ResolutionGenerator {
+
+		IMarkerResolution[] getResolutions(IMarker marker) <- replace IMarkerResolution[] getResolutions(IMarker marker);
+		
+		callin IMarkerResolution[] getResolutions(IMarker marker) {
+			IMarkerResolution[] result = base.getResolutions(marker);
+			if (result.length == 0) {
+				int problemID = marker.getAttribute("id", PDEMarkerFactory.NO_RESOLUTION); //$NON-NLS-1$
+				switch (problemID) {
+					case BundleValidation.ADD_ACTIVATION_POLICY :
+						return new IMarkerResolution[] {new SetActivationPolicyResolution(AbstractPDEMarkerResolution.CREATE_TYPE)};
+				}
+			}
+			return result;
+		}
+	}
+}