3rd part of implementing Bug 337413 - [otjld][compiler] consider changing LiftingFailedException to a checked exception.
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
index a07d43e..aa6a2ff 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
@@ -1500,8 +1500,10 @@
 	int GenericMethodTypeArgumentMismatchRoleBound=ROLE_RELATED + 3210; // 2.3.2(e)
 
 	int RoleBindingPotentiallyAmbiguous          = ROLE_RELATED + 3401; // 2.3.4(a)
-	int DefiniteLiftingAmbiguity 				 = ROLE_RELATED + 3402; // 2.3.4(b)
-	int AmbiguousLiftingMayBreakClients			 = ROLE_RELATED + 3403; // 2.3.5(d)
+	/** @since 3.7 OT 2.0 */
+	int AmbiguousLiftingMayBreakClients			 = ROLE_RELATED + 3402; // 2.3.5(d)
+	/** @since 3.7 OT 2.0 */
+	int UnhandledLiftingFailedException			 = ROLE_RELATED + 3403; // 2.3.5
 
 	int QualifiedUseOfLiftingConstructor         = ROLE_RELATED + 4101; // 2.4.1(a)
 	int LiftCtorArgNotAllocation                 = ROLE_RELATED + 4102; // 2.4.1(c)
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
index 40c8594..80d7e35 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ExplicitConstructorCall.java
@@ -782,7 +782,7 @@
 				continue;
 			if (TSuperHelper.isMarkerInterface(param))
 				return null;
-			TypeBinding roleType = TeamModel.getRoleToLiftTo(scope, arg, param, false, /*location*/provided[i], null/*callinDecl*/);
+			TypeBinding roleType = TeamModel.getRoleToLiftTo(scope, arg, param, false, /*location*/provided[i]);
 			if (roleType == null)
 				return null;
 			// FIXME(SH): should roleType be stored in adjustedArgtypes??
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
index 362fe47..5f3c6b6 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
@@ -163,8 +163,6 @@
     	  
 	public static final String OPTION_ReportPotentialAmbiguousPlayedby =
 		"org.eclipse.objectteams.otdt.compiler.problem.potential_ambiguous_playedby"; //$NON-NLS-1$
-	public static final String OPTION_ReportDefiniteBindingAmbiguity=
-		"org.eclipse.objectteams.otdt.compiler.problem.definite_ambiguity"; //$NON-NLS-1$
 	public static final String OPTION_ReportAbstractPotentialRelevantRole =
 		"org.eclipse.objectteams.otdt.compiler.problem.abstract_potential_relevant_role"; //$NON-NLS-1$
 	public static final String OPTION_ReportHiddenLiftingProblem =
@@ -337,11 +335,10 @@
 	public static final int AmbiguousLowering=				 OTJFlag | ASTNode.Bit15;
 	public static final int AdaptingDeprecated=              OTJFlag | ASTNode.Bit16;
 	public static final int IgnoringRoleReturn=			     OTJFlag | ASTNode.Bit17;
-	public static final int DefiniteBindingAmbiguity=		 OTJFlag | ASTNode.Bit18;
-	public static final int BaseclassCycle=				     OTJFlag | ASTNode.Bit19;
-	public static final int EffectlessFieldaccess= 			 OTJFlag | ASTNode.Bit20; 
-	public static final int UnusedParammap= 				 OTJFlag | ASTNode.Bit21;
-	public static final int HiddenLiftingProblem=      		 OTJFlag | ASTNode.Bit22;
+	public static final int BaseclassCycle=				     OTJFlag | ASTNode.Bit18;
+	public static final int EffectlessFieldaccess= 			 OTJFlag | ASTNode.Bit19; 
+	public static final int UnusedParammap= 				 OTJFlag | ASTNode.Bit20;
+	public static final int HiddenLiftingProblem=      		 OTJFlag | ASTNode.Bit21;
 // SH}
 
 	// Severity level for handlers
@@ -504,7 +501,6 @@
 		"roleinstantiation",    //$NON-NLS-1$
 		"fragilecallin",        //$NON-NLS-1$
 		"ambiguousbinding",     //$NON-NLS-1$
-		"def-bind-ambiguity",   //$NON-NLS-1$
 		"abstractrelevantrole", //$NON-NLS-1$
 		"hidden-lifting-problem",//$NON-NLS-1$
 		"decapsulation",        //$NON-NLS-1$
@@ -697,8 +693,6 @@
 				return OPTION_ReportUnusedParammap;
 			case PotentialAmbiguousPlayedBy :
 				return OPTION_ReportPotentialAmbiguousPlayedby;
-			case DefiniteBindingAmbiguity:
-				return OPTION_ReportDefiniteBindingAmbiguity;
 			case AbstractPotentialRelevantRole :
 				return OPTION_ReportAbstractPotentialRelevantRole;
 			case HiddenLiftingProblem :
@@ -900,7 +894,6 @@
 			OPTION_ReportFragileCallin,
 			OPTION_ReportUnusedParammap,
 			OPTION_ReportPotentialAmbiguousPlayedby,
-			OPTION_ReportDefiniteBindingAmbiguity,
 			OPTION_ReportAbstractPotentialRelevantRole,
 			OPTION_ReportHiddenLiftingProblem,
 			OPTION_ReportDecapsulation,
@@ -1002,8 +995,6 @@
 //			case UnusedParammap : // no reason to suppress
 			case PotentialAmbiguousPlayedBy :
 				return "ambiguousbinding"; //$NON-NLS-1$
-			case DefiniteBindingAmbiguity :
-				return "def-bind-ambiguity"; //$NON-NLS-1$
 			case AbstractPotentialRelevantRole :
 				return "abstractrelevantrole"; //$NON-NLS-1$
 			case HiddenLiftingProblem :
@@ -1137,8 +1128,6 @@
 				return IrritantSet.DECAPSULATION;
 			if ("dangerouscallin".equals(warningToken)) //$NON-NLS-1$
 				return IrritantSet.DANGEROUS_CALLIN;
-			if ("def-bind-ambiguity".equals(warningToken)) //$NON-NLS-1$
-				return IrritantSet.DEFINITE_BINDING_AMBIGUITY;
 			break;
 		case 'e' :
 			if ("exceptioninguard".equals(warningToken)) //$NON-NLS-1$
@@ -1298,7 +1287,6 @@
 		optionsMap.put(OPTION_ReportUnusedParammap, getSeverityString(UnusedParammap));
 
 		optionsMap.put(OPTION_ReportPotentialAmbiguousPlayedby, getSeverityString(PotentialAmbiguousPlayedBy));
-		optionsMap.put(OPTION_ReportDefiniteBindingAmbiguity, getSeverityString(DefiniteBindingAmbiguity));
 		optionsMap.put(OPTION_ReportAbstractPotentialRelevantRole, getSeverityString(AbstractPotentialRelevantRole));
 		optionsMap.put(OPTION_ReportHiddenLiftingProblem, getSeverityString(HiddenLiftingProblem));
 
@@ -1758,7 +1746,6 @@
 		if ((optionValue = optionsMap.get(OPTION_ReportUnusedParammap)) != null) updateSeverity(UnusedParammap, optionValue);
 
 		if ((optionValue = optionsMap.get(OPTION_ReportPotentialAmbiguousPlayedby)) != null) updateSeverity(PotentialAmbiguousPlayedBy, optionValue);
-		if ((optionValue = optionsMap.get(OPTION_ReportDefiniteBindingAmbiguity)) != null) updateSeverity(DefiniteBindingAmbiguity, optionValue);
 		if ((optionValue = optionsMap.get(OPTION_ReportAbstractPotentialRelevantRole)) != null) updateSeverity(AbstractPotentialRelevantRole, optionValue);
 		if ((optionValue = optionsMap.get(OPTION_ReportHiddenLiftingProblem)) != null) updateSeverity(HiddenLiftingProblem, optionValue);
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
index 44dd1b8..eb3dd3d 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/IrritantSet.java
@@ -109,8 +109,6 @@
             CompilerOptions.AdaptingDeprecated);
 	public static final IrritantSet IGNORING_ROLE_RETURN = new IrritantSet(
 			CompilerOptions.IgnoringRoleReturn);
-	public static final IrritantSet DEFINITE_BINDING_AMBIGUITY = new IrritantSet(
-			CompilerOptions.DefiniteBindingAmbiguity);
 // SH}
 	static {
 //{ObjectTeams: default to error:
@@ -119,7 +117,6 @@
 				 | CompilerOptions.ExceptionInGuard
 				 | CompilerOptions.OverridingFinalRole
 				 | CompilerOptions.AdaptingDeprecated
-				 | CompilerOptions.DefiniteBindingAmbiguity
 				 | CompilerOptions.HiddenLiftingProblem);
 // SH}
 		COMPILER_DEFAULT_WARNINGS
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.java
index 2d98504..43997c7 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemHandler.java
@@ -210,7 +210,7 @@
 		case IProblem.OverridingPlayedBy:
 		case IProblem.BaseclassIsRoleOfTheSameTeam:
 		case IProblem.RoleBindingPotentiallyAmbiguous:
-		case IProblem.DefiniteLiftingAmbiguity:
+		case IProblem.AmbiguousLiftingMayBreakClients:
 		case IProblem.AbstractPotentiallyRelevantRole:
 		case IProblem.AbstractRelevantRole:
 			break;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
index b7027df..2e1c3a3 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
@@ -518,8 +518,6 @@
 			return CompilerOptions.PotentialAmbiguousPlayedBy;
 		case IProblem.AbstractPotentiallyRelevantRole:
 			return CompilerOptions.AbstractPotentialRelevantRole;
-		case IProblem.DefiniteLiftingAmbiguity:
-			return CompilerOptions.DefiniteBindingAmbiguity;
 		case IProblem.CallinDespiteBindingAmbiguity:
 		case IProblem.CallinDespiteAbstractRole:
 		case IProblem.AmbiguousLiftingMayBreakClients:
@@ -691,7 +689,6 @@
 			case CompilerOptions.FragileCallin:
 			case CompilerOptions.PotentialAmbiguousPlayedBy:
 			case CompilerOptions.AbstractPotentialRelevantRole:
-			case CompilerOptions.HiddenLiftingProblem:
 			case CompilerOptions.ExceptionInGuard:
 			case CompilerOptions.AmbiguousLowering:
 				return CategorizedProblem.CAT_CODE_STYLE;
@@ -705,7 +702,7 @@
 				return CategorizedProblem.CAT_CODE_STYLE;
 			case CompilerOptions.DeprecatedPathSyntax:
 				return CategorizedProblem.CAT_CODE_STYLE;
-			case CompilerOptions.DefiniteBindingAmbiguity:
+			case CompilerOptions.HiddenLiftingProblem:
 			case CompilerOptions.WeaveIntoSystemClass:
 			case CompilerOptions.DangerousCallin:
 			case CompilerOptions.IgnoringRoleReturn:
@@ -7525,6 +7522,17 @@
 			callinDespiteLiftingProblem(roleType, teamModel.canLiftingFail(roleType), location);
 		}
 		return;
+	} else if (   exceptionType instanceof ReferenceBinding 
+			   && CharOperation.equals(((ReferenceBinding)exceptionType).compoundName, IOTConstants.O_O_LIFTING_FAILED_EXCEPTION)) 
+	{
+		// add a specific link into the OTJLD to an otherwise normal error message:
+		this.handle(
+			IProblem.UnhandledLiftingFailedException,
+			new String[] {new String(exceptionType.readableName())},
+			new String[] {new String(exceptionType.shortReadableName())},
+			location.sourceStart,
+			location.sourceEnd);
+		return;
 	}
 // SH}
 
@@ -9439,19 +9447,6 @@
 		teamDecl.sourceStart,
 		teamDecl.sourceEnd);
 }
-public void definiteLiftingAmbiguity(TypeBinding provided, TypeBinding required, ASTNode location)
-{
-	String[] args = new String[]{
-		new String(provided.readableName()),
-		new String(required.readableName())
-	};
-	this.handle(
-			IProblem.DefiniteLiftingAmbiguity,
-			args,
-			args,
-			location.sourceStart,
-			location.sourceEnd);
-}
 public void ambiguousLiftingMayBreakClients(TypeBinding roleType) {
 	String[] args = new String[]{
 		new String(roleType.readableName())
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
index 818e106..2da3710 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
@@ -770,8 +770,8 @@
 1203210 = Bound mismatch: The generic method {0}({1}) of type {2} is not applicable for the arguments ({3}). The inferred type {4} is not a valid substitute for the bounded parameter <{5} base {6}> (OTJLD 2.3.2(e)).
 
 1203401 = Potential ambiguity in role binding. The base ''{0}'' is bound to the following roles: {1} (OTJLD 2.3.4(a)).
-1203402 = Lifting type {0} to role {1} is definitely ambiguous (OTJLD 2.3.4(b)).
-1203403 = Team introduces binding ambiguity for role {0}, which may break clients of the super team (OTJLD 2.3.5(d)).
+1203402 = Team introduces binding ambiguity for role {0}, which may break clients of the super team (OTJLD 2.3.5(d)).
+1203403 = Unhandled exception type LiftingFailedException, caused by an unsafe lifting translation (OTJLD 2.3.5).
 
 1204101 = Cannot invoke the lifting constructor {0} to create an externalized role (OTJLD 2.4.1(a)).
 1204102 = Argument to lifting constructor {0} is not a freshly created base object (of type {1}); may cause a DuplicateRoleException at runtime (OTJLD 2.4.1(c)).
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CallinMappingDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CallinMappingDeclaration.java
index dec1ff0..98a3bdc 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CallinMappingDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CallinMappingDeclaration.java
@@ -333,14 +333,10 @@
 									roleToLiftTo = roleRef;
 								}
 							}
-							ReferenceBinding enclosingTeam = this.scope.enclosingSourceType().enclosingType();
-							int iProblem = enclosingTeam.getTeamModel().canLiftingFail(roleRef);
-							if (iProblem > 0)
-								addRoleLiftingProblem(roleRef, iProblem);
 						}
 					} else {
 						// this uses OTJLD 2.3.3(a) adaptation which is not reversible, ie., not usable for replace:
-						roleToLiftTo = TeamModel.getRoleToLiftTo(this.scope, baseParam, roleParam, false, location, this);
+						roleToLiftTo = TeamModel.getRoleToLiftTo(this.scope, baseParam, roleParam, false, location);
 					}
 					if (roleToLiftTo != null)
 					{
@@ -348,6 +344,13 @@
 						methodSpec.argNeedsTranslation[j] = true;
 						this.roleMethodSpec.argNeedsTranslation[j] = true;
 						this.roleMethodSpec.parameters[j] = roleToLiftTo; // this applies to all bindings
+						
+						// still need to check for ambiguity/abstract role:
+						ReferenceBinding enclosingTeam = this.scope.enclosingSourceType().enclosingType();
+						int iProblem = enclosingTeam.getTeamModel().canLiftingFail((ReferenceBinding)roleToLiftTo.leafComponentType());
+						if (iProblem > 0)
+							addRoleLiftingProblem((ReferenceBinding)roleToLiftTo.leafComponentType(), iProblem);
+
 						continue;
 					}
 					// check auto(un)boxing:
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CalloutMappingDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CalloutMappingDeclaration.java
index 80569b0..b9e9de2 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CalloutMappingDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/CalloutMappingDeclaration.java
@@ -177,7 +177,7 @@
 				{
 					this.roleMethodSpec.returnType.resolvedType = roleReturn;
 				} else {
-					TypeBinding roleToLiftTo = TeamModel.getRoleToLiftTo(this.scope, baseReturn, roleReturn, false, methodSpec, null/*callinDecl*/);
+					TypeBinding roleToLiftTo = TeamModel.getRoleToLiftTo(this.scope, baseReturn, roleReturn, false, methodSpec);
 					if (roleToLiftTo != null)
 					{
 						// success by translation
@@ -223,7 +223,7 @@
                     this.roleMethodSpec.returnType.resolvedType = requiredType; // need a valid type here
 				return; // OK => done
 			} else {
-				TypeBinding roleToLiftTo = TeamModel.getRoleToLiftTo(this.scope, providedType, requiredType, false, fieldSpec, null/*callinDecl*/);
+				TypeBinding roleToLiftTo = TeamModel.getRoleToLiftTo(this.scope, providedType, requiredType, false, fieldSpec);
 				if (roleToLiftTo != null)
 				{
 					// success by translation
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/LiftingTypeReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/LiftingTypeReference.java
index 37206c3..31f318f 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/LiftingTypeReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/LiftingTypeReference.java
@@ -28,8 +28,6 @@
  */
 package org.eclipse.objectteams.otdt.internal.core.compiler.ast;
 
-import java.util.HashSet;
-
 import org.eclipse.jdt.internal.compiler.ASTVisitor;
 import org.eclipse.jdt.internal.compiler.ast.ArrayTypeReference;
 import org.eclipse.jdt.internal.compiler.ast.CharLiteral;
@@ -169,18 +167,12 @@
 	    if (baseType.isTypeVariable() && ((TypeVariableBinding)baseType).roletype != null) {
 	    	// resolving "<B base R> as R":
 	    	roleRefType = ((TypeVariableBinding)baseType).roletype;
-	    	// check ambiguity:
-	    	HashSet<ReferenceBinding> mappedBases = new HashSet<ReferenceBinding>();
-	    	for(ReferenceBinding boundRole : roleRefType.roleModel.getBoundDescendants())
-	    		if (mappedBases.contains(boundRole.baseclass()))
-	    			scope.problemReporter().definiteLiftingAmbiguity(baseType, roleRefType, this);
-	    		else
-	    			mappedBases.add(boundRole.baseclass());
+	    	// ambiguity is handled by _OT$lift_dynamic which may or may not declare LiftingFailedException
 	    } else if ((baseType.tagBits & TagBits.HierarchyHasProblems) != 0) {
 	    	// already reported (?)
 	    } else {
 	    	// static adjustment (OTJLD 2.3.2(a)):
-	    	roleRefType = (ReferenceBinding)TeamModel.getRoleToLiftTo(scope, baseType, roleRefType, true, this, null/*callinDecl*/);
+	    	roleRefType = (ReferenceBinding)TeamModel.getRoleToLiftTo(scope, baseType, roleRefType, true, this);
 		    if (roleRefType == null)
 		    	roleRefType = (ReferenceBinding)roleType; // revert unsuccessful adjustment
 		    if (    roleRefType.baseclass() == null
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/PotentialLiftExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/PotentialLiftExpression.java
index 7eb7824..f720754 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/PotentialLiftExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/ast/PotentialLiftExpression.java
@@ -153,7 +153,7 @@
 			if (   expectedBase == null							// roleType is assigned unless incompatibilityFound, in which case we return above
 	        	|| !baseType.isCompatibleWith(expectedBase))
 	        {
-	        	TypeBinding adjustedRole = TeamModel.getRoleToLiftTo(scope, baseType, roleType, true, this.expression, null/*callinDecl*/);
+	        	TypeBinding adjustedRole = TeamModel.getRoleToLiftTo(scope, baseType, roleType, true, this.expression);
 	        	if (adjustedRole != null) {
 	        		this.expectedType = adjustedRole;
 	        	} else {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/BytecodeTransformer.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/BytecodeTransformer.java
index 314e99e..fbf9d20 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/BytecodeTransformer.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/bytecode/BytecodeTransformer.java
@@ -692,8 +692,7 @@
 												mDecl.binding.parameters[arg-1],
 												role,
 												true,
-												mDecl.arguments[arg-1],
-												null/*callinDecl*/);
+												mDecl.arguments[arg-1]);
 		// find the method:
 		char[] liftName = Lifting.getLiftMethodName(role);
 		MethodBinding[] lifters = dstClassFile.referenceBinding.getMethods(liftName);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/DeclaredLifting.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/DeclaredLifting.java
index c7fbe81..71ba345 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/DeclaredLifting.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/lifting/DeclaredLifting.java
@@ -242,7 +242,7 @@
 				if (baseType == null || !baseType.isValidBinding())
 					// fall back to normal scope:
 					baseType = (ReferenceBinding)scope.getType(ltr.baseTokens, ltr.baseTokens.length);
-				roleRef = (ReferenceBinding)TeamModel.getRoleToLiftTo(scope, baseType, roleRef, true, ltr, null/*callinDecl*/);
+				roleRef = (ReferenceBinding)TeamModel.getRoleToLiftTo(scope, baseType, roleRef, true, ltr);
 				if (baseType.isTypeVariable() && roleRef == null)
 					roleRef = (ReferenceBinding)roleType; // fall back to the declared type
 			}
@@ -559,7 +559,7 @@
 					continue;
 				hasProblematicArg = true;
 				TypeBinding roleType = TeamModel.getRoleToLiftTo(
-						scope, providedArgs[i], parameters[i], true, scope.referenceType().superclass, null/*callinDecl*/);
+						scope, providedArgs[i], parameters[i], true, scope.referenceType().superclass);
 				if (roleType != null)
 				{
 					// compatibility only through lifting, need to copy the constructor for this selfcall
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/model/TeamModel.java b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/model/TeamModel.java
index adb5ed8..a9ad811 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/model/TeamModel.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/objectteams/otdt/internal/core/compiler/model/TeamModel.java
@@ -46,7 +46,6 @@
 import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
 import org.eclipse.objectteams.otdt.core.compiler.Pair;
 import org.eclipse.objectteams.otdt.core.exceptions.InternalCompilerError;
-import org.eclipse.objectteams.otdt.internal.core.compiler.ast.CallinMappingDeclaration;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.MethodSpec;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.RoleFileCache;
 import org.eclipse.objectteams.otdt.internal.core.compiler.bytecode.AbstractAttribute;
@@ -645,7 +644,6 @@
 	 * @param required
 	 * @param doAdjust should the adjusted role be returned (as opposed to just the strengthened)?
 	 * @param location where to report errors against
-	 * @param callinDecl set if lifting is required from a callin mapping
 	 * @return an exact role or null
 	 */
 	public static TypeBinding getRoleToLiftTo (
@@ -653,8 +651,7 @@
 			TypeBinding provided,
 			TypeBinding required,
 			boolean doAdjust,
-			ASTNode location,
-			CallinMappingDeclaration callinDecl)
+			ASTNode location)
 	{
 		ReferenceBinding requiredRef = null;
 		if (   required.isArrayType()
@@ -667,20 +664,6 @@
 		if (   requiredRef != null
 			&& requiredRef.isRole())
 		{
-			TeamModel enclosingTeam = requiredRef.enclosingType().getTeamModel();
-			if (enclosingTeam != null && !provided.leafComponentType().isBaseType()) {
-				for (Pair<ReferenceBinding,ReferenceBinding> ambig : enclosingTeam.ambigousLifting)
-					if (ambig.equals((ReferenceBinding)provided.leafComponentType(), requiredRef.getRealClass()))
-					{
-						if (callinDecl != null) {
-							callinDecl.addRoleLiftingProblem(requiredRef, IProblem.CallinDespiteBindingAmbiguity);
-						} else {
-							scope.problemReporter().definiteLiftingAmbiguity(provided, required, location);
-							return null;
-						}
-					}
-			}
-
 			requiredRef = (ReferenceBinding)strengthenRoleType(
 					scope.enclosingSourceType(),
 					requiredRef);
@@ -753,8 +736,7 @@
 					} else if (   currentRoleIfc.isCompatibleWith(mostSpecificFound)) {
 						mostSpecificFound = currentRoleIfc;// new type is more specific
 					} else { // non-linear relation between different candidates.
-						scope.problemReporter().definiteLiftingAmbiguity(provided, required, location);
-						return null;
+						return required; // revert to non-specific required type (additionally LFE is declared by the lift method)
 					}
 				}
 			}