diff --git a/org.eclipse.jdt.core/.settings/.api_filters b/org.eclipse.jdt.core/.settings/.api_filters
index b025e66..d42e238 100644
--- a/org.eclipse.jdt.core/.settings/.api_filters
+++ b/org.eclipse.jdt.core/.settings/.api_filters
@@ -257,6 +257,13 @@
             </message_arguments>
         </filter>
     </resource>
+    <resource path="dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java" type="org.eclipse.jdt.core.dom.BaseConstructorInvocation">
+        <filter comment="subclassing statement was wrong" id="338849923">
+            <message_arguments>
+                <message_argument value="org.eclipse.jdt.core.dom.BaseConstructorInvocation"/>
+            </message_arguments>
+        </filter>
+    </resource>
     <resource path="dom/org/eclipse/jdt/core/dom/InstanceofExpression.java" type="org.eclipse.jdt.core.dom.InstanceofExpression">
         <filter comment="For Java 14" id="336658481">
             <message_arguments>
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
index 097f2b0..3050763 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
@@ -82,6 +82,7 @@
 import org.eclipse.jdt.internal.core.util.Util;
 import org.eclipse.objectteams.otdt.core.compiler.IOTConstants;
 import org.eclipse.objectteams.otdt.core.exceptions.InternalCompilerError;
+import org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseAllocationExpression;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseReference;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.CalloutMappingDeclaration;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.FieldAccessSpec;
@@ -2091,6 +2092,10 @@
 			return convert((org.eclipse.jdt.internal.compiler.ast.CompoundAssignment) expression);
 		}
 		if (expression instanceof org.eclipse.jdt.internal.compiler.ast.Assignment) {
+//{ObjectTeams:
+			if (expression instanceof BaseAllocationExpression)
+				return convert((BaseAllocationExpression) expression);
+// SH}
 			return convert((org.eclipse.jdt.internal.compiler.ast.Assignment) expression);
 		}
 		if (expression instanceof org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess) {
@@ -3175,7 +3180,8 @@
 //gbr}
 //{ObjectTeams: handle BaseConstructorMessageSend. Note: might be unresolvable, i.e. incomplete rhs!
         if (statement instanceof org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseAllocationExpression) {
-            return convert((org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseAllocationExpression) statement);
+            BaseConstructorInvocation invocation = convert((org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseAllocationExpression) statement);
+            return this.ast.newExpressionStatement(invocation);
         }
 //carp}
 		if (statement instanceof org.eclipse.jdt.internal.compiler.ast.Block) {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java
index 238fe3b..b9f8927 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BaseConstructorInvocation.java
@@ -1,7 +1,7 @@
 /**********************************************************************
  * This file is part of "Object Teams Development Tooling"-Software
  *
- * Copyright 2004, 2006 Fraunhofer Gesellschaft, Munich, Germany,
+ * Copyright 2004, 2020 Fraunhofer Gesellschaft, Munich, Germany,
  * for its Fraunhofer Institute for Computer Architecture and Software
  * Technology (FIRST), Berlin, Germany and Technical University Berlin,
  * Germany.
@@ -47,7 +47,7 @@
  * @author mkr
  * @version $Id: BaseConstructorInvocation.java 23416 2010-02-03 19:59:31Z stephan $
  */
-public class BaseConstructorInvocation extends Statement implements Invocation
+public class BaseConstructorInvocation extends Expression implements Invocation
 {
     /**
      * The "arguments" structural property of this node type.
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
index 76e7957..65c1a12 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
@@ -2108,10 +2108,12 @@
 					SingleVariableDeclaration fakedVariable = realVariable.newFakedRoleVariable((LiftingType) realVariable.getType());
 					if (fakedVariable != null) { // else a faked variable has already been registered
 						IVariableBinding fakedBinding = getVariableBinding(fakedArgument.binding, variable);
-						this.bindingsToAstNodes.put(fakedBinding, fakedVariable);
-						key = fakedBinding.getKey();
-						if (key != null)
-							this.bindingTables.bindingKeysToBindings.put(key, fakedBinding);
+						if (fakedBinding != null) { // null happens, e.g., if resolving was skipped due to AbortCompilation
+							this.bindingsToAstNodes.put(fakedBinding, fakedVariable);
+							key = fakedBinding.getKey();
+							if (key != null)
+								this.bindingTables.bindingKeysToBindings.put(key, fakedBinding);
+						}
 						// for repeated lookup of fakedVariable (using this same method) we also need the AST mapping:
 						this.newAstToOldAst.put(fakedVariable, fakedArgument);
 					}
diff --git a/plugins/org.eclipse.objectteams.runtime/META-INF/MANIFEST.MF b/plugins/org.eclipse.objectteams.runtime/META-INF/MANIFEST.MF
index 6830fca..2c93083 100644
--- a/plugins/org.eclipse.objectteams.runtime/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.objectteams.runtime/META-INF/MANIFEST.MF
@@ -6,7 +6,7 @@
 Bundle-Version: 2.8.0.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jdt.annotation;bundle-version="[2.2.0,3.0.0)";resolution:=optional
+Require-Bundle: org.eclipse.jdt.annotation;bundle-version="[2.2.0,3.0.0)";resolution:=optional;visibility:=reexport
 Export-Package: org.eclipse.objectteams.otredyn.runtime;version="2.8.0",
  org.eclipse.objectteams.runtime;version="2.8.0",
  org.objectteams;version="2.8.0"
diff --git a/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/BaseConstructorInvocationTest.java b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/BaseConstructorInvocationTest.java
index 2e91cb4..bbe3382 100644
--- a/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/BaseConstructorInvocationTest.java
+++ b/testplugins/org.eclipse.objectteams.otdt.ui.tests.dom/src/org/eclipse/objectteams/otdt/ui/tests/dom/converter/BaseConstructorInvocationTest.java
@@ -36,11 +36,11 @@
 import org.eclipse.jdt.core.dom.BaseConstructorInvocation;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.ExpressionStatement;
 import org.eclipse.jdt.core.dom.IMethodBinding;
 import org.eclipse.jdt.core.dom.ITypeBinding;
 import org.eclipse.jdt.core.dom.MethodDeclaration;
 import org.eclipse.jdt.core.dom.RoleTypeDeclaration;
-import org.eclipse.jdt.core.dom.Statement;
 import org.eclipse.jdt.core.dom.TypeDeclaration;
 import org.eclipse.objectteams.otdt.ui.tests.dom.FileBasedDOMTest;
 
@@ -52,7 +52,7 @@
 public class BaseConstructorInvocationTest extends FileBasedDOMTest
 {
     public static final String TEST_PROJECT = "DOM_AST";
-	private static final int JAVA_LANGUAGE_SPEC_LEVEL = AST.JLS4;
+	private static final int JAVA_LANGUAGE_SPEC_LEVEL = AST.JLS14;
 
     private TypeDeclaration _typeDecl;
 	private TypeDeclaration _role;
@@ -97,11 +97,16 @@
 		super.setUp();
 	}
 
+	private BaseConstructorInvocation getBaseConstructorInvocation(MethodDeclaration constructor) {
+		Object statement = constructor.getBody().statements().get(0);
+		return (BaseConstructorInvocation) ((ExpressionStatement) statement).getExpression();
+	}
+
     public void testInstanceType1()
     {
         MethodDeclaration constructor = _role.getMethods()[0];
 
-        Statement testObj = (Statement)constructor.getBody().statements().get(0);
+        BaseConstructorInvocation testObj = getBaseConstructorInvocation(constructor);
 
         assertTrue("Template for tests, always true",
                    testObj instanceof BaseConstructorInvocation);
@@ -111,7 +116,7 @@
     {
         MethodDeclaration constructor = _role.getMethods()[0];
 
-        _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+        _testObj = getBaseConstructorInvocation(constructor);
 
         int actual = _testObj.getNodeType();
 
@@ -123,9 +128,9 @@
     public void testGetArguments_NoArgs()
     {
         MethodDeclaration constructor = _role.getMethods()[0];
-        _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+        _testObj = getBaseConstructorInvocation(constructor);
 
-        List actual = _testObj.getArguments();
+        List<?> actual = _testObj.getArguments();
 
         assertEquals("BaseConstructorMessageSend has wrong number of arguments",
                      0,
@@ -136,9 +141,9 @@
     {
         RoleTypeDeclaration role = _typeDecl.getRoles()[0];
         MethodDeclaration constructor = role.getMethods()[1];
-        _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+        _testObj = getBaseConstructorInvocation(constructor);
 
-        List actual = _testObj.getArguments();
+        List<?> actual = _testObj.getArguments();
 
         assertEquals("BaseConstructorMessageSend has wrong number of arguments",
                      2,
@@ -149,13 +154,13 @@
     public void testChildNodesHaveCorrectParent1()
     {
         MethodDeclaration constructor = _role.getMethods()[1];
-        _testObj = (BaseConstructorInvocation) constructor.getBody().statements().get(0);
+        _testObj = getBaseConstructorInvocation(constructor);
 
-        List childNodes = _testObj.getArguments();
+        List<Expression> childNodes = _testObj.getArguments();
 
-        for (Iterator iter = childNodes.iterator(); iter.hasNext();)
+        for (Iterator<Expression> iter = childNodes.iterator(); iter.hasNext();)
         {
-            Expression curChild = (Expression) iter.next();
+            Expression curChild = iter.next();
             assertEquals("Base call arguments have wrong parent node",
                          _testObj,
                          curChild.getParent());
@@ -165,7 +170,7 @@
     public void testSubtreeMatch1()
     {
         MethodDeclaration constructor = _role.getMethods()[1];
-        _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+        _testObj = getBaseConstructorInvocation(constructor);
 
         boolean actual = _testObj.subtreeMatch(new ASTMatcher(), _testObj);
 
@@ -176,7 +181,7 @@
     public void testtoString1()
     {
         MethodDeclaration constructor = _role.getMethods()[1];
-        _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+        _testObj = getBaseConstructorInvocation(constructor);
 
         String actual = _testObj.toString();
         String expected = "base(dummy0, dummy1);";
@@ -206,7 +211,7 @@
         TypeDeclaration role2Decl = team2Decl.getTypes()[0];
 
         MethodDeclaration constructor = role2Decl.getMethods()[1];
-        _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+        _testObj = getBaseConstructorInvocation(constructor);
 
         String actual = _testObj.toString();
         String expected = "base(dummy0, dummy1);";
@@ -220,7 +225,7 @@
         RoleTypeDeclaration role = _typeDecl.getRoles()[0];
         MethodDeclaration constructor = role.getMethods()[1];
 
-        _testObj = (BaseConstructorInvocation)constructor.getBody().statements().get(0);
+        _testObj = getBaseConstructorInvocation(constructor);
 
         ITypeBinding baseClass = role.resolveBinding().getBaseClass();
         IMethodBinding baseConstructorBinding = baseClass.getDeclaredMethods()[1];
