Bug 508852: [otre] Team causes ClassNotFoundException if roles bind to
different base plugins
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBinding.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBinding.java
index 81c5b2b..164e67b 100644
--- a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBinding.java
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBinding.java
@@ -108,6 +108,15 @@
 			}
 		}
 
+		void connectEquivalent(TeamBinding equivalent) {
+			this.equivalenceSet.add(equivalent);
+			boolean locallyHaveBases = !this.baseClassNames.isEmpty();
+			if (!equivalent.baseClassNames.isEmpty())
+				this.baseClassNames.addAll(equivalent.baseClassNames);
+			if (locallyHaveBases)
+				equivalent.baseClassNames.addAll(this.baseClassNames);
+		}
+
 		@SuppressWarnings("unchecked")
 		public @Nullable Class<? extends Team> loadTeamClass() {
 			if (teamClass != null) return teamClass;
@@ -296,8 +305,10 @@
 
 			// do we have TeamBindings representing the same team class (from different aspect bindings)?
 			Set<TeamBinding> equivalenceSet = teamLookup.get(team.teamName);
-			if (equivalenceSet != null)
-				team.equivalenceSet.addAll(equivalenceSet);
+			if (equivalenceSet != null) {
+				for (TeamBinding equivalent : equivalenceSet)
+					team.connectEquivalent(equivalent); // TODO: nullness will be handled from Set<@NonNull TeamBinding>
+			}
 			if (team.equivalenceSet.size() > 1)
 				log(IStatus.INFO, "team "+team.teamName+" participates in "+team.equivalenceSet.size()+" aspect bindings.");
 
diff --git a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBindingRegistry.java b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBindingRegistry.java
index 58c6ea8..a4d2d49 100644
--- a/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBindingRegistry.java
+++ b/plugins/org.eclipse.objectteams.otequinox/src/org/eclipse/objectteams/internal/osgi/weaving/AspectBindingRegistry.java
@@ -328,11 +328,13 @@
 	}
 	
 	public BaseBundle getBaseBundle(String bundleName) {
-		BaseBundle bundle = baseBundleLookup.get(bundleName);
-		if (bundle == null) {
-			bundle = new BaseBundle(bundleName);
-			baseBundleLookup.put(bundleName, bundle);
+		synchronized (baseBundleLookup) {
+			BaseBundle bundle = baseBundleLookup.get(bundleName);
+			if (bundle == null) {
+				bundle = new BaseBundle(bundleName);
+				baseBundleLookup.put(bundleName, bundle);
+			}
+			return bundle;
 		}
-		return bundle;
 	}
 }