diff --git a/m2e-core-tests b/m2e-core-tests
index 2e1cf70..82a0c06 160000
--- a/m2e-core-tests
+++ b/m2e-core-tests
@@ -1 +1 @@
-Subproject commit 2e1cf70e1fce1e6158921935015af69ba8f2e46d
+Subproject commit 82a0c068b5a0032d48ef3f0a8bcf44b9e590bc7d
diff --git a/org.eclipse.m2e.binaryproject.tests/src/org/eclipse/m2e/binaryproject/tests/BinaryProjectTest.java b/org.eclipse.m2e.binaryproject.tests/src/org/eclipse/m2e/binaryproject/tests/BinaryProjectTest.java
index 8b0a054..dae7651 100644
--- a/org.eclipse.m2e.binaryproject.tests/src/org/eclipse/m2e/binaryproject/tests/BinaryProjectTest.java
+++ b/org.eclipse.m2e.binaryproject.tests/src/org/eclipse/m2e/binaryproject/tests/BinaryProjectTest.java
@@ -12,6 +12,11 @@
  *******************************************************************************/
 package org.eclipse.m2e.binaryproject.tests;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
 import org.eclipse.core.resources.ICommand;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
@@ -27,11 +32,13 @@
 import org.eclipse.m2e.jdt.internal.BuildPathManager;
 import org.eclipse.m2e.tests.common.AbstractMavenProjectTestCase;
 import org.eclipse.m2e.tests.common.ClasspathHelpers;
+import org.junit.Test;
 
 @SuppressWarnings({"restriction"})
 public class BinaryProjectTest extends AbstractMavenProjectTestCase {
   IProgressMonitor monitor = new NullProgressMonitor();
 
+  @Test
   public void testBasic() throws Exception {
     IProject project =
         BinaryProjectPlugin.getInstance().create("org.apache.maven", "maven-core", "3.0.4", null, monitor);
diff --git a/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/MavenBugsTest.java b/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/MavenBugsTest.java
index 9136f6e..79e2327 100644
--- a/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/MavenBugsTest.java
+++ b/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/MavenBugsTest.java
@@ -10,6 +10,8 @@
 
 package org.eclipse.m2e.core;
 
+import static org.junit.Assert.assertEquals;
+
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.nio.file.Files;
diff --git a/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/RegistryTest.java b/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/RegistryTest.java
index 5d40fb6..7d0e8a9 100644
--- a/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/RegistryTest.java
+++ b/org.eclipse.m2e.core.tests/src/org/eclipse/m2e/core/internal/project/registry/RegistryTest.java
@@ -14,6 +14,7 @@
 package org.eclipse.m2e.core.internal.project.registry;
 
 import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -69,6 +70,7 @@
     assertEquals(Collections.singleton(project.getFile("pom.xml")), registry.getDependents(parentCapability, false));
   }
 
+  @Test
   public void testMultiRefreshKeepsCapabilities() throws IOException, CoreException, InterruptedException {
     IProject dependentProject = createExisting("dependent", "resources/projects/dependency/dependent", true);
     IProject dependencyProject = createExisting("dependency", "resources/projects/dependency/dependency", true);
@@ -87,6 +89,7 @@
   }
 
   @Ignore(value = "This test doesn't manage to reproduce Bug 547172 while similar manual steps do lead to an error")
+  @Test
   public void testInvalidParent() throws IOException, CoreException, InterruptedException {
     IProject childProject = importProject("invalidParent", "resources/projects/invalidParent/child/", new ProjectImportConfiguration());
     waitForJobsToComplete(monitor);
diff --git a/org.eclipse.m2e.tests.common/src/org/eclipse/m2e/tests/common/AbstractLifecycleMappingTest.java b/org.eclipse.m2e.tests.common/src/org/eclipse/m2e/tests/common/AbstractLifecycleMappingTest.java
index 684982d..cd05f23 100644
--- a/org.eclipse.m2e.tests.common/src/org/eclipse/m2e/tests/common/AbstractLifecycleMappingTest.java
+++ b/org.eclipse.m2e.tests.common/src/org/eclipse/m2e/tests/common/AbstractLifecycleMappingTest.java
@@ -13,6 +13,8 @@
 
 package org.eclipse.m2e.tests.common;
 
+import static org.junit.Assert.assertTrue;
+
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -21,6 +23,9 @@
 import java.util.List;
 import java.util.Map;
 
+import org.junit.After;
+import org.junit.Before;
+
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
@@ -53,7 +58,8 @@
   protected IProjectConfigurationManager projectConfigurationManager;
 
   @Override
-  protected void setUp() throws Exception {
+  @Before
+  public void setUp() throws Exception {
     super.setUp();
 
     mavenProjectManager = MavenPlugin.getMavenProjectRegistry();
@@ -61,7 +67,8 @@
   }
 
   @Override
-  protected void tearDown() throws Exception {
+  @After
+  public void tearDown() throws Exception {
     projectConfigurationManager = null;
     mavenProjectManager = null;
 
diff --git a/org.eclipse.m2e.tests.common/src/org/eclipse/m2e/tests/common/AbstractMavenProjectTestCase.java b/org.eclipse.m2e.tests.common/src/org/eclipse/m2e/tests/common/AbstractMavenProjectTestCase.java
index 0e811e6..d8cbfde 100644
--- a/org.eclipse.m2e.tests.common/src/org/eclipse/m2e/tests/common/AbstractMavenProjectTestCase.java
+++ b/org.eclipse.m2e.tests.common/src/org/eclipse/m2e/tests/common/AbstractMavenProjectTestCase.java
@@ -13,6 +13,11 @@
 
 package org.eclipse.m2e.tests.common;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.fail;
+
 import java.io.File;
 import java.io.FileFilter;
 import java.io.FileInputStream;
@@ -20,7 +25,6 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.Field;
-import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -30,7 +34,9 @@
 import java.util.List;
 import java.util.Set;
 
-import junit.framework.TestCase;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.rules.TestName;
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
@@ -65,11 +71,9 @@
 
 import org.eclipse.m2e.core.MavenPlugin;
 import org.eclipse.m2e.core.embedder.IMavenConfiguration;
-import org.eclipse.m2e.core.embedder.IMavenExecutionContext;
 import org.eclipse.m2e.core.embedder.MavenModelManager;
 import org.eclipse.m2e.core.internal.IMavenConstants;
 import org.eclipse.m2e.core.internal.MavenPluginActivator;
-import org.eclipse.m2e.core.internal.embedder.AbstractRunnable;
 import org.eclipse.m2e.core.internal.embedder.MavenImpl;
 import org.eclipse.m2e.core.internal.lifecyclemapping.LifecycleMappingFactory;
 import org.eclipse.m2e.core.internal.preferences.MavenConfigurationImpl;
@@ -89,7 +93,7 @@
 
 
 @SuppressWarnings("restriction")
-public abstract class AbstractMavenProjectTestCase extends TestCase {
+public abstract class AbstractMavenProjectTestCase {
 
   public static final int DELETE_RETRY_COUNT = 10;
 
@@ -99,6 +103,9 @@
 
   protected IWorkspace workspace;
 
+  @Rule
+  public TestName name = new TestName();
+
   protected File repo;
 
   protected ProjectRegistryRefreshJob projectRefreshJob;
@@ -109,10 +116,9 @@
 
   private String oldUserSettingsFile;
 
-  protected void setUp() throws Exception {
-    System.out.println("TEST-SETUP: " + getName());
-
-    super.setUp();
+  @Before
+  public void setUp() throws Exception {
+    System.out.println("TEST-SETUP: " + name.getMethodName());
 
     workspace = ResourcesPlugin.getWorkspace();
     mavenConfiguration = MavenPlugin.getMavenConfiguration();
@@ -153,21 +159,17 @@
     FilexWagon.setRequestFilterPattern(null, true);
   }
 
-  protected void tearDown() throws Exception {
-    try {
-      waitForJobsToComplete();
-      WorkspaceHelpers.cleanWorkspace();
+  public void tearDown() throws Exception {
+    waitForJobsToComplete();
+    WorkspaceHelpers.cleanWorkspace();
 
-      // Restore the user settings file location
-      mavenConfiguration.setUserSettingsFile(oldUserSettingsFile);
+    // Restore the user settings file location
+    mavenConfiguration.setUserSettingsFile(oldUserSettingsFile);
 
-      projectRefreshJob.wakeUp();
-      setAutoBuilding(false);
-      setAutomaticallyUpdateConfiguration(false);
-      FilexWagon.reset();
-    } finally {
-      super.tearDown();
-    }
+    projectRefreshJob.wakeUp();
+    setAutoBuilding(false);
+    setAutomaticallyUpdateConfiguration(false);
+    FilexWagon.reset();
   }
 
   /**
@@ -602,60 +604,4 @@
         null);
   }
 
-  @Override
-  public void runTest() throws Throwable {
-    if(!requiresMavenExecutionContext()) {
-      super.runTest();
-    } else {
-      @SuppressWarnings("serial")
-      class WrappedThrowable extends RuntimeException {
-        public WrappedThrowable(Throwable ex) {
-          super(ex);
-        }
-      }
-      try {
-        MavenPlugin.getMaven().execute(new AbstractRunnable() {
-          @SuppressWarnings("synthetic-access")
-          protected void run(IMavenExecutionContext context, IProgressMonitor monitor) {
-            try {
-              AbstractMavenProjectTestCase.super.runTest();
-            } catch(Throwable ex) {
-              throw new WrappedThrowable(ex);
-            }
-          }
-        }, monitor);
-      } catch(WrappedThrowable e) {
-        throw e.getCause();
-      }
-    }
-  }
-
-  private boolean requiresMavenExecutionContext() {
-    String fName = getName();
-    if(fName != null) {
-      try {
-        Method runMethod = getClass().getMethod(fName);
-        RequireMavenExecutionContext ann = runMethod.getAnnotation(RequireMavenExecutionContext.class);
-        if(ann != null) {
-          return ann.require();
-        }
-      } catch(SecurityException ex) {
-        // fall through
-      } catch(NoSuchMethodException ex) {
-        // fall through
-      }
-    }
-
-    Class<?> clazz = getClass();
-    do {
-      RequireMavenExecutionContext ann = clazz.getAnnotation(RequireMavenExecutionContext.class);
-      if(ann != null) {
-        return ann.require();
-      }
-      clazz = clazz.getSuperclass();
-    } while(clazz != null);
-
-    return false;
-  }
-
 }
